Eu hackeei esse script do bash, que testa se o usuário tem privilégios de superusuário e, se não, ele pede. Por fim, estou tentando inverter a segunda instrução 'if' para que eu possa remover as duas linhas a seguir (o eco "senha ok" e o resto na linha seguinte)
# Root user only
if [[ "$EUID" != 0 ]]; then
sudo -k # make sure to ask for password on next sudo
if sudo true; then
echo "Password ok"
else
echo "Aborting script"
exit 1
fi
fi
echo "do my ops"
O propósito de "verdadeiro" na quarta linha é apenas uma declaração nula?
Preciso inverter o teste na quarta linha, como faço? Aqui está o que eu tentei:
if sudo false; then
if sudo true == false; then
if [!(sudo true)]; then
echo "Aborting script" >&2
Respostas:
true
no bash não é uma palavra-chave, é um programa que sai instantaneamente com um código de saída bem-sucedido. Da mesma forma,false
é um programa que sai com um código de saída sem êxito.Você pode tentar isso executando os dois programas no seu terminal e lendo a
$?
variável que contém o código de saída do último programa;if sudo true
não é equivalente aif sudo == true
.if sudo true
está executando otrue
programa usandosudo
e verificando o código de saída.Assim sendo:
if sudo false; then
está executando o programafalse
como sudo. O retorno será sempre falso.if sudo true == false
irá executar o programatrue
com os argumentos==
efalse
usandosudo
. Obviamente, isso não é o que você deseja.if [!(sudo true)]
é uma sintaxe inválida.O que você provavelmente está procurando é
fonte
true
efalse
são "embutidos", comandos interpretados diretamente pelo shell; em sistemas tipo Unix em geral , eles também existem como programas independentes no sistema de arquivos. A diferença não importa muito aqui, mas, tanto quanto eu sei,sudo true
estará executando o programa independente, não o bash embutido.true
efalse
os títulos em suas páginas de manual:true - do nothing, successfully
efalse - do nothing, unsuccessfully
true
não existisse, o código da pergunta mostra por que é necessário inventá-lo! É um programa mínimo que só pode falhar se o sistema ligado estiver realmente funcionando. Portanto, pode-se usá-lo para estabelecer se as credenciais de acesso estão corretas.Eu sinto que a resposta aceita realmente não respondeu à sua pergunta?
O objetivo de fazer isso é verificar se você pode realmente
sudo
.O modo como essa verificação é realizada é através do
true
programa, conforme explicado na resposta aceita.fonte
sudo true
também é fácil, embora um pouco invasivo.sudo
ser instalado, para que as verificações não sejam totalmente equivalentes ... você pode estar no grupo sudoers e ainda não conseguir fazer o sudo. (Isso pode surgir especialmente se você estiver, por exemplo, escrevendo um script para configurar uma nova imagem a partir de um pacote mínimo de rootfs, que pode não ter sudo.)sudo
sem estar no grupo sudoers se você (pessoalmente ou como um membro de algum outro grupo) estão listadas na/etc/sudoers
. Mas mesmosudo true
não é infalível, pois osudo
acesso pode ser concedido apenas para comandos específicos; portanto, você podesudo true
, mas não ésudo something_else
, ou vice-versa. Não há outra maneira de testar a vestimenta, a não ser tentando executar o comando com o qual você deseja executarsudo
.sudoers
grupo e não conseguir,sudo
porque osudoers
grupo não está listado nosudoers
arquivo. Um grupo com as quatro letrassudo
em seu nome não é uma indicação válida de se um usuário desse grupo pode ou não fazer algo em particular ou qualquer coisa que esteja usandosudo
.Como eu vejo neste script. É apenas verificar se o sudo está ativado, é isso.
true apenas retorna true.
Portanto, nesse caso, se eles precisam executar qualquer comando com o sudo, ele verifica primeiro no início, solicitando a senha apenas uma vez.
A condição funciona assim: se o sudo estiver executando o comando true corretamente, ele retornará true para a condição if, então o sudo será ativado e o usuário digitou a senha corretamente, caso contrário, você digitou a senha incorretamente ou o sudo não está ativado, o script não deve continuar.
Os outros comandos não precisam solicitar a senha do sudo, porque sua autenticação é bem-sucedida na primeira vez (mas isso depende da configuração do sudo, portanto, esses scripts dependem muito da configuração do ambiente)
A 'senha de eco ok' também demonstra isso. o script shell não pedirá mais a senha.
fonte
sudo true
esudo -k
. O último explicitamente não requer uma senha. Nenhum dos outros comandos no script é executado via sudo; portanto, é claro que eles não exigirão senhas, independentemente de a autenticação ter sido bem-sucedida na primeira vez.