Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 12/04/2012, à 15:26

metalux

[Résolu]Utilisation de sudo -S dans un script

Bonjour,
J'ai deux commandes (qui fonctionnent) dans un script pour laquelle je ne comprends pas exactement la différence. Je me suis aidé du man mais j'ai quelques difficultés à bien comprendre chaque options et je n'ai pas trouvé la version française de celui-ci.

Voici les 2 commandes:

sudo -K
motpasse=$(zenity --password | sudo -S sed -ni '1,/Allowed-Origins/ p' $fdc
    (echo -e "$choix\n};" && sed -n '/^\/\/ List of packages to not update/,$ p' "$sav3") | sudo tee -a $fdc) && [[ -n $motpasse ]]

et la seconde:

sudo -K
        mp=$(zenity --password | sudo -S -s
         echo 'blablabla' | sudo tee -a "$fdc2")  && [[ -n $mp ]] && bash "$0" && exit 0

L'option -S récupère l'entrée standard et -s exécute la commande si j'ai bien compris.
Alors, pourquoi le 1er code fonctionne sans l'option -s et que le 2ème code lui ne fonctionne pas sans celle-ci?
J'ai réussi à mettre le tout en place mais il s'agit plus de bidouille que d'analyse.
Y a-t-il quelqu'un pour m'éclairer sur ces subtilités de sudo?

Dernière modification par metalux (Le 30/04/2012, à 22:35)

Hors ligne

#2 Le 22/04/2012, à 13:11

metalux

Re : [Résolu]Utilisation de sudo -S dans un script

Suite à la discussion de Christophe C sur gksudo, je me dis que je pourrais passer par

mp=$(gksudo $(echo 'blablabla' | sudo tee $fdc2)) && [[ -n $mp ]] && bash $0 && exit 0

par contre, la présentation est moins bonne, la ligne de commande s'affichant dans gksudo.

Hors ligne

#3 Le 28/04/2012, à 13:47

Postmortem

Re : [Résolu]Utilisation de sudo -S dans un script

Salut,
Normalement sudo s'utilise ainsi :

sudo <commande>

sudo demande le mot de passe dans le terminal dans lequel on l'a lancé, puis exécute la commande avec les droits de root (par défaut).
L'option -S permet de lire le mot de passe depuis l'entrée standard plutôt que depuis le terminal où il est "attaché".

zenity --password | sudo -S <commande>

La commande zenity --password affiche le mot de passe que l'on rentre sur sa sortie standard ; grâce au pipe, la sortie standard de zenity --password est "branchée" sur l'entrée standard de la commande qui suit, ici sudo -S <commande>. Le mot de passe rentré dans la boite zenity est ainsi transmis à sudo qui peut alors exécuter <commande> avec les droits de root.

À la place d'une commande, on peut passer l'option -s. Elle permet d'ouvrir une session avec les droits de root. Cela permet d'exécuter des commandes en tant que root, et donc, sans les précéder de sudo.
Mais dans le cas de :

zenity --password | sudo -S -s

sudo -S -s est exécuter dans un sous processus, et donc, la session ouverte est fermée aussitôt :

toto@mon-pc:~$ # On est dans la session toto
toto@mon-pc:~$ sudo -s
[sudo] password for toto: 
root@mon-pc:~# # Le prompt montre que l'on est passé root
root@mon-pc:~# exit
exit
toto@mon-pc:~$ # Retour dans la session toto
toto@mon-pc:~$ sudo -k # Pour que le mot de passe soit redemandé lors de la prochaine commande sudo
toto@mon-pc:~$ 
toto@mon-pc:~$ zenity --password | sudo -S -s
[sudo] password for toto: toto@mon-pc:~$ 
toto@mon-pc:~$ # Le prompt montre qu'on est directement revenu dans ma session toto

zenity --password | sudo -S -s ne sert donc qu'à rentrer le mot de passe une première fois, ainsi, le mot de passe n'est pas redemandé durant x minutes pour les prochaines commande sudo.
Nous aurions pu remplacer l'option -s par une commande. Le résultat est le même, le mot de passe n'est pas redemandé à la commande suivante :

toto@mon-pc:~$ ls -la /a
ls: impossible d'accéder à /a: Aucun fichier ou dossier de ce type
toto@mon-pc:~$ 
toto@mon-pc:~$ sudo -k
toto@mon-pc:~$ 
toto@mon-pc:~$ zenity --password | sudo -S echo "Mot de passe rentré"
[sudo] password for toto: Mot de passe rentré
toto@mon-pc:~$ 
toto@mon-pc:~$ sudo touch /a
toto@mon-pc:~$ # Le fichier est créé avec les droits de root sans redemander le mot de passe
toto@mon-pc:~$ ls -l /a
-rw-r--r-- 1 root root 0 2012-04-28 13:40 /a
toto@mon-pc:~$

J'espère que ces exemples t'auront un peu éclairé !


Mot' a dit : « Un Hellfest sans Slayer, c'est comme une galette-saucisse sans saucisse ! »

Hors ligne

#4 Le 29/04/2012, à 12:35

metalux

Re : [Résolu]Utilisation de sudo -S dans un script

Salut Postmortem,
Tu ne serais pas prof ou formateur vu tes talents de pédagogue! smile
Je penses que j'ai bien compris (à moins que je suis un imbécile), mais je n'arrives toujours pas à transmettre directement la commande sans passer par sudo -S -s dans ce cas:

sudo -K
        mp=$(zenity --password | sudo -S -s
         echo 'blablabla' | sudo tee -a "$fdc2")  && [[ -n $mp ]] && bash "$0" && exit 0

fonctionne alors que

sudo -K
        mp=$(zenity --password | sudo -S echo 'blablabla' | sudo tee -a "$fdc2")  && [[ -n $mp ]] && bash "$0" && exit 0

ne fonctionne pas.
Ça m'éneeerrrrrvvvee de ne pas comprendre pourquoi ça ne passe pas. Une erreur de syntaxe?
Voici le script original pour mieux comprendre, ligne 103 à 105 (alors qu'aux lignes 54 à 56 tout roule normalement).

Hors ligne

#5 Le 30/04/2012, à 11:22

Postmortem

Re : [Résolu]Utilisation de sudo -S dans un script

Salut,
Je pense avoir compris pourquoi la deuxième solution ne fonctionne pas.
En fait, les commandes dans un pipe s'exécutent en même temps.
Dans cette ligne, les 2 sudo sont exécutés en même temps :

zenity --password | sudo -S echo 'blablabla' | sudo tee -a "$fdc2"

Et donc, le mot de passe n'ayant pas encore été rentré, les 2 sudo demandent le mot de passe. Le premier sudo reçoit le mot de passe rentré dans zenity mais le 2ème ne reçoit rien et reste donc en attente.
Si tu exécutes cette ligne seule dans un terminal, tu verras que le mot de passe est demandé 2 fois. Tu le rentreras une fois avec zenity, puis, tu le remets dans le terminal et ton "tee" sera bien exécuté.

toto@mon-pc:~$ ll /tmp/toto.txt
ls: impossible d'accéder à /tmp/toto.txt: Aucun fichier ou dossier de ce type
toto@mon-pc:~$ 
toto@mon-pc:~$ sudo -K
toto@mon-pc:~$ 
toto@mon-pc:~$ zenity --password | sudo -S echo 'blablabla' | sudo tee -a /tmp/toto.txt
[sudo] password for toto: [sudo] password for toto: 
blablabla
toto@mon-pc:~$ # On rentre le mdp une fois dans zenity et une fois dans le terminal
toto@mon-pc:~$ ll /tmp/toto.txt
-rw-r--r-- 1 root root 10 2012-04-30 11:12 /tmp/toto.txt
toto@mon-pc:~$ 
toto@mon-pc:~$ cat /tmp/toto.txt
blablabla
toto@mon-pc:~$

Dans la première façon de faire dans ton post précédent, les sudo ne sont pas exécutés ensemble. Le premier reçoit le mot de passe rentré dans zenity puis, le 2ème s'exécute et il n'a plus besoin du mot de passe.


Mot' a dit : « Un Hellfest sans Slayer, c'est comme une galette-saucisse sans saucisse ! »

Hors ligne

#6 Le 30/04/2012, à 22:35

metalux

Re : [Résolu]Utilisation de sudo -S dans un script

Ok, je comprends mieux maintenant le fonctionnement.
Sinon existe-t-il une syntaxe qui permettrait d'isoler les 2 pipes afin que les 2 sudo ne soient pas exécutés en même temps? En ajoutant des parenthèses par exemples? Ceci uniquement pour ma "culture" donc ne te casse pas trop la tête si tu n'as pas de réponse rapide.
En tout cas merci pour tes explications claires sans lesquelles je n'aurais pas réussi à saisir la différence.

Hors ligne