#1 Le 26/03/2021, à 11:37
- Wlan0
Lancer mon script avec un seule sudo
Bonjour
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, à 11:40
- MicP
Re : Lancer mon script avec un seule sudo
Bonjour
…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, à 12:01)
Hors ligne
#3 Le 26/03/2021, à 12: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ô.
Ce compte ne servira plus : vous pouvez le supprimer si le coeur vous en dit...
Laissé par l'auteur pour historique.
Hors ligne
#4 Le 26/03/2021, à 13:07
- Tawal
Re : Lancer mon script avec un seule sudo
Hello,
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.
Useless Use of Cat Award
Filenames and Pathnames in Shell: How to do it Correctly
À chaque problème sa solution, à chaque solution son moyen, si pas de moyen, toujours le problème !
Hors ligne
#5 Le 26/03/2021, à 13: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 le problème solutionné, 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, à 13:57
- Tawal
Re : Lancer mon script avec un seule sudo
Merci erresse.
Je ne le savais pas
Le savoir n'a d’intérêt que si on le transmet.
Useless Use of Cat Award
Filenames and Pathnames in Shell: How to do it Correctly
À chaque problème sa solution, à chaque solution son moyen, si pas de moyen, toujours le problème !
Hors ligne
#7 Le 26/03/2021, à 14: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, à 14:54)
Hors ligne
#8 Le 26/03/2021, à 15: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.
Useless Use of Cat Award
Filenames and Pathnames in Shell: How to do it Correctly
À chaque problème sa solution, à chaque solution son moyen, si pas de moyen, toujours le problème !
Hors ligne
#9 Le 26/03/2021, à 15: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 le problème solutionné, 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, à 17: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, à 17:12)
Hors ligne
#11 Le 26/03/2021, à 17: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, à 20:07
- Tawal
Re : Lancer mon script avec un seule sudo
@MicP
[ "x$(id -u)" != "x0" ]
À quoi sert le x devant la variable ?
Je l'avais lu quelque part mais je ne m'en souviens plus
C'est pour s'assurer de ... ?
Merci
Le savoir n'a d’intérêt que si on le transmet.
Useless Use of Cat Award
Filenames and Pathnames in Shell: How to do it Correctly
À chaque problème sa solution, à chaque solution son moyen, si pas de moyen, toujours le problème !
Hors ligne
#13 Le 26/03/2021, à 20: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.
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#14 Le 26/03/2021, à 21: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.
Useless Use of Cat Award
Filenames and Pathnames in Shell: How to do it Correctly
À chaque problème sa solution, à chaque solution son moyen, si pas de moyen, toujours le problème !
Hors ligne
#15 Le 26/03/2021, à 22: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, à 22:26)
"A computer is like air conditioning: it becomes useless when you open windows." (Linus Torvald)
Hors ligne
#16 Le 26/03/2021, à 23: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 26/03/2021, à 23:03)
Le savoir n'a d’intérêt que si on le transmet.
Useless Use of Cat Award
Filenames and Pathnames in Shell: How to do it Correctly
À chaque problème sa solution, à chaque solution son moyen, si pas de moyen, toujours le problème !
Hors ligne
#17 Le 26/03/2021, à 23:07
- MicP
Re : Lancer mon script avec un seule sudo
… À quoi sert le x devant la variable ? …
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 26/03/2021, à 23:22
- Tawal
Re : Lancer mon script avec un seule sudo
@MicP
Merci
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é
Dernière modification par Tawal (Le 26/03/2021, à 23:25)
Le savoir n'a d’intérêt que si on le transmet.
Useless Use of Cat Award
Filenames and Pathnames in Shell: How to do it Correctly
À chaque problème sa solution, à chaque solution son moyen, si pas de moyen, toujours le problème !
Hors ligne
#19 Le 26/03/2021, à 23: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.
Ce compte ne servira plus : vous pouvez le supprimer si le coeur vous en dit...
Laissé par l'auteur pour historique.
Hors ligne
#20 Le 27/03/2021, à 03: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, à 06:03)
Hors ligne
#21 Le 27/03/2021, à 11: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.
Useless Use of Cat Award
Filenames and Pathnames in Shell: How to do it Correctly
À chaque problème sa solution, à chaque solution son moyen, si pas de moyen, toujours le problème !
Hors ligne
#22 Le 27/03/2021, à 11:28
- Zakhar
Re : Lancer mon script avec un seule sudo
@Zakhar
Je comprends pas bien le problème.
Tu peux lancer le script avecsudo ./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 !
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, à 11:31)
"A computer is like air conditioning: it becomes useless when you open windows." (Linus Torvald)
Hors ligne
#23 Le 27/03/2021, à 11: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.
Useless Use of Cat Award
Filenames and Pathnames in Shell: How to do it Correctly
À chaque problème sa solution, à chaque solution son moyen, si pas de moyen, toujours le problème !
Hors ligne
#24 Le 27/03/2021, à 14:13
- Zakhar
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
Oui, très probablement au prix d'un peu plus de CPU et en mettant une redirection vers /dev/null à la fin !
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, à 14:14)
"A computer is like air conditioning: it becomes useless when you open windows." (Linus Torvald)
Hors ligne
#25 Le 27/03/2021, à 14: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, à 15:25)
Hors ligne