Проверка сценария оболочки с помощью моделирования терминала

Я разрабатываю общий сценарий bash, который может быть выполнен в разных дистрибутивах.

У меня есть только виртуальная машина CentOS, и мне было бы интересно протестировать мой скрипт на виртуальном терминале (онлайн или как программное обеспечение, без письменного доступа, просто умеющего читать некоторые стандартные файлы из ОС), но, как я запускаю его в другом distro (возможность переключения между дистрибутивом).

Один пример – сделать обнаружение дистрибутива, и я не знаю, какая будет ожидаемая информация, которую я получу от другого дистрибутива.

Например, на моей виртуальной машине я получаю:

$> test.sh Your linux distribution is: CentOS $> 

Я просто не знаю, что будет результатом RedHat, Ubuntu, Debian и т. Д.

Код для test.sh находится здесь .

Эта идея исходит от разработки интерфейса, где у вас есть аналогичные инструменты для тестирования ваших веб-страниц в разных браузерах, не имея на самом деле все. Я знаю, что ОС довольно сложна, чем просто браузер, но вопрос остается после нескольких поисков в Google.

Как сказал Крис Даун в комментариях, обнаружение распределения действительно плохой способ обнаружения системы пакетов. Например, вы упомянули «REDHAT + CENTOS + FEDORA = rpm + yum support, а DEBIAN + UBUNTU = deb + apt-get». Хорошо, что насчет Mint, LMDE, Kali, Backtrack, Crashbang и всех других дистрибутивов с использованием dpkg / apt-get ? Или Scientific Linux, Yellow Dog Linux и Oracle Linux, все из которых используют yum ? Не говоря уже о других дистрибутивах на основе RPM, которые не используют yum такие как SuSe, OpenSuSe, Mandriva Linux, Rosa Linux или Mageia?

Лучше всего было бы найти инструмент, который вы хотите использовать. Я также предлагаю вам использовать систему rpm напрямую, а не yum , зачем ограничивать себя дистрибутивами на основе 6 RPM, которые используют yum ?

Я бы просто протестировал, если система, которую вы обнаружите, использует rpm или dpkg для управления своими пакетами:

 if [ $(rpm -qa 2>/dev/null | wc -l ) -gt 10 ]; then system="rpm" elif [ $(dpkg -l 2>/dev/null | wc -l ) -gt 10 ]; then system="dpkg" else system="unk" fi echo $system 

Поскольку rpm можно установить на дистрибутивы на основе dpkg и наоборот , я проверяю, установлено ли более 10 пакетов с каждым инструментом.

Для лучшего способа определить фактическое распределение см. Здесь принятый ответ, который должен дать вам представление о том, насколько он сложный. Вы действительно хотите написать тесты, связанные с дистрибутивом, для десятков дистрибутивов, когда вы легко можете просто определить используемую систему упаковки?

питон

 #!/usr/bin/env python import platform """ Fingerprint the following operating system * Mac OS X * Ubuntu * Red Hat/CentOS * FreeBSD * SunOS """ class OpSysType(object): """ Determine OS type using platform module """ def __getattr__(self,attr): if attr == "osx": return "Mac OS X" elif attr == "rhel": return "redhat" elif attr == "ubu": return "ubuntu" elif attr == "fbsd": return "FreeBSD" elif attr == "sun": return "SunOS" elif attr == "unknown": return "unknown" else: raise AttributeError,attr def linuxtype(self): """ Use various method to determine Linux Type """ if platform.dist()[0] == self.rhel: return self.rhel elif platform.uname()[1] == self.ubu: return self.ubu else: return self.unknown def queryos(self): p = platform.system() if p == "Darwin": return self.osx elif p == "Linux": return self.linuxtype() elif p == self.sun: return self.sun elif p == self.fbsd: return self.fbsd def fingerprint(): type = OpSysType() print type.queryos() if __name__ == '__main__': fingerprint() 

Вы можете легко сделать это с помощью uname:

 OS=`uname` if [ "$OS" == "Linux" ];then distro="Linux" elif[ "$OS" == "SunOS" ];then distro="Solaris" else echo "CRITICAL - Unknown os" exit 2