Si je tape «sudo» au début d'une ligne, cela s'applique-t-il au reste des commandes?

10

Si je tape sudoau 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
Mike B
la source

Réponses:

11

Afin de vous convaincre que sudone 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.

Exemple 1

$ sudo whoami > file1 | whoami > file2 | whoami > file3

Ensuite, lorsque vous catces fichiers, vous verrez les noms d'utilisateur suivants:

$ cat file{1..3}
root
saml
saml

Exemple # 2

Cependant, si vous exécutez un sous-shell:

$ sudo sh -c 'whoami > file4 | whoami > file5 | whoami > file6'

Ensuite, lorsque vous catces fichiers, vous verrez les noms d'utilisateur suivants:

$ cat file{4..6}
root
root
root

Exemple # 3

Votre commentaire sur sudo foo1 | sudo foo2 ...ne fonctionnerait jamais, car la sortie de sudo foo1serait alimentée sudo foo2. En utilisant mes whoamiexemples, 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.

Manières obscures d'appeler sudo

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 !

Voie # 1

$ 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 sudodémarrage.

Voie # 2

$ sudo tee /proc/sys/vm/drop_caches <<<1

Comment ça fonctionne?

Cette méthode exécute le teeprogramme en tant que root ET prend l'entrée à partir d'une chaîne here qui s'exécute avant d' sudoappeler la teecommande.

Voie # 3

# 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 -scommutateur, sudoexé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 -scommutateur dit qu'il passera une seule commande au shell défini dans l'entrée utilisateur du /etc/passwdfichier. 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.

slm
la source
6

Non, dans votre exemple, seul fooest 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'
jordanm
la source