Teste de script de shell por meio de simulação de terminal

1

Estou desenvolvendo um script bash genérico que pode ser executado em diferentes distros.

Eu tenho apenas uma máquina virtual do CentOS e estaria interessado em testar meu script em um terminal virtual (on-line ou como um software, sem acesso à escrita, apenas capaz de ler alguns arquivos padrão do sistema operacional), mas como estou executando em uma distro diferente (possibilidade de alternar entre distro).

Um exemplo é fazer uma detecção de distro e não sei qual será a informação esperada que receberei de outra distro.

Por exemplo, na minha VM, obtenho:

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

Eu só não sei qual será o resultado em RedHat, Ubuntu, Debian, etc ...

O código para o test.sh é aqui .

Esta ideia vem do desenvolvimento front-end, onde você tem ferramentas semelhantes para testar suas páginas da web em diferentes navegadores, sem ter todos realmente instalados. Eu sei que um sistema operacional é muito mais complexo do que apenas um navegador, mas a questão permanece após algumas pesquisas no Google.

    
por рüффп 09.01.2014 / 11:33

3 respostas

2

Como Chris Down disse nos comentários, detectar a distribuição é realmente uma maneira ruim de detectar o sistema de pacotes. Por exemplo, você mencionou "REDHAT + CENTOS + FEDORA = suporte para rpm + yum e DEBIAN + UBUNTU = deb + apt-get". OK, e quanto a Mint, LMDE, Kali, Backtrack, Crashbang e todas as outras distros usando dpkg / apt-get ? Ou Scientific Linux, Yellow Dog Linux e Oracle Linux, todos usam yum ? Sem mencionar outras distribuições baseadas em RPM que não usam yum como SuSe, OpenSuSe, Mandriva Linux, Rosa Linux ou Mageia?

Uma maneira muito melhor seria detectar a ferramenta que você deseja usar. Também sugiro que você use o sistema rpm diretamente, em vez de yum , por que limitar-se às distribuições baseadas em 6 RPM que usam yum ?

Eu simplesmente testaria se o sistema em que você se encontra usa rpm ou dpkg para gerenciar seus pacotes:

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

Como rpm pode ser instalado em distribuições com base em dpkg e vice-versa , estou testando se há mais de 10 pacotes instalados com cada ferramenta.

Para obter uma maneira melhor de detectar a distribuição real, consulte a resposta aceita aqui , que deve lhe dar uma ideia de quão complicado é. Você realmente quer escrever testes específicos de distro para dúzias de distros quando você poderia facilmente detectar o sistema de empacotamento usado em seu lugar?

    
por 09.01.2014 / 12:26
2

Python

#!/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()
    
por 09.01.2014 / 13:27
-1

Você pode fazer facilmente apenas com o uname:

OS='uname'
  if [ "$OS" == "Linux" ];then
    distro="Linux"
elif[ "$OS" == "SunOS" ];then
    distro="Solaris"
else
    echo "CRITICAL - Unknown os"
    exit 2
    
por 09.01.2014 / 13:10