Ao usar && e sudo no primeiro comando, o segundo comando é executado como sudo também?

55

Se eu executar um comando.

sudo some-command && some-other-command

O segundo comando está sendo executado com sudo previlege também?

    
por user974407 10.06.2015 / 13:32

6 respostas

102

TL; DR: NÃO

O primeiro comando é

sudo some-command

O segundo comando é

some-other-command

O comando sudo recebe o seguinte comando e o executa com privilégios elevados. O && , no entanto, não pertence a um comando e é interpretado pelo shell, antes de executar o primeiro comando. Diz ao bash para primeiro executar o primeiro comando e, no sucesso, o segundo.

Portanto, o sudo não sabe sobre o && some-other command . Quando o processo elevado termina, o bash pega seu valor de retorno e, em seguida, executa o outro comando, que novamente não conhece o primeiro.

Isso pode ser demonstrado facilmente:

$ sudo whoami && whoami
root
username

Para alcançar o que você deseja, você pode iniciar um bash elevado e permitir que ele execute os dois comandos:

$ sudo bash -c 'whoami && whoami'
root
root

Portanto, ambos os comandos são executados como root, já que todo o processo descrito acima é executado em um processo elevado, ou seja, a sessão bash é iniciada com este comando, que sai imediatamente após o término. Ainda assim, os dois whoami s não sabem da existência um do outro.

Isto não serve para nenhum propósito, mas para esta demonstração, a maneira mais fácil é simplesmente fazer

sudo some-command && sudo some-other-command
    
por s3lph 10.06.2015 / 13:44
18

Não. Alguns exemplos que fazem isso são:

sudo some-command && sudo some-other-command 
sudo sh -c "some-command && some-other-command"

ou se você quiser comandos de aninhamento, você pode até fazer:

sudo bash <<"EOF"
some-command
some-other-command
sudo bash <<"EOF2"
    some-command2
    some-other-command2
EOF2
EOF
  • O segundo usa outro shell.
  • Lembre-se de que, quando você usa 'ou' na segunda versão, você precisa escapar dos comandos ou parâmetros desse comando (por exemplo, \ 'ou \ ") para que ele possa se tornar complexo muito rapidamente.
por Rinzwind 10.06.2015 / 13:41
4

Não, você deve escrever sudo duas vezes ou fazer algo como

sudo bash -c 'foo && bar'
    
por davidbaumann 10.06.2015 / 13:41
2

&& significa que o comando do lado direito (segundo) só será executado apenas se o comando com o lado contrário (primeiro) tiver êxito, ou seja, o código de saída $? is 0 .

Os dois comandos são diferentes entre si e serão executados em seus próprios ambientes, de modo que o segundo comando não será executado com privilégio sudo .

Isso vai deixar você claro:

$ sudo whoami && whoami 
root
foobar
    
por heemayl 10.06.2015 / 13:49
0

Na linha de comando, quando você vê

$ command one && command two

a intenção típica é executar o comando que segue o & amp; & amp; somente se o primeiro comando for bem sucedido.

O outro comando é executado como sudo também?

absolutamente não, isso é apenas escrever dois comandos consecutivos, este & amp; & amp; não dá nenhum privilégio adicionado a um comando. É apenas um separador .

Para provar isso, vamos dar um exemplo.

touch fileA fileB 

Eu criei dois arquivos fileA e fileB. Agora vou rodar o comando

sudo chown test:test fileA && chown test:test fileB

Estou mudando o proprietário do usuário e do grupo desses arquivos para o teste de nome do usuário e do grupo. Agora o primeiro comando deve rodar enquanto o outro?

A saída é:

chown: changing ownership of 'fileB': Operation not permitted

Portanto, o comando não foi executado, pois precisa de sudo e, embora possamos concluir que & amp; & amp; não é um substituto do segundo sudo

    
por Maythux 10.06.2015 / 13:42
0

NÃO, e o seguinte foi uma vez muito comumente usado como macro.

sudo reboot && exit

Quase todo mundo deveria ter feito isso pelo menos uma vez

sudo apt-get update && sudo apt-get upgrade

Assim, é uma ótima pergunta de entrevista "mickey mouse".

Isto é tão facilmente testado que a questão pode ser suspeita de um exercício de preenchimento de estatísticas.

    
por mckenzm 13.06.2015 / 20:19

Tags