Lorsque vous utilisez && et sudo sur la première commande, la deuxième commande est-elle exécutée aussi en tant que sudo?


64

Si je lance une commande.

sudo some-command && some-other-command

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

Réponses:


110

TL; DR: NO


La première commande est

sudo some-command

La deuxième commande est

some-other-command

La commande sudoprend la commande suivante et l'exécute avec des privilèges élevés. Le &&, cependant, n'appartient 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 d’abord la première commande et, en cas de succès, la seconde.

Donc, le sudone sait pas à propos de la && 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 le processus entier 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. Pourtant, les deux whoamine se connaissent pas.

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

29
+1 pour l' whoamiexemple.
Carl H


Cette démonstration est vraiment cool! Je dois y penser en essayant d'apprendre le sudo à d'autres la prochaine fois!
Fragmentation nécessaire

20

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 2ème 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 très rapidement complexe.

Troisième méthode ne fonctionne pas: $ sudo -s -- whoami && whoamidonneroot username
BartekChom

@BartekChom désolé j'ai manqué les citations sur celui-là
Rinzwind

sudo -s -- "whoami && whoami"semble donner une commande non trouvée, plus ou moins la même chose qu'une commande "whoami && whoami". Comment utiliser cette construction avec &&? Je vois que cela sudo -s cd ..ne donne pas d'erreur par opposition à sudo cd ...
BartekChom

J'ai appris quelque chose de nouveau aujourd'hui sudo bash <<"EOF":! Merci! :-)
Fabby

4

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

sudo bash -c 'foo && bar'

2

&&signifie que la commande côté droit (deuxième) ne sera exécutée que si la commande dont le côté inférieur (premier) a abouti, c'est-à-dire que le code de sortie l' $?est 0.

Les deux commandes sont différentes l'une de l'autre et s'exécutent dans leurs propres environnements. La deuxième commande ne s'exécutera donc pas avec des sudoprivilèges.

Cela vous éclaircira:

$ sudo whoami && whoami 
root
foobar

1

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 une 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.


0

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.

Est-ce que l’autre commande s’exécute aussi en tant que sudo?

absolument non, c'est juste 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

Donc, la commande n’a pas été exécutée car elle a besoin sudoet bien que nous puissions en conclure que && ne remplace pas la secondesudo

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.