web-dev-qa-db-fra.com

Comment puis-je exécuter une série de commandes dans un sous-shell bash en tant qu'un autre utilisateur utilisant sudo?

J'écris un script bash qui a besoin de plusieurs commandes Sudo. Je peux le faire:

( whoami ; whoami )

mais je ne peux pas faire ça:

Sudo ( whoami ; whoami )

Comment résoudre ce problème?

39
qrest

Exécutez un shell dans Sudo: Sudo bash -c 'whoami; whoami'

Vous pouvez utiliser n'importe quel caractère sauf ' lui-même à l'intérieur des guillemets simples. Si vous voulez vraiment avoir un seul guillemet dans cette commande, utilisez '\'' (qui est techniquement: fin du guillemet simple littéral, littéral ' caractère, commence le littéral entre guillemets simples; mais en fait, c'est un moyen d'injecter un guillemet simple dans une chaîne littérale entre guillemets simples).

Vous pouvez passer les commandes en entrée standard dans Sudo'ed bash avec un ici document :

Sudo bash <<"EOF"
whoami
id
EOF

De cette façon, il n'est pas nécessaire de jouer avec les bons devis, surtout si vous avez plusieurs niveaux, par exemple:

Sudo bash <<"EOF"
whoami
echo $USER ~
Sudo -u Apache bash <<"DOF"
whoami
echo $USER ~
DOF
EOF

Produit:

root
root /root
Apache
apache /usr/share/httpd

(Notez que vous ne pouvez pas indenter le terminateur interne - il doit être seul sur sa ligne. Si vous souhaitez utiliser l'indentation dans un document ici, vous pouvez utiliser <<- au lieu de <<, mais vous devez mettre en retrait avec des tabulations, pas des espaces.)

56
Maxim Egorushkin

par exemple essayez ceci, je l'ai testé:

Sudo bash -c "cd /;ls;ls|grep o"

Dans cet exemple, vous changez d'abord dir en/root, la liste suivante répertorie le répertoire racine et enfin, pour le répertoire racine, filtrez uniquement les répertoires dont le nom est composé de la lettre "o".

Mais je préfère écrire un script qui fait tout ce dont vous avez besoin et donne le code de sortie pour toutes les actions complexes. Ensuite, vous pouvez créer un script Sudo à la place d'un groupe de commandes uniques comme l'exemple ci-dessus.

3
Znik