Bash - Teste para vários usuários

0

Estou tentando testar se o usuário atual, um entre dois, permitiu que os usuários iniciassem um processo, mas parece que não consigo fazer com que a multi-condição funcione corretamente:

test ($(whoami) != 'mpurcell' || $(whoami) != 'root')) && (echo "Cannot start script as non-ccast user..."; exit 1)

Existe uma maneira de testar vários usuários sem precisar inserir duas linhas, como esta:

test $(whoami) != 'mpurcell' && (echo "Cannot start script as non-ccast user..."; exit 1)
test $(whoami) != 'root' && (echo "Cannot start script as non-ccast user..."; exit 1)
    
por Mike Purcell 09.06.2012 / 00:00

3 respostas

4

bash 3.xe acima têm um operador de correspondência de expressão regular =~ disponível no [[operator

if [[ ! "$(whoami)" =~ ^(mpurcell|root)$ ]]
then
    echo "Go away" >&2
    exit 1
fi

etc ...

Eu estava lendo que as regras de cotação na expressão regular foram alteradas no bash 3.2 ou mais. O acima funciona no meu 3.2.25, você pode precisar citar se o seu bash é mais antigo.

    
por 09.06.2012 / 00:35
2

test é apenas um comando, então sua expressão é analisada da mesma forma que os argumentos de qualquer outro comando - significando que parênteses, canais, etc. devem ser escapados ou citados para funcionar (e para evitar problemas com isso, test usa -o em vez de || ). Se você está realmente usando o bash, ele tem uma expressão [[ ]] test que evita essas esquisitices.

Além disso, sua lógica de expressão está desativada. Você reporta o erro se o usuário atual não é mpurcell ou não é root; desde que o usuário atual não pode ser ambos, ele sempre irá errar. Tenho certeza que você quer um e lá.

Por fim, como você tem a parte echo ...; exit 1 entre parênteses, ela será executada em uma subshell e, portanto, o comando exit sairá da subshell, não do script. Para evitar isso, use { ... } em vez de parênteses.

Aqui está uma versão bash:

[[ $(whoami) != 'mpurcell' && $(whoami) != 'root' ]] && { echo "Cannot start script as non-ccast user..."; exit 1; }

E aqui está uma versão que deve funcionar em um shell POSIX genérico:

test "$(whoami)" != 'mpurcell' -a "$(whoami)" \!= 'root' && { echo "Cannot start script as non-ccast user..."; exit 1; }
    
por 09.06.2012 / 00:23
0

Experimente: [$ (whoami)! = 'mpurcell' -a $ (whoami)! = 'root'] & & (echo "Não é possível iniciar o script como usuário não-ccast ..."; sair 1)

    
por 09.06.2012 / 00:17

Tags