Se eu executar um comando.
sudo some-command && some-other-command
O segundo comando também está sendo executado com o sudo
previlege?
Se eu executar um comando.
sudo some-command && some-other-command
O segundo comando também está sendo executado com o sudo
previlege?
Respostas:
TL; DR: NÃO
O primeiro comando é
sudo some-command
O segundo comando é
some-other-command
O comando sudo
pega 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 sudo
nã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 whoami
nã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
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
$ sudo -s -- whoami && whoami
dároot
username
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 ..
.
sudo bash <<"EOF"
:! Obrigado! :-)
Não, você deve escrever sudo duas vezes ou fazer algo como
sudo bash -c 'foo && bar'
&&
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 sudo
privilégios.
Isso vai deixar você claro:
$ sudo whoami && whoami
root
foobar
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.
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.
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 sudo
e, embora possamos concluir que o&& não substitui o segundosudo
whoami
exemplo.