Para dar sudo sin contraseña a un solo comando, crea un fichero en /etc/sudoers.d con visudo -f y escribe una regla como usuario ALL=(root) NOPASSWD: /ruta/absoluta argumentos. La ruta absoluta y los argumentos fijos limitan el permiso a esa orden exacta. NOPASSWD: ALL, en cambio, equivale a regalar root sin contraseña.
Regla NOPASSWD en sudoers para un solo comando: ejemplo completo con visudo
La regla se crea con visudo -f sobre un fichero nuevo dentro de /etc/sudoers.d, nunca abriendo el fichero con un editor cualquiera. El ejemplo usa un usuario deploy que solo debe recargar nginx tras un despliegue:
sudo visudo -f /etc/sudoers.d/deploy-nginxContenido del fichero:
# deploy puede recargar nginx sin contraseña, y nada más
deploy ALL=(root) NOPASSWD: /usr/bin/systemctl reload nginxAntes de escribir la ruta, compruébala con command -v systemctl. Según la distribución puede estar en /usr/bin o en /bin, y la regla solo casa con la ruta exacta. Después valida y prueba:
sudo visudo -c
sudo -l -U deploy
sudo -n /usr/bin/systemctl reload nginxvisudo -c revisa la sintaxis de todos los ficheros de sudoers. sudo -l -U deploy lista lo que ese usuario puede ejecutar. sudo -n, lanzado como deploy, falla en lugar de pedir contraseña, así que confirma si NOPASSWD se está aplicando.
Por qué usar visudo y /etc/sudoers.d en vez de editar /etc/sudoers a mano
visudo bloquea el fichero mientras lo editas y comprueba la sintaxis antes de guardar. Si encuentra un error, avisa y te deja corregirlo. Un /etc/sudoers roto puede dejar sudo inutilizable, y en un servidor sin contraseña de root eso significa recurrir a la consola de recuperación.
- Un fichero por permiso. Borrar el fichero revoca la regla sin tocar nada más.
- Separado del fichero principal. Los cambios que traiga un paquete en /etc/sudoers no se mezclan con los tuyos.
- Nombres sin punto. sudo ignora en /etc/sudoers.d los ficheros cuyo nombre contiene un punto o termina en
~:deploy-nginxse lee,deploy.confno. - Propietario root y modo 0440. Compruébalo con
ls -l /etc/sudoers.d; si copiaste el fichero desde otro sitio, corrige conchown root:rootychmod 0440.
Ruta absoluta en NOPASSWD: por qué sudoers la exige y cómo fijar los argumentos
sudoers exige la ruta completa del ejecutable: un nombre suelto como systemctl provoca un error de sintaxis en visudo. La ruta absoluta impide que alguien deje otro binario con el mismo nombre en un directorio de su PATH y lo ejecute como root.
Los argumentos son la otra mitad del control:
- Sin argumentos en la regla (
/usr/bin/systemctl): admite cualquier argumento, incluido parar o editar cualquier servicio. - Con argumentos exactos (
/usr/bin/systemctl reload nginx): solo esa línea de comando. - Con
""(/usr/local/bin/backup ""): el comando solo se acepta sin argumentos. - Con comodines (
/usr/bin/systemctl restart *): el asterisco también casa con espacios y admite más argumentos de los previstos. Evítalos.
Por qué no usar NOPASSWD: ALL en sudoers: comparación de riesgos
Con NOPASSWD: ALL, cualquier proceso que corra con tu usuario —un script comprometido, una dependencia maliciosa, una clave SSH robada— obtiene root con sudo -n sin ninguna interacción. La regla acotada reduce ese premio a un único comando.
| Qué se mide | Regla acotada con ruta absoluta | NOPASSWD: ALL | sudo con contraseña |
|---|---|---|---|
| Alcance sin contraseña | Una línea de comando exacta | Cualquier comando como root | Ninguno |
| Uso en automatización | Sí, para esa tarea | Sí, sin ningún límite | No, sudo -n falla |
| Si roban la sesión del usuario | Solo puede ejecutar esa orden | El atacante es root | Necesita además la contraseña |
Auditoría con sudo -l | Muestra la orden permitida | Muestra ALL, sin detalle | Depende del resto de reglas |
Una regla acotada sigue siendo peligrosa si el comando permitido abre una shell o lanza otros programas: editores como vi, paginadores como less, find con -exec o un script que el propio usuario puede modificar. Si autorizas un script, que pertenezca a root y nadie más pueda escribirlo. Para editar ficheros protegidos usa sudoedit, que trabaja sobre una copia con los permisos del usuario. La etiqueta NOEXEC puede impedir que el comando ejecute otros, pero no funciona con todos los binarios.
Orden de reglas en sudoers: la última coincidencia gana
Cuando varias reglas casan con el mismo usuario y comando, sudo aplica la última. Si /etc/sudoers.d se incluye al final de /etc/sudoers, tu regla NOPASSWD queda detrás de la regla general del grupo de administradores y prevalece. Si una línea posterior exige contraseña para ese usuario, anula tu regla y sudo -n seguirá fallando. sudo -l muestra las entradas en orden y ayuda a detectarlo.
Editar sudoers desde el móvil con termi1 sin quedarte fuera del servidor
visudo abre el editor configurado en el sistema, a menudo vi o nano, y ambos necesitan Esc, Ctrl y flechas. El teclado propio de termi1 incluye esas teclas que el teclado del sistema esconde, más un plano fn con F1–F12, PgUp/PgDn, Inicio y Fin.
- Ten una shell root de reserva. Abre
sudo -ien otra ventana de tmux antes de tocar sudoers; si algo falla, sigues teniendo root para arreglarlo. - Mantén la sesión viva. Con Mosh, termi1 conserva la sesión al pasar de wifi a datos, y tmux guarda lo que dejaste abierto al volver.
- Revisa antes de ejecutar. La IA de termi1 convierte una frase como «deja que deploy recargue nginx sin contraseña» en un comando que se escribe en el prompt sin pulsar Intro. En conexiones etiquetadas como producción, Production Guard retiene lo que borra, detiene o cambia algo antes de llegar al prompt.
Tus claves SSH pueden generarse en el móvil y la privada no sale del dispositivo. Más detalles en la terminal SSH para el móvil; puedes descargar termi1 para iPhone o consultar el centro de soporte técnico.
Preguntas frecuentes
¿Dónde se pone NOPASSWD en una regla de sudoers?
NOPASSWD se pone en una regla de sudoers justo antes del comando, tras los dos puntos: deploy ALL=(root) NOPASSWD: /usr/bin/systemctl reload nginx. La etiqueta se hereda por los comandos siguientes de la misma línea, así que conviene que esa línea contenga solo la orden que quieres liberar.
¿Por qué no funciona mi fichero en /etc/sudoers.d?
Un fichero en /etc/sudoers.d suele fallar por tres motivos: su nombre contiene un punto o termina en ~, una regla posterior exige contraseña y la anula, o la ruta del comando no coincide exactamente. Compruébalo con sudo visudo -c y con sudo -l como ese usuario.
¿Qué pasa si guardo sudoers con un error de sintaxis?
Guardar sudoers con un error de sintaxis puede dejar sudo sin funcionar para todos los usuarios. visudo lo evita porque comprueba la sintaxis antes de guardar y avisa del error. Si editas con otro editor y lo rompes, necesitarás una shell root ya abierta o la consola de recuperación.
¿Es seguro dar NOPASSWD a un script propio?
Dar NOPASSWD a un script propio solo es seguro si el script pertenece a root y ningún otro usuario puede modificarlo. Si quien tiene el permiso sudo puede editar el script, puede añadir cualquier orden y ejecutarla como root sin contraseña. Usa siempre ruta absoluta y argumentos fijos.