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


64

Se eu executar um comando.

sudo some-command && some-other-command

O segundo comando também está sendo executado com o sudoprevilege?

Respostas:


110

TL; DR: NÃO


O primeiro comando é

sudo some-command

O segundo comando é

some-other-command

O comando sudopega 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. Ele diz ao bash para executar primeiro o primeiro comando e, com sucesso, o segundo.

Então o sudonão sabe sobre o && some-other command. Quando o processo elevado termina, o bash recebe seu valor de retorno e depois 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 deseja, você pode iniciar um bash elevado e executar os dois comandos:

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

Portanto, agora, ambos os comandos são executados como raiz, pois 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 whoaminão sabem da existência um do outro.

Isso 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

29
+1 para o whoamiexemplo.
Carl H


Essa demonstração é muito legal! Tenho que pensar nisso ao tentar ensinar sudo para os outros na próxima vez!
Fragmentation Needed

20

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ê deseja aninhar comandos, 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, precisa escapar dos comandos ou parâmetros desse comando (por exemplo, \' ou \") para que possam se tornar complexos muito rapidamente.

Terceiro método não funciona: $ sudo -s -- whoami && whoamiroot username
BartekChom 10/15/15

@BartekChom desculpe eu perdi as citações sobre aquele
Rinzwind

sudo -s -- "whoami && whoami"parece dar comando não encontrado, mais ou menos o mesmo que comando "whoami && whoami". Como usar esta construção com &&? Vejo que sudo -s cd ..não dá erro ao contrário sudo cd ...
BartekChom

Eu aprendi algo novo hoje sudo bash <<"EOF":! Obrigado! :-)
Fabby

4

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

sudo bash -c 'foo && bar'

2

&&significa que o comando do lado direito (segundo) só será executado se o comando do lado contrário (primeiro) for bem-sucedido, ou seja, o código de saída $?é 0.

Os dois comandos são diferentes um do outro e serão executados em seus próprios ambientes, portanto o segundo comando não será executado com sudoprivilégios.

Isso vai deixar você claro:

$ sudo whoami && whoami 
root
foobar

1

NÃO, e o seguinte já foi muito comumente macro.

sudo reboot && exit

Quase todo mundo deveria ter feito isso pelo menos uma vez

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

Portanto, é uma ótima pergunta para a entrevista "mickey mouse".

Isso é tão facilmente testado que a pergunta pode ser suspeita de um exercício de preenchimento estatístico.


0

Na linha de comando, quando você vê

$ command one && command two

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

O outro comando também é executado como sudo?

absolutamente não, isso é como escrever dois comandos consecutivos; este && não oferece privilégios adicionais a um comando. É apenas um separador .

Para provar isso, vamos dar um exemplo.

touch fileA fileB 

Criei dois arquivos fileA e fileB. Agora eu vou executar o comando

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

Estou alterando o usuário e o proprietário do grupo desses arquivos para teste de nome de usuário e grupo. Agora, o primeiro comando deve ser executado, e o outro?

A saída é:

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

Portanto, o comando não foi executado, pois é necessário sudoe, embora possamos concluir que o&& não substitui o segundosudo

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.