C'est une question assez complexe liée au fichier sudoers et à la commande sudo en général.
REMARQUE: J'ai effectué ces modifications sur une machine dédiée exécutant Ubuntu Desktop 13.04, que j'utilise uniquement à des fins d'apprentissage. Je comprends que c'est un énorme risque pour la sécurité d'activer NOPASSWD sudo.
Question
Au départ, mon seul changement au fichier sudoers (/etc/sudoers) était une ligne, une spécification utilisateur qui aurait dû permettre à nicholsonjf d'exécuter toutes les commandes avec sudo sans avoir à entrer de mot de passe (voir la ligne qui commence par nicholsonjf):
# This file MUST be edited with the 'visudo' command as root.## Please consider adding local content in /etc/sudoers.d/ instead of# directly modifying this file.## See the man page for details on how to write a sudoers file.#Defaults env_resetDefaults mail_badpassDefaults secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"# Host alias specification# User alias specification# Cmnd alias specification# User privilege specificationroot ALL=(ALL:ALL) ALLnicholsonjf ALL=NOPASSWD: ALL# Members of the admin group may gain root privileges%admin ALL=(ALL) ALL# Allow members of group sudo to execute any command%sudo ALL=(ALL:ALL) ALL# See sudoers(5) for more information on "#include" directives:#includedir /etc/sudoers.d
Cependant, cela n'a pas fonctionné, et j'étais toujours invité à entrer mon mot de passe chaque fois que j'exécutais une commande en tant que nicholsonjf. Je n'ai pu commencer à exécuter des commandes sudo en tant que nicholsonjf qu'une fois que j'ai supprimé nicholsonjf des groupes sudo et admin.
Quelqu'un peut-il expliquer pourquoi cela a fonctionné?
Est-ce parce que l'utilisateur nicholsonjf héritait des droits sudo des deux spécifications de groupe de admin et sudo (vu ci-dessous dans le fichier sudoers), qui remplaçaient la spécification utilisateur nicholsonjf parce qu'ils étaient plus bas dans le fichier de configuration?
La ligne que vous avez ajoutée a été remplacée. De man sudoers:
Lorsque plusieurs entrées correspondent pour un utilisateur, elles sont appliquées dans l'ordre. Lorsqu'il y a plusieurs correspondances, la dernière correspondance est utilisée (ce qui n'est pas nécessairement la correspondance la plus spécifique).
Dans votre cas nicholsonjf était membre du groupe sudo donc pour lui cette ligne s'appliquait:
%sudo ALL=(ALL:ALL) ALL
Si vous souhaitez remplacer des entrées dans /etc/sudoers il suffit de mettre les nouvelles entrées après eux.
La nouvelle entrée devrait ressembler à
myuser ALL=(ALL) NOPASSWD: ALL pour un seul utilisateur, ou
Pour ne jamais demander un mot de passe à l'utilisateur actuel lorsque cet utilisateur utilise sudo exécutez cette commande:
echo "$USER ALL=(ALL:ALL) NOPASSWD: ALL" | sudo tee /etc/sudoers.d/dont-prompt-$USER-for-sudo-password
Il crée un fichier appelé /etc/sudoers.d/dont-prompt-<YOUR USERNAME>-for-sudo-password avec le contenu suivant:
<YOUR USERNAME> ALL=(ALL:ALL) NOPASSWD: ALL
Les avantages de le faire de cette façon plutôt que d'ajouter manuellement cette ligne à /etc/sudoers utiliser sudo visudo (comme suggéré par les autres réponses) sont
/etc/sudoers est parfois modifié par les mises à jour du système, alors que les fichiers dans /etc/sudoers.d ne sont pas
le sudo visudo la méthode est sujette aux erreurs (comme en témoigne cette question même), alors que copier et coller une commande est plus difficile à gâcher
Notez que vous pouvez toujours être invité à entrer le mot de passe dans d'autres contextes, tels que l'installation d'éléments à partir du Logiciel Ubuntu application graphique.
Selon sudo cat /etc/sudoers.d/README cette fonctionnalité (de mettre des fichiers sudoer supplémentaires dans /etc/sudoers.d) est activé par défaut depuis Debian 1.7. 2p1-1, qui sorti à la fin des années 1990 (Ubuntu est basé sur Debian).
En faisant des recherches, j'ai réalisé qu'il y avait une ligne dans le /etc/sudoers fichier qui n'est pas un commentaire, mais un directive cela fait n'importe quel fichier ou dossier sous le répertoire /etc/sudoers/* remplacer le contenu de /etc/sudoers.
C'est une petite directive sournoise, car elle semble être une ligne commentée au premier coup d'œil. Il ressemble à ceci:
#includedir /etc/sudoers.d
Voici comment j'ai implémenté l'utilisateur non root, sans mot de passe, dans une image Docker éphémère à utiliser dans un pipeline CICD avec l'image de base d'ubuntu: 18.04:
Utilisateur foo est ajouté aux deux le foo et sudo groupe.
Le répertoire personnel est défini sur /home/foo.
Le shell est défini sur /bin/bash.
Le sed la commande effectue des mises à jour en ligne du /etc/sudoers fichier à autoriser foo et root accès sans mot de passe des utilisateurs au sudo groupe.
Le sed la commande désactive le #includedir directive qui permettrait à tous les fichiers des sous-répertoires de remplacer ces mises à jour en ligne.