GNU/Linux >> Tutoriels Linux >  >> Linux

Pourquoi "sudo Su" dans un script Shell n'exécute-t-il pas le reste du script en tant que racine ?

Un exemple de script peut être comme ci-dessous :

#!/bin/bash
sudo su
ls /root

Lors de l'utilisation de ./test.sh en tant qu'utilisateur normal, exécutez plutôt ls en tant que super utilisateur et sortie, il passe en root; et quand je me déconnecte, il exécute ls /root en tant qu'utilisateur normal.

Quelqu'un peut-il me parler du mécanisme à ce sujet ?

Réponse acceptée :

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 le change pas et ne peut pas le changer en root :la commande su crée un nouveau processus avec les privilèges root.

Une fois cette 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 permissions root, comme ceci

#!/bin/sh
su -c ~/main.sh root

Pour lancer ce processus, vous exécutez le wrapper, qui à son tour lance le script principal après le passage de l'utilisateur à l'utilisateur root.

Cette technique de wrapper peut être utilisée pour transformer le script en un wrapper autour de lui-même. Vérifiez essentiellement s'il s'exécute 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 termine effectivement son exécution et démarre le nouveau programme, lancé par su, avec root, pour s'exécuter à partir du haut. L'instance de remplacement est "root" donc elle n'exécute pas le côté droit du ||


Linux
  1. Pourquoi le ~/.bash_profile ne fonctionne-t-il pas ?

  2. Comment exécuter rétroactivement un script en tant que root ?

  3. Linux - Pourquoi le noyau ne peut-il pas exécuter Init ?

  4. La signification de $ ? Dans un script shell ?

  5. Exécuter un script shell en parallèle

Comment exécuter une commande / un script Linux Shell en arrière-plan

Comment exécuter un script Shell en tant que service SystemD sous Linux

Comment créer et exécuter un script shell dans Ubuntu 22.04

Pourquoi avez-vous besoin de mettre #!/bin/bash au début d'un fichier de script ?

Exécutez un script shell à partir de la commande docker-compose, à l'intérieur du conteneur

Kali Linux VM :autorisation refusée pour exécuter le script shell, en tant que root