Si je tape sudo
au début d'une ligne dans bash, cela s'applique-t-il au reste des commandes?
En d'autres termes, est-ce:
sudo foo | foo2 | foo3
équivalent à ceci:
sudo foo | sudo foo2 | sudo foo3
Afin de vous convaincre que sudo
ne s'exécute qu'en utilisant la première commande fournie, et que tout le reste après le premier canal est exécuté comme votre ID utilisateur d'origine, vous pouvez utiliser cette chaîne de commandes inutile pour le voir.
$ sudo whoami > file1 | whoami > file2 | whoami > file3
Ensuite, lorsque vous cat
ces fichiers, vous verrez les noms d'utilisateur suivants:
$ cat file{1..3}
root
saml
saml
Cependant, si vous exécutez un sous-shell:
$ sudo sh -c 'whoami > file4 | whoami > file5 | whoami > file6'
Ensuite, lorsque vous cat
ces fichiers, vous verrez les noms d'utilisateur suivants:
$ cat file{4..6}
root
root
root
Votre commentaire sur sudo foo1 | sudo foo2 ...
ne fonctionnerait jamais, car la sortie de sudo foo1
serait alimentée sudo foo2
. En utilisant mes whoami
exemples, cela montre que cette chaîne de commandes ne fait rien.
$ sudo whoami | sudo whoami | sudo whoami
root
Le 1er a couru, mais les 2e et 3e ne font rien car ils ne sont pas équipés pour prendre des entrées. Je pense plutôt que vous vouliez écrire quelque chose comme ceci:
$ sudo whoami;sudo whoami;sudo whoami
root
root
root
Ce qui équivaut à l'exécuter 3 fois sur 3 invites de commande différentes. Ou ca:
$ sudo whoami && sudo whoami && sudo whoami
root
root
root
Mais ne faites jamais ce dernier. Il appartient à la section suivante.
Ce n'est pas mon meilleur travail, mais ce sont d'autres façons dont vous auriez pu me voir exécuter plusieurs commandes à l'aide sudo
. Je ne les montre ici que pour ne pas enseigner afin que d'autres les fassent nécessairement !
$ echo "echo 1 > /proc/sys/vm/drop_caches" | sudo sh
Comment ça fonctionne?
Le programme echo à l'intérieur des guillemets doubles s'exécute en tant que root, à cause de sudo, mais le shell qui redirige la sortie d'echo vers le fichier root uniquement fonctionne toujours comme vous. Votre shell actuel effectue la redirection avant le sudo
démarrage.
$ sudo tee /proc/sys/vm/drop_caches <<<1
Comment ça fonctionne?
Cette méthode exécute le tee
programme en tant que root ET prend l'entrée à partir d'une chaîne here qui s'exécute avant d' sudo
appeler la tee
commande.
# this way
$ sudo -s -- 'whoami'
# or this way
sudo -s -- sh -c 'whoami;whoami'
Comment ça fonctionne?
Ceux-ci peuvent sembler différents, mais ils font vraiment la même chose. Lors de l'utilisation du -s
commutateur, sudo
exécutera une seule commande. Je ne pourrais jamais comprendre s'il y avait un moyen d'y échapper. Rien de tel ne fonctionnerait.
# this
$ sudo -s -- 'whoami;whoami'
# or this
$ sudo -s -- 'whoami\;whoami'
Mais en regardant la page de manuel, le -s
commutateur dit qu'il passera une seule commande au shell défini dans l'entrée utilisateur du /etc/passwd
fichier. Nous utilisons donc une astuce dans la deuxième forme, en passant principalement le shell, un autre shell ( sh -c
) dans lequel nous "backdoor" notre chaîne de commandes à exécuter.
Il y en a plus mais je m'arrête ici. Celles-ci ne sont que pour vous montrer ce que vous pouvez faire si vous comprenez les choses, mais ne doivent pas nécessairement enchaîner les ordures ensemble parce que vous le pouvez, vous devriez essayer de garder vos pragmas de code à un niveau logique qui a du sens afin que les autres puissent à la fois comprendre et prendre en charge eux à l'avenir.
Non, dans votre exemple, seul foo
est exécuté par sudo
. Si vous souhaitez exécuter toutes les commandes avec des privilèges augmentés, vous pouvez générer un shell:
sudo sh -c 'foo | foo2 | foo3'