Comment exécuter des commandes sudo spécifiques sans mot de passe?

211

Sur une machine particulière, j'ai souvent besoin d'exécuter des sudocommandes de temps en temps. Je peux très bien entrer le mot de passe sudodans la plupart des cas.

Cependant, il y a trois sudocommandes que je veux exécuter sans entrer de mot de passe :

  • sudo reboot
  • sudo shutdown -r now
  • sudo shutdown -P now

Comment puis-je exclure ces commandes de la protection par mot de passe sudo?

Bhavesh Diwan
la source

Réponses:

283

Utilisez la NOPASSWDdirective

Vous pouvez utiliser la NOPASSWDdirective dans votre /etc/sudoersfichier .

Si votre utilisateur est appelé useret votre hôte est appelé, hostvous pouvez ajouter ces lignes à /etc/sudoers:

user host = (root) NOPASSWD: /sbin/shutdown
user host = (root) NOPASSWD: /sbin/reboot

Cela permettra à l'utilisateur userd'exécuter les commandes souhaitées hostsans entrer de mot de passe. Toutes les autres sudocommandes ed nécessitent toujours un mot de passe.

Les commandes spécifiées dans le sudoersfichier doivent être entièrement qualifiées (c'est-à-dire en utilisant le chemin absolu de la commande à exécuter), comme décrit dans la sudoerspage de manuel . Fournir un chemin relatif est considéré comme une erreur de syntaxe.

Si la commande se termine par un /caractère de fin et pointe vers un répertoire, l'utilisateur pourra exécuter n'importe quelle commande de ce répertoire (mais pas dans les sous-répertoires qu'il contient). Dans l'exemple suivant, l'utilisateur userpeut exécuter n'importe quelle commande du répertoire /home/someuser/bin/:

user host = (root) NOPASSWD: /home/someuser/bin/

Remarque: utilisez toujours la commande visudopour éditer le sudoersfichier afin de vous assurer de ne pas vous verrouiller hors du système - juste au cas où vous écrivez accidentellement quelque chose d'incorrect dans le sudoersfichier. visudova enregistrer votre fichier modifié à un emplacement temporaire et ne remplacera le vrai sudoersfichier si le fichier modifié peut être analysé sans erreurs.

Utiliser /etc/sudoers.dau lieu de modifier/etc/sudoers

Au lieu de modifier le /etc/sudoersfichier, vous pouvez ajouter les deux lignes à un nouveau fichier, par /etc/sudoers.dexemple /etc/sudoers.d/shutdown. C’est un moyen élégant de séparer les différentes modifications apportées aux sudodroits et de laisser le sudoersfichier original intact pour faciliter les mises à niveau.

Remarque: à nouveau, vous devez utiliser la commande visudopour modifier le fichier afin de vous assurer de ne pas vous verrouiller hors du système:

sudo visudo -f /etc/sudoers.d/shutdown 

Cela garantit également automatiquement que le propriétaire et les autorisations du nouveau fichier sont définis correctement.

Si sudoersest foiré

Si vous n'avez pas l'habitude visudod'éditer vos fichiers et que vous avez ensuite accidentellement foiré /etc/sudoersou foiré un fichier, /etc/sudoers.dvous serez bloqué sudo.

La solution pourrait être de réparer les fichiers en utilisant pkexecune alternative à sudo.

Pour réparer /etc/sudoers:

pkexec visudo

Pour réparer /etc/sudoers.d/shutdown:

pkexec visudo -f /etc/sudoers.d/shutdown

Si la propriété et / ou les autorisations sont incorrectes pour un sudoersfichier quelconque , le fichier sera ignoré, de sudosorte que vous risquez également de vous retrouver bloqué dans cette situation. Encore une fois, vous pouvez utiliser pkexecpour résoudre ce problème.

Les autorisations correctes devraient être comme ceci:

$ ls -l /etc/sudoers.d/shutdown 
-r--r----- 1 root root 86 Jul 16 15:37 /etc/sudoers.d/shutdown

Utilisez pkexeccomme ceci pour corriger la propriété et les autorisations :

pkexec chown root:root /etc/sudoers.d/shutdown
pkexec chmod 0440 /etc/sudoers.d/shutdown
mgd
la source
2
Les deux lignes font spécifiquement référence à ces deux commandes. Si les droits ne sont pas accordés d'une userautre manière, sudoaucune autre commande ne peut être utilisée par cet utilisateur. Regardez man sudoet man sudoers.
mgd
4
@StanKurdziel J'ai essayé avec cette ligne sous Mac OS X Yosemite et il a bien fonctionné: mgd ALL=(root) NOPASSWD: /var/root/test. Je suis utilisateur mgdet ALLsignifie "de tous les hôtes" . /var/root/testest un simple « Bonjour tout le monde » script shell avec des autorisations: -rwx------ 1 root wheel 27 12 Jun 09:54 /var/root/test. Je n'ai apporté aucune autre modification au système.
mgd
2
Que hostcontient le fichier sudoers?
user106563
1
Ce n'est pas une réponse, c'est un guide presque complet sur la directive NOPASSWD. Je vous remercie.
Eray
1
@ Michael, veuillez lire la page de manuel. Tout est écrit ici. Pour le citer: Cependant, vous pouvez également spécifier des arguments de ligne de commande (y compris des caractères génériques). Vous pouvez également spécifier "" pour indiquer que la commande peut uniquement être exécutée sans arguments de ligne de commande.
mgd
3

Désolé, mais il y a tellement de confusion à propos de cela et de réponses très compliquées, que j’ai le sentiment que je dois faire la part des choses avant que quelqu'un comprenne mal et ne fasse quelque chose de fou.

Utiliser visudo !!

Ajoutez les lignes suivantes à la configuration:

ALL ALL=NOPASSWD: /sbin/reboot,/sbin/shutdown

Cela permet aux commandes, au redémarrage et à l’arrêt avec tous les paramètres d’être exécutés par n’importe quel utilisateur.

S'il vous plaît stackexchange, donnez simplement des réponses simples et succinctes.

Hibou
la source