Esta es una pregunta bastante compleja relacionada con el archivo sudoers y el comando sudo en general.
NOTA: He realizado estos cambios en una máquina dedicada que ejecuta Ubuntu Desktop 13.04, que utilizo únicamente con fines de aprendizaje. Entiendo que es un gran riesgo de seguridad habilitar NOPASSWD sudo.
Pregunta
Inicialmente, mi único cambio en el archivo sudoers (/etc/sudoers) era una línea, una especificación de usuario que debería haber permitido a nicholsonjf ejecutar todos los comandos con sudo sin tener que ingresar una contraseña (vea la línea que comienza con 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
Sin embargo, esto no funcionó, y todavía se me pedía mi contraseña cada vez que ejecutaba un comando como nicholsonjf. Solo pude comenzar a ejecutar comandos sudo como nicholsonjf una vez que eliminé a nicholsonjf de los grupos sudo y admin.
¿Alguien puede explicar por qué esto funcionó?
Es porque el usuario nicholsonjf estaba heredando derechos sudo de las dos especificaciones de grupo de admin y sudo (visto a continuación en el archivo sudoers), que anulaban la especificación de usuario nicholsonjf porque estaban más abajo en el archivo de configuración?
Cuando varias entradas coinciden para un usuario, se aplican en orden. Cuando hay varias coincidencias, se utiliza la última coincidencia (que no es necesariamente la más específica).
En su caso nicholsonjf era miembro del grupo sudo así que para él esta línea se aplica:
%sudo ALL=(ALL:ALL) ALL
Si desea anular entradas en /etc/sudoers simplemente coloque las nuevas entradas después de ellas.
La nueva entrada debería verse así
myuser ALL=(ALL) NOPASSWD: ALL para un solo usuario, o
Para nunca solicitar una contraseña al usuario actual cuando ese usuario usa sudo ejecute este comando:
echo "$USER ALL=(ALL:ALL) NOPASSWD: ALL" | sudo tee /etc/sudoers.d/dont-prompt-$USER-for-sudo-password
Crea un archivo llamado /etc/sudoers.d/dont-prompt-<YOUR USERNAME>-for-sudo-password con los siguientes contenidos:
<YOUR USERNAME> ALL=(ALL:ALL) NOPASSWD: ALL
Las ventajas de hacerlo de esta manera manualmente añadiendo la línea /etc/sudoers utilizar sudo visudo (como lo sugieren las otras respuestas) son
/etc/sudoers a veces se modifica mediante actualizaciones del sistema, mientras que los archivos de /etc/sudoers.d no
el sudo visudo el método es propenso a errores (como lo demuestra esta misma pregunta), mientras que copiar y pegar un comando es más difícil de estropear
Tenga en cuenta que es posible que aún se le solicite la contraseña en otros contextos, como instalar cosas de la Software de Ubuntu aplicación gráfica.
De acuerdo con sudo cat /etc/sudoers.d/README esta característica (de poner archivos sudoer adicionales en /etc/sudoers.d) se ha habilitado de forma predeterminada desde Debian 1.7. 2p1-1, que salió a finales de la década de 1990 (Ubuntu es basado en Debian).
Mientras investigaba esto, me di cuenta de que hay una línea en el /etc/sudoers archivo que no es un comentario, sino un directriz eso hace que cualquier archivo o carpeta en el directorio /etc/sudoers/* sobrescribir el contenido de /etc/sudoers.
Esta es una pequeña directiva astuta, ya que parece ser una línea comentada a primera vista. Se parece a esto:
#includedir /etc/sudoers.d
Así es como implementé el usuario sin contraseña y sin root en una imagen efímera de Docker para usar en una canalización CICD con la imagen base de ubuntu: 18.04:
Usuario foo se añade a los dos la foo y sudo grupo.
El directorio de inicio está configurado en /home/foo.
El shell está configurado en /bin/bash.
El sed el comando realiza actualizaciones en línea del /etc/sudoers archivo para permitir foo y root acceso sin contraseña de los usuarios al sudo grupo.
El sed comando desactiva el #includedir directiva que permitiría que cualquier archivo en subdirectorios anule estas actualizaciones en línea.