web-dev-qa-db-fra.com

Lorsque && et Sudo sont utilisés dans la première commande, la deuxième commande est-elle exécutée également en tant que Sudo?

Si je lance une commande.

Sudo some-command && some-other-command

La deuxième commande est-elle exécutée avec Sudoprevilege également?

63
user974407

TL; DR: NO


La première commande est

Sudo some-command

La deuxième commande est

some-other-command

La commande Sudoaccepte la commande suivante et l'exécute avec des privilèges élevés. Le && n'appartient toutefois pas à une commande et est interprété par le shell avant l'exécution de la première commande. Il demande à bash d’exécuter la première commande en premier, et en cas de succès la deuxième.

Donc, Sudone connaît pas le && some-other command. Lorsque le processus élevé se termine, bash prend sa valeur de retour, puis exécute l'autre commande, qui à nouveau ne connaît pas la première.

Cela peut être démontré facilement:

$ Sudo whoami && whoami
root
username

Pour atteindre ce que vous voulez, vous pouvez démarrer un bash élevé et le laisser exécuter les deux commandes:

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

Alors maintenant, les deux commandes sont exécutées en tant que root, car l’ensemble du processus décrit ci-dessus est exécuté dans un processus élevé, c’est-à-dire que la session bash a démarré avec cette commande, qui se termine immédiatement à la fin. Néanmoins, les deux whoaminame__s ne connaissent pas l'existence de chacun.

Cela ne convient à rien, mais pour cette démonstration, le moyen le plus simple est simplement de faire

Sudo some-command && Sudo some-other-command
109
s3lph

Quelques exemples qui font cela sont:

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

ou si vous voulez des commandes de nid, vous pouvez même faire:

Sudo bash <<"EOF"
some-command
some-other-command
Sudo bash <<"EOF2"
    some-command2
    some-other-command2
EOF2
EOF
  • Le 2e utilise un autre shell.
  • Notez que lorsque vous utilisez 'ou "dans la 2ème version, vous devez échapper à ceux des commandes ou des paramètres de cette commande (c.-à-d. \' Ou \") pour que cela devienne complexe très rapidement.
19
Rinzwind

Non, vous devez écrire Sudo deux fois ou faire quelque chose comme:

Sudo bash -c 'foo && bar'
4
davidbaumann

&& signifie que la commande right sided (second) ne sera exécutée que si la commande lest sided (first) a abouti, c'est-à-dire que le code de sortie $? est 0.

Les deux commandes sont différentes et s'exécutent dans leurs propres environnements. Par conséquent, la deuxième commande ne fonctionnera pas avec le privilège Sudo.

Cela vous éclaircira:

$ Sudo whoami && whoami 
root
foobar
2
heemayl

NON, et ce qui suit était très communément une fois en macro.

Sudo reboot && exit

Presque tout le monde aurait dû le faire au moins ne fois

Sudo apt-get update && Sudo apt-get upgrade

Il s’agit donc d’une excellente question d’interview "mickey mouse".

Ceci est si facilement testé que la question peut être suspectée d’un exercice de remplissage de statistiques.

1
mckenzm

Sur la ligne de commande, quand vous voyez

$ command one && command two

l'intention typique est d'exécuter la commande qui suit le && seulement si la première commande est réussie.

L'autre commande est-elle exécutée sous le nom de Sudo?

absolument non, c'est comme écrire deux commandes consécutives, ceci && ne donne aucun privilège ajouté à une commande. c'est juste un séparateur.

Pour prouver cela, prenons un exemple.

touch fileA fileB 

J'ai créé deux fichiers fichierA et fichierB. Maintenant, je lance la commande

Sudo chown test:test fileA && chown test:test fileB

Je remplace l'utilisateur et le propriétaire du groupe de ces fichiers par un test d'utilisateur et de nom de groupe. Maintenant, la première commande devrait être exécutée, et l’autre?

La sortie est:

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

La commande n'a donc pas été exécutée car elle nécessite Sudoet nous pouvons toutefois en conclure que && ne remplace pas le deuxième Sudoname__.

0
Maythux