Passage au super-user pendant l'exécution du script shell

J'ai un script shell qui contient les lignes suivantes:

CURRENT_USER=${USER} echo $CURRENT_USER su echo switch to `who am i` 

Une fois la 2ème ligne exécutée, le shell m'invite à entrer le mot de passe root. Après avoir fourni le mot de passe correct et connecté en tant qu'administrateur, la dernière ligne ne sera pas exécutée.

Quelle pourrait être la raison de ce problème?

su démarre un nouveau shell (ou exécute une autre command). Il ne bascule pas magiquement l'UID du shell courant. Si vous tapez exit après avoir entré votre mot de passe, vous verrez que votre script continue avec l'instruction echo (mais en tant qu'user d'origine, pas en tant que root).

Vous pouvez placer la partie du script qui doit être exécutée en tant que root dans un script séparé et l'exécuter avec su . (Ou certains utilisent la variante de cette astuce.)

En ce qui concerne la coquille, su est une command comme les autres. Lorsque vous exécutez su sans argument, il request le mot de passe root, puis appelle un shell interactif, comme d'habitude. Une fois que ce shell interactif se termine, le script passe à la command suivante.

Pour passer des commands à su sans trop de guillemets, il est facile de passer un script sur son input standard en utilisant un document ici . Utilisez un heredoc littéral (où le marqueur de fin d'input est cité) pour éviter de citer des maux de tête. Notez que les variables shell du script parent ne sont pas disponibles pour le script exécuté en tant que root: seules les variables d'environnement (exscopes) sont disponibles. Exemple:

 ADD_USER=john ADD_TO_GROUP=fiddlers export ADD_USER ADD_TO_GROUP su <<'EOF' adduser "$ADD_USER" "$ADD_TO_GROUP" EOF # more commands executed as the original user 

L'exécution de su démarre une nouvelle command (le shell par défaut).

Pour faire ce travail, essayez quelque chose comme ceci:

 #!/bin/bash if [ `id -u` = 0 ]; then # Do our real work as root else su -c $0 fi