Les commandes d'un script s'exécutent une par une, indépendamment. Le script lui-même, en tant que parent de toutes les commandes du script, est un autre processus indépendant et la commande su ne peut pas et ne peut pas le changer en root: la commande su crée un nouveau processus avec les privilèges root.
Une fois la commande su terminée, le processus parent, toujours en cours d'exécution sous le même utilisateur, exécutera le reste du script.
Ce que vous voulez faire, c'est écrire un script wrapper. Les commandes privilégiées vont dans le script principal, par exemple~/main.sh
#!/bin/sh
ls /root
Le script wrapper appelle le script principal avec les autorisations root, comme ceci
#!/bin/sh
su -c ~/main.sh root
Pour lancer ce processus, vous exécutez l'encapsuleur qui, à son tour, lance le script principal après avoir basculé utilisateur sur l'utilisateur root.
Cette technique de wrapper peut être utilisée pour transformer le script en un wrapper autour de lui-même. En gros, vérifiez s’il est exécuté en tant que root. Sinon, utilisez "su" pour se relancer.
$ 0 est un moyen pratique de faire en sorte qu'un script se réfère à lui-même, et la commande whoami peut nous dire qui nous sommes (sommes-nous root?)
Ainsi, le script principal avec wrapper intégré devient
#!/bin/sh
[ `whoami` = root ] || exec su -c $0 root
ls /root
Notez l'utilisation de exec. Cela signifie "remplacer ce programme par", ce qui met effectivement fin à son exécution et lance le nouveau programme, lancé par su, avec root, pour s'exécuter depuis le haut. L'instance de remplacement est "root", elle n'exécute donc pas le côté droit de la commande ||
sudo su
me fait mal aux yeux.