Un exemple de script peut être comme ci-dessous:
#!/bin/bash
sudo su
ls /root
Lorsqu’il est utilisé en ./test.sh
tant qu’utilisateur normal, exécutez-le en ls
tant que super utilisateur et quittez-le; et lorsque je me déconnecte, il s'exécute en ls /root
tant qu'utilisateur normal.
Quelqu'un peut-il me parler du mécanisme à ce sujet?
sudo su
me fait mal aux yeux.sudo -s
, cependant?sudo su
parce que je suis plus habitué aux options desu
que je ne suis de celles desudo
. Je connais assez bien les options de sudo, mais je peux taper plus rapidement les options su. Mais oui, cela veut dire que je ne connais pas assez le sudo.sudo -i
est proche desu -
toutsudo -s
fonctionne commesu
(sans le tiret)Réponses:
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
Le script wrapper appelle le script principal avec les autorisations root, comme ceci
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
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 ||
la source
Utilisez ce qui suit dans le script.
Le code entre le bloc HERE sera exécuté en tant que root.
la source
sudo su
appelle deux programmes. Utilisezsudo -s <<HEREDOC
ousu user <<HEREDOC
... Limite stupide de 5 minutes.Sans autres arguments
su
, le shell de connexion sera exécuté pour root. C'est ce que la première ligne de votre script fait réellement. Lorsque vous quittez, le shell connexion se ferme, les retours et su votre script poursuit son exécution, qui est la deuxième ligne:ls /root
. Je pense que vous pouvez simplementsudo ls /root
faire ce que vous voulez.la source
ls
, mais ce n’est qu’un échantillon. En fait, j'ai besoin de faire beaucoup plus de choses avec le privilège root :-) Je préfère donc la réponse de @ Ankit.Une fois que vous lancez
sudo su
un nouveau processus avec leuserid (euid=EUID)
super utilisateur réel, nous avons donc un nouveau bash qui s'exécute sous différents identificateurs de processus(pid=PID)
associés au même terminal(tname=TTY)
.Explication
Supposons qu'après le tir,
ps -A | grep bash
vous ayez21460 pts/2 00:00:00 bash
comme sortie. Maintenant, lorsque vous exécuterez les./test.sh
deux commandessudo su
etls /root
que vous serez spouléPID 21460
. Après exécution lorsque l'root
utilisateur actif est àps -A | grep bash
nouveau touché , vous remarquerez un nouveau bash en cours d'exécutionPID say, 21570
. Sortir deroot bash
va tuer la bash récemment retournéeuser's bash
et, par conséquent, exécuter la commande spooledls /root
avant de relâcher l’invite.la source