Duplicate possible:
Comment exécuter une application avec Sudo sans mot de passe?
J'ai créé un script préformant diverses tâches système, que j'exécute régulièrement, mais je dois utiliser Sudo pour exécuter le script, malgré le fait que je le possède parce qu'il exécute des commandes à privilèges root. Comment puis-je ajouter pour que Sudo me laisse exécuter ce fichier sans avoir à entrer mon mot de passe à chaque fois que je l'utilise?
Je sais qu'il y a des questions concernant l'exécution de commandes sans mot de passe, mais je n'ai pas réussi à en trouver une pour exécuter un fichier sans mot de passe.
Je suis conscient des risques pour la sécurité, mais je suis chez moi sur un ordinateur de confiance.
J'ai ajouté john ALL = NOPASSWD: /home/john/.script/hibernate.sh
à mon /etc/sudoers
mais lors de l'exécution de la commande Sudo sh /home/john/.script/hibernate.sh
, il me demande toujours mon mot de passe ...
Utilisez visudo
pour un environnement d’édition sécurisé permettant d’éditer le fichier sudoers. Ce script est un wrapper autour de vi
qui vérifie également la syntaxe lorsque vous enregistrez le fichier et ne vous permet pas de remplacer un fichier sudoers valide par un fichier non valide.
Ajouter une ligne comme ceci:
username ALL= NOPASSWD: /path/to/your/script
Le "ALL =" mérite quelques explications, il spécifie que l'autorisation est accordée lorsque l'utilisateur en question est connecté depuis n'importe quel emplacement, localement (console ou terminal) ou à distance (ssh, etc.).
Par souci d’exhaustivité, vous pouvez obtenir un effet similaire en définissant le bit setuid dans les autorisations du fichier.
Une partie un peu délicate est que, pour des raisons de sécurité, le noyau ignore les bits sur les scripts setuid
. Vous devez donc compiler un petit programme wrapper en C et l’utiliser pour appeler votre script. Enregistrez ceci sous runscript.c
:
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
int main()
{
setuid( 0 );
system( "/path/to/script.sh" );
return 0;
}
puis compiler avec
gcc runscript.c -o runscript
et mettez le bit setuid
sur l'exécutable:
Sudo chown root:root runscript
Sudo chmod 4755 runscript
Il est également important de vous assurer que votre script est uniquement accessible en écriture pour le compte root, car tous ceux qui peuvent le modifier pourront exécuter des programmes arbitraires:
Sudo chown root:root /path/to/script.sh
Sudo chmod 0711 /path/to/script.sh
Voici un article dont je tire le code du programme wrapper de: setuid on Shell scripts .
Du point de vue de la sécurité, les deux approches - celle avec Sudo
et celle avec setuid
- sont très mauvaises, mais seront probablement acceptables sur une machine personnelle. La différence est que chaque utilisateur du système pourra exécuter une commande setuid
, même sans être dans la sudoers
fichier. De plus, vous n'aurez évidemment pas besoin de préfixer la commande avec Sudo
.
Vous avez besoin de la balise "NOPASSWD".
Utilisez visudo et définissez quelque chose comme ceci à la fin du fichier:
nom d'utilisateur ALL = NOPASSWD:/bin/echo
Remplacez nom d'utilisateur par votre nom d'utilisateur et/bin/echo par la commande que vous souhaitez exécuter.
Vous devrez ajouter le chemin complet du programme que vous exécutez dans le fichier sudoers, pas le script. Je suppose que c'est hibernate, donc:
john ALL=NOPASSWD: /usr/sbin/pm-hibernate