Qual é o propósito de "true" no bash "se sudo true; então"

20

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
Matt Parkins
fonte
2
Se você vai recusar a votação, poderia explicar o que posso fazer para melhorar a pergunta? Este não é o site de estouro certo?
Matt Parkins
4
Não tenho certeza de onde vêm os votos negativos; você está tentando negar a declaração ou anulá- la? Você diz que quer se livrar do verdadeiro / eco e do "mais", então qual é o seu objetivo final?
Jeff Schaller
11
consulte stackoverflow.com/q/10552711/537980
ctrl-alt-delor 26/03
11
@ ctrl-alt-delor seguindo esse link, parece que tudo o que preciso fazer é colocar um ponto de exclamação na frente do sudo e depois remover o eco e o resto, e agora eu testei, isso funciona, obrigado.
Matt Parkins
2
De passagem, você provavelmente deve redirecionar a mensagem de erro para o fluxo de erros:echo "Aborting script" >&2
Toby Speight

Respostas:

38

trueno 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;

true
echo $? # 0
false
echo $? #1

if sudo truenão é equivalente a if sudo == true. if sudo trueestá executando o trueprograma usando sudoe verificando o código de saída.

Assim sendo:

if sudo false; thenestá executando o programa falsecomo sudo. O retorno será sempre falso.

if sudo true == falseirá executar o programa truecom os argumentos ==e falseusando sudo. Obviamente, isso não é o que você deseja.

if [!(sudo true)] é uma sintaxe inválida.

O que você provavelmente está procurando é

if ! sudo true;
JShorthouse
fonte
12
Como uma correção ligeiramente pedante da primeira frase: no bash , truee falsesã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 trueestará executando o programa independente, não o bash embutido.
IMSoP 26/03
31
PS: meus resumos favoritos truee falseos títulos em suas páginas de manual: true - do nothing, successfullyefalse - do nothing, unsuccessfully
IMSoP
3
@IMSoP Isso é profundo.
brainplot 27/03
2
Se truenã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.
nigel222 27/03
2
No ATV SYSV Unix, "true" era um shell script / bin / true, que consistia em um grande aviso de direitos autorais nos comentários ... e nada mais.
Lee Daniel Crocker
21

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 trueprograma, conforme explicado na resposta aceita.

Mehrdad
fonte
11
Essencialmente, isso. A alternativa poderia ser verificar se o usuário está no grupo de sudoers, mas apenas correr sudo truetambém é fácil, embora um pouco invasivo.
Sergiy Kolodyazhnyy 27/03
3
Observe que isso também precisa sudoser 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.)
Mehrdad 27/03
11
O OP quer desistir, se você não pode sudo, e se livrar de duas linhas, em vez de ter uma outra pessoa seguindo um noop.
mckenzm 27/03
2
E, inversamente, você pode também ser capaz de sudosem estar no grupo sudoers se você (pessoalmente ou como um membro de algum outro grupo) estão listadas na /etc/sudoers. Mas mesmo sudo truenão é infalível, pois o sudoacesso pode ser concedido apenas para comandos específicos; portanto, você pode sudo 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 executar sudo.
Dave Sherohman 27/03
2
Além disso, você pode estar no sudoersgrupo e não conseguir, sudoporque o sudoersgrupo não está listado no sudoersarquivo. Um grupo com as quatro letras sudoem 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 usando sudo.
jrw32982 apoia Monica em 27/03
5

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.

Luciano Andress Martini
fonte
11
Os únicos comandos que executam o sudo existem sudo truee sudo -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.
ilkkachu 26/03
Eu escrevi: "Portanto, neste caso, se eles precisam executar algum comando com o sudo, ele verifica primeiro no início, solicitando a senha apenas uma vez."
Luciano Andress Martini