Contenu | Rechercher | Menus

Annonce

DVD, clés USB et t-shirts Ubuntu-fr disponibles sur la boutique En Vente Libre

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 26/03/2021, à 12:37

Wlan0

Lancer mon script avec un seule sudo

Bonjour smile

J'ai écrit un petit script simple pour éviter les tâches chronophages lors du démarrage de mon PC.

Donc une fois celui-ci démarré, je lance, à la main, ce script : https://pastebin.com/KrNmeZwC

Le problème est que je dois écrire 5 fois mon mot de passe, donc je voudrai savoir si c'est possible de le taper une seule fois et de le garder en mémoire le temps d’exécution du script; dans une variable par exemple ?

Cordialement


"- Vous êtes sans doute le pirate, le plus pitoyable dont on m'ait parlé.
- Au moins, on vous a parlé de moi."
Pirates Des Caraibes, La Malédiction Du Black Pearl

Hors ligne

#2 Le 26/03/2021, à 12:40

MicP

Re : Lancer mon script avec un seule sudo

Bonjour

Wlan0 a écrit :

…Le problème est que je dois écrire 5 fois mon mot de passe, donc je voudrai savoir si c'est possible de le taper une seule fois et de le garder en mémoire le temps d’exécution du script; …

Tu enlèves tous les mots sudo qui sont dans ton script
en lançant la ligne de commande suivante :

sed -i 's/sudo //g' nomDeTonScript

et ensuite, c'est directement le script que tu lanceras avec sudo :

sudo nomDeTonScript

Comme ça, tu n'auras à entrer qu'une seule fois ton mot de passe,
et toutes les commandes qui sont dans ton script seront exécutées comme si tu les avais lancées avec sudo

Dernière modification par MicP (Le 26/03/2021, à 13:01)

Hors ligne

#3 Le 26/03/2021, à 13:34

jplemoine

Re : Lancer mon script avec un seule sudo

En tête du script, tu peut mettre :

#! /bin/bash

# a lancer en root ou sudo

if [ "$USER" != "root" ]; then
    echo "A lancer en root ou sudo"
    exit
fi

Comme çà, si tu oublie le sudo, ça marche pô.


Membre de l'ALDIL (Association Lyonnaise pour le Développement de l'Informatique Libre)
- En pro, après 20 ans de développement, administrateur Linux / Unix depuis Avril 2019.
- En privé, sous Ubuntu-Xubuntu depuis 2009.

Hors ligne

#4 Le 26/03/2021, à 14:07

Tawal

Re : Lancer mon script avec un seule sudo

Hello,

jplemoine a écrit :

Comme çà, si tu oublie le sudo, ça marche pô.

Et aussi, ça évite (en cas d'oubli du sudo) que les commandes présentes dans le script et ne nécessitant pas de droits root soient exécutées.


Le savoir n'a d’intérêt que si on le transmet.
Ubuntu-Mate 20.04.2 LTS Virtualisée
Useless Use of Cat Award

Hors ligne

#5 Le 26/03/2021, à 14:22

erresse

Re : Lancer mon script avec un seule sudo

Précision utile :
Si l'exécution d'un script lancé avec "sudo" dure très longtemps, il est possible que le système redemande de saisir le mot de passe pour valider la suite de l'exécution. Ça peut survenir dans les 10 ou 15 minutes, je pense, temps de validité d'un "sudo".


Plus de 50 ans d'informatique, ça en fait des lignes de commandes en console, mais on n'avait pas le choix...
Excellente raison pour, aujourd'hui qu'on le peut, utiliser au maximum les INTERFACES GRAPHIQUES !
Important : Une fois résolu, pensez à clore votre sujet en ajoutant [Résolu] devant le titre du 1er message, et un bref récapitulatif de la solution à la fin de celui-ci. Merci.

Hors ligne

#6 Le 26/03/2021, à 14:57

Tawal

Re : Lancer mon script avec un seule sudo

Merci erresse.
Je ne le savais pas wink


Le savoir n'a d’intérêt que si on le transmet.
Ubuntu-Mate 20.04.2 LTS Virtualisée
Useless Use of Cat Award

Hors ligne

#7 Le 26/03/2021, à 15:37

MicP

Re : Lancer mon script avec un seule sudo

@erresse

Je pense que, comme c'est le shell (depuis lequel les commandes listées dans le script seront exécutées) qui aura les privilèges du compte root si il est lancé par sudo
tant que ce shell sera actif, il ne perdra pas ses privilèges.

=======
@ jplemoine

Le compte root peut avoir été renommé,
mais quel que soit son nom, il n'aura ses privilèges que si son UID est bien égal à 0

Dans le cas où l'UID du compte utilisateur qui lancera le script ne serait pas égal à 0
il faudrait aussi signaler cette erreur en faisant retourner par le script un code d'erreur différent de 0

Donc :

#! /bin/bash

# a lancer en root ou sudo

if [ "x$(id -u)" != "x0" ]; then
    echo "A lancer en root ou sudo"
    exit 1
fi

Dernière modification par MicP (Le 26/03/2021, à 15:54)

Hors ligne

#8 Le 26/03/2021, à 16:32

Tawal

Re : Lancer mon script avec un seule sudo

En effet, le script garde ses privilèges quelque soit le temps d'exécution.
Script de test :

#!/bin/bash

apt update

echo
sleep 3000
echo

apt update

Le savoir n'a d’intérêt que si on le transmet.
Ubuntu-Mate 20.04.2 LTS Virtualisée
Useless Use of Cat Award

Hors ligne

#9 Le 26/03/2021, à 16:38

erresse

Re : Lancer mon script avec un seule sudo

Ben c'est curieux, parce-que c'est justement sur une mise à jour très touffue qui durait longtemps que j'ai été obligé de revalider avant la fin, le système se mettant en pause pour saisir à nouveau le mot de passe... Mais peut-être qu'il y avait une autre raison que je n'ai pas vue à ce moment-là ?


Plus de 50 ans d'informatique, ça en fait des lignes de commandes en console, mais on n'avait pas le choix...
Excellente raison pour, aujourd'hui qu'on le peut, utiliser au maximum les INTERFACES GRAPHIQUES !
Important : Une fois résolu, pensez à clore votre sujet en ajoutant [Résolu] devant le titre du 1er message, et un bref récapitulatif de la solution à la fin de celui-ci. Merci.

Hors ligne

#10 Le 26/03/2021, à 18:11

MicP

Re : Lancer mon script avec un seule sudo

… Mais peut-être qu'il y avait une autre raison que je n'ai pas vue à ce moment-là ? …

peut-être une demande d'accès au compte administrateur d'une de base de données

Dernière modification par MicP (Le 26/03/2021, à 18:12)

Hors ligne

#11 Le 26/03/2021, à 18:39

Wlan0

Re : Lancer mon script avec un seule sudo

Merci à vous pour ces commentaires très utiles !


"- Vous êtes sans doute le pirate, le plus pitoyable dont on m'ait parlé.
- Au moins, on vous a parlé de moi."
Pirates Des Caraibes, La Malédiction Du Black Pearl

Hors ligne

#12 Le 26/03/2021, à 21:07

Tawal

Re : Lancer mon script avec un seule sudo

@MicP

MicP a écrit :
[ "x$(id -u)" != "x0" ]

À quoi sert le x devant la variable ?
Je l'avais lu quelque part mais je ne m'en souviens plus sad
C'est pour s'assurer de ... ?

Merci smile


Le savoir n'a d’intérêt que si on le transmet.
Ubuntu-Mate 20.04.2 LTS Virtualisée
Useless Use of Cat Award

Hors ligne

#13 Le 26/03/2021, à 21:57

Watael

Re : Lancer mon script avec un seule sudo

À quoi sert le x devant la variable ?

à rien si tu mets bien les guillemets.

mais c'est joli. lol


Welcome to sHell. · eval is evil.

Hors ligne

#14 Le 26/03/2021, à 22:13

Tawal

Re : Lancer mon script avec un seule sudo

Ah, il m'avait pourtant bien semblé avoir lu une explication ...

Et on peut éviter une substitution de commande en utilisant la variable $UID


Le savoir n'a d’intérêt que si on le transmet.
Ubuntu-Mate 20.04.2 LTS Virtualisée
Useless Use of Cat Award

Hors ligne

#15 Le 26/03/2021, à 23:23

Zakhar

Re : Lancer mon script avec un seule sudo

Cela fait du sens, parfois, d'avoir besoin de "garder le sudo" dans un script NON lancé en sudo.

Cela m'est arrivé dans un script où je dois écrire sur un montage fuse qui n'est possible que pour l'utilisateur, et pas root ou autres, sans l'option adéquate dans le montage fuse (que je n'utilise pas pour raison de sécurité).

J'ai besoin de faire un curl sous un autre utilisateur, en mettant le résultat dans le montage fuse.

Donc :

sudo -u other_user curl https://example.com/somefile >~/fuse/somefile

Ceci fonctionne, car la redirection est faite avant la commande, donc le fichier redirigé appartient à celui qui a lancé le script (mon user sans sudo), et ensuite le shell interprète la commande qui est lancée avec un autre user.
Un curl -o fichier ne marcherait pas car comme curl est lancé sous un autre user, dans ce cas c'est curl qui crée le "output" et il appartiendrait à cet autre user.

Comme ceci est dans une boucle de téléchargement de plusieurs fichiers, et que ça peut prendre du temps, au bout de 15 minutes (valeur standard, certes modifiable), on n'a plus les droits pour lancer la commande, ce qui casse l'automatisme.

Une solution est bien sûr de mettre une exception dans sudoers pour que le user courant puisse lancer curl avec le other_user sans mot de passe.

L'autre solution que j'ai trouvée est cette petite boucle à mettre en début de script:

# Trick to keep sudo time-out forever
		while :; do sleep 1m; sudo -v; done &
		JOBPID=$!
		trap "kill ${JOBPID}" 2 3 5 6 9 15

Ce que ça fait, c'est que ça "rafraîchit" le timer de 15 minutes toutes les minutes (sudo -v) dans un subshell, et quand le script se termine, le "trap" tue le subshell pour éviter qu'il devienne orphelin.

Le "premier sudo" du script va donc vous demander le mot de passe, et ensuite il va le conserver à vie du script grâce au "subshell" !

Dernière modification par Zakhar (Le 26/03/2021, à 23:26)


"A computer is like air conditioning: it becomes useless when you open windows." (Linus Torvald)

Hors ligne

#16 Le 27/03/2021, à 00:02

Tawal

Re : Lancer mon script avec un seule sudo

@Zakhar
Je comprends pas bien le problème.
Tu peux lancer le script avec

sudo ./script

puis préfixer chaque commande dans le script ne devant pas être exécutée par root par un

sudo -u utilisateur commande

Car il me semble que root peut lancer les commandes à la place de n'importe quel utilisateur sans demande de mot de passe de l'utilisateur en question.

Dernière modification par Tawal (Le 27/03/2021, à 00:03)


Le savoir n'a d’intérêt que si on le transmet.
Ubuntu-Mate 20.04.2 LTS Virtualisée
Useless Use of Cat Award

Hors ligne

#17 Le 27/03/2021, à 00:07

MicP

Re : Lancer mon script avec un seule sudo

Dans son message #12, Tawal a écrit :

… À quoi sert le x devant la variable ? …

Dans son message #12, Tawal a écrit :

Ah, il m'avait pourtant bien semblé avoir lu une explication ... …

Me too

Je l'avais perdue, mais je viens de la retrouver :
stackoverflow.com -> why do shell script comparisons often use xvar xyes

Hors ligne

#18 Le 27/03/2021, à 00:22

Tawal

Re : Lancer mon script avec un seule sudo

@MicP
Merci smile
C'est surtout une question (maintenant) de portabilité vers d'autres shell ou anciennes versions de bash.

@Zakhar
Un exemple de mes propos :

#!/bin/bash

sudo -u tawal echo "Gagné tawal" | sudo -u tawal tee tawal.log

echo "Gagné root" | tee root.log

el l'exécution :

$ sudo ./test
Gagné tawal
Gagné root
$ ls -l
total 12
-rw-r--r-- 1 root  root   12 mars  26 23:14 root.log
-rw-r--r-- 1 tawal tawal  13 mars  26 23:14 tawal.log
-rwxr-xr-x 1 tawal tawal 114 mars  26 23:13 test
$

Edit: pas de mot de passe au sudo ./test car mon time-out n'était pas passé wink

Dernière modification par Tawal (Le 27/03/2021, à 00:25)


Le savoir n'a d’intérêt que si on le transmet.
Ubuntu-Mate 20.04.2 LTS Virtualisée
Useless Use of Cat Award

Hors ligne

#19 Le 27/03/2021, à 00:51

jplemoine

Re : Lancer mon script avec un seule sudo

Pour le x, il me semblait bien que c’était superflu si on mettait les guillemets.
Mais je pense que par habitude, on a continué à mettre le x.
Perso, je ne met pas le x mais les guillemets, ça semble fonctionner.


Membre de l'ALDIL (Association Lyonnaise pour le Développement de l'Informatique Libre)
- En pro, après 20 ans de développement, administrateur Linux / Unix depuis Avril 2019.
- En privé, sous Ubuntu-Xubuntu depuis 2009.

Hors ligne

#20 Le 27/03/2021, à 04:52

MicP

Re : Lancer mon script avec un seule sudo

Regarde le retour de cette ligne de commandes :

grep -r 'test "x\$' /usr 2>/dev/null

c'est limité aux fichiers contenus dans l'arborescence du répertoire /usr
et il y a mieux comme ligne de commandes, mais ça donne déjà une idée…

Dernière modification par MicP (Le 28/03/2021, à 07:03)

Hors ligne

#21 Le 27/03/2021, à 12:26

Tawal

Re : Lancer mon script avec un seule sudo

Ouch ! Le retour !
Chez moi 568 lignes du type :

/usr/sbin/gparted:	if test "x$ENABLE_XHOST_ROOT" = 'xyes' && xhost 1> /dev/null 2>&1; then
/usr/sbin/gparted:	if test "x$GRANTED_XHOST_ROOT" = 'xyes'; then
/usr/sbin/gparted:if test "x$HAVE_SYSTEMCTL" = "xyes"; then
/usr/sbin/gparted:if test "x$HAVE_UDISKS2_INHIBIT" = "xyes"; then
/usr/sbin/gparted:elif test "x$HAVE_UDISKS" = "xyes" && test "x$HAVE_HAL_LOCK" = "xyes"; then
/usr/sbin/gparted:elif test "x$HAVE_UDISKS" = "xyes"; then
/usr/sbin/gparted:elif test "x$HAVE_HAL_LOCK" = "xyes"; then
/usr/sbin/gparted:if test "x$HAVE_SYSTEMCTL" = "xyes"; then

Wouah !

Mais tous les scripts listés sont faits pour être portable au max.
D'où une utilisation "généralisée" du x$var.
Car chez moi avec ce script (sans shebang) :

testx() {
    echo "var=$var"
    if test "$var" = "PASS"; then echo 'test "$var" = "PASS"  --> OK'; fi
    if test "x$var" = xPASS; then echo 'test "x$var" = xPASS  --> OK'; fi
    echo
}

var=
testx

var=""
testx
        
var="-n"
testx

var="PASS"
testx

var="valeur quelconque"
testx

Donne ces retours (sans erreur) avec différents interpréteur :

$ bash test
var=

var=

var=-n

var=PASS
test "$var" = "PASS"  --> OK
test "x$var" = xPASS  --> OK

var=valeur quelconque

$ dash test
var=

var=

var=-n

var=PASS
test "$var" = "PASS"  --> OK
test "x$var" = xPASS  --> OK

var=valeur quelconque

$ ksh test
var=

var=

var=-n

var=PASS
test "$var" = "PASS"  --> OK
test "x$var" = xPASS  --> OK

var=valeur quelconque

$

Donc avec ces 3 interpréteurs (actuels), qu'on mette le x ou pas ne change rien.
On revient à ce que disait Watael au #13 : si les guillemets sont présents, le x ne sert pas vraiment.
À moins de vouloir une extrême portabilité vers d'autres interpréteurs plus pointilleux ou vers des versions anciennes des interpréteurs.


Le savoir n'a d’intérêt que si on le transmet.
Ubuntu-Mate 20.04.2 LTS Virtualisée
Useless Use of Cat Award

Hors ligne

#22 Le 27/03/2021, à 12:28

Zakhar

Re : Lancer mon script avec un seule sudo

Tawal a écrit :

@Zakhar
Je comprends pas bien le problème.
Tu peux lancer le script avec

sudo ./script

puis préfixer chaque commande dans le script ne devant pas être exécutée par root par un

sudo -u utilisateur commande

Car il me semble que root peut lancer les commandes à la place de n'importe quel utilisateur sans demande de mot de passe de l'utilisateur en question.

Le problème est fuse.

Seul l'utilisateur qui a monté, en général ton propre user peut écrire dans le montage fuse. L'écriture est interdite à root ou autre user (sauf option de montage allow_root, allow_other).

C'est une particularité où le user a plus de droit que root ! lol

Donc si tu lances en root, de deux choses l'une, soit tu fais :

sudo -u other_user curl https://blahblah >somefile

Auquel cas "somefile" est crée avec les droits root car la redirection se passe avant interprétation de la commande, avec l'UID/GID de celui qui a lancé le shell (root dans ta proposition)... ce qui ne marche pas dans un montage fuse !..

Soit tu fais :

sudo -u other_user curl https://blahblah -o somefile

Dans ce cas "somefile" est crée par curl avec les droits de "other_user" et ça ne marche pas non plus.

Tu peux aussi tenter de faire un truc compliqué avec un subshell ayant les droits de l'utilisateur (tu peux vu que tu as lancé en root) dans lequel tu ferais un sudo pour changer de user... mais là sudo va te demander le mot de passe parce que ton user ne peut faire ça sans sudo et tu as dépassé les 15 minutes...

Le "blocage" vient donc en fait de la particularité de fuse (exemple: sshfs, curlftpfs, 1fichierfs...) où l'utilisateur "a plus de droits que root" !..

Dernière modification par Zakhar (Le 27/03/2021, à 12:31)


"A computer is like air conditioning: it becomes useless when you open windows." (Linus Torvald)

Hors ligne

#23 Le 27/03/2021, à 12:39

Tawal

Re : Lancer mon script avec un seule sudo

@Zakhar
Et cette commande ne fonctionnerait pas ? :

sudo -u other_user curl https://blahblah | sudo -u user_fuse tee somefile

Le savoir n'a d’intérêt que si on le transmet.
Ubuntu-Mate 20.04.2 LTS Virtualisée
Useless Use of Cat Award

Hors ligne

#24 Le 27/03/2021, à 15:13

Zakhar

Re : Lancer mon script avec un seule sudo

Tawal a écrit :

@Zakhar
Et cette commande ne fonctionnerait pas ? :

sudo -u other_user curl https://blahblah | sudo -u user_fuse tee somefile

Oui, très probablement au prix d'un peu plus de CPU et en mettant une redirection vers /dev/null à la fin ! big_smile

Après il faut vérifier si sudo n'est quand même pas pointilleux à demander quand même le mot de passe au bout de 15 minutes... je testerai à la prochaine occasion.

Il resterait alors une différence de sécurité : c'est que si le script est lancé en sudo, il a les privilèges pour tout faire. Par exemple suppose un "malware" dans curl, il pourrait écraser des fichiers système dans un script en root. Tandis que le script lancé avec le user, et seulement certaines commande en sudo est moins dangereux. Surtout avec sudo -u other_user curl https://blahblah, ça ne peut rien écraser au niveau du système, sauf si "other_user" est root.

Dernière modification par Zakhar (Le 27/03/2021, à 15:14)


"A computer is like air conditioning: it becomes useless when you open windows." (Linus Torvald)

Hors ligne

#25 Le 27/03/2021, à 15:50

MicP

Re : Lancer mon script avec un seule sudo

Si le script est lancé avec les privilèges du compte super-utilisateur root
dans ce script, utilisez la commande su pour faire exécuter une commande depuis un autre compte utilisateur.

Comme dans ce script lancé avec la commande sudo,
cette commande su sera lancée avec les privilèges du compte super-utilisateur root
alors, aucun mot de passe ne sera demandé pour que la commande su puisse être lancée.

michel@ubu:~$ cat ./scrTest.sh
#!/bin/bash

echo -e "\nDepuis le compte qui a été utilisé pour lancer le script :"
echo -e "UID  -> $UID\nPATH -> $PATH\nHOME -> $HOME"  

echo -e "\nDepuis le compte miczsh :"
su miczsh -c 'echo -e "UID  -> $UID\nPATH -> $PATH\nHOME -> $HOME\n"'

michel@ubu:~$ 
michel@ubu:~$ sudo ./scrTest.sh
[sudo] Mot de passe de michel : 

Depuis le compte qui a été utilisé pour lancer le script :
UID  -> 0
PATH -> /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin
HOME -> /root

Depuis le compte miczsh :
UID  -> 1001
PATH -> /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
HOME -> /home/miczsh

michel@ubu:~$ 

Voir la page man de la commande su :

man su

Dernière modification par MicP (Le 27/03/2021, à 16:25)

Hors ligne