Necesito ejecutar algo como sudo sin contraseña, así que usé visudo
y agregué esto a mi sudoers
archivo:
MYUSERNAME ALL = NOPASSWD: /path/to/my/program
Luego lo probé:
$ sudo /path/to/my/program [sudo] password for MYUSERNAME:
¿Por qué pide una contraseña? ¿Cómo puedo ejecutar / usar comandos como root con un usuario no root, sin pedir una contraseña?
Responder
Usted tener otra entrada en el archivo sudoers
, que normalmente se encuentra en /etc/sudoers
, que también coincide con su usuario. La regla NOPASSWD
debe ser posterior a esa para que tenga prioridad.
Una vez hecho esto, sudo
le solicitará una contraseña normalmente para todos los comandos excepto /path/to/my/program
, que siempre le permitirá ejecutar sin pedir su contraseña.
Comentarios
Respuesta
Si hay varias entradas coincidentes en /etc/sudoers
, sudo usa la última. Por lo tanto, si puede ejecutar cualquier comando con una solicitud de contraseña, y desea poder ejecutar un comando en particular sin una solicitud de contraseña, necesita la excepción en último lugar.
myusername ALL = (ALL) ALL myusername ALL = (root) NOPASSWD: /path/to/my/program
Tenga en cuenta el uso de (root)
, para permitir que el programa se ejecute como root pero no como otros usuarios. (No otorgue más permisos que el mínimo requerido a menos que haya pensado en las implicaciones).
Nota para volver aders que no están ejecutando Ubuntu o que han cambiado la configuración de sudo predeterminada (sudo de Ubuntu está bien por defecto) : Ejecutar scripts de shell con privilegios elevados es arriesgado, debe comenzar desde un entorno limpio (una vez que shell ha comenzado, es demasiado tarde (ver Permitir setuid en scripts de shell ), por lo que necesita sudo para solucionarlo). Asegúrese de tener Defaults env_reset
en /etc/sudoers
o de que esta opción sea la predeterminada en tiempo de compilación (sudo sudo -V | grep env
debe incluir Reset the environment to a default set of variables
).
Comentarios
- ex para ir a root de jhon con sudo su an no pass —– > john ALL = (ALL) NOPASSWD: / bin / su
- @adrian Si desea permitir comandos arbitrarios como root, hazlo
john ALL=(ALL) NOPASSWD: all
. ‘ no tiene sentido ir a través desu
. - Pregunta: ¿Debo alterar los permisos de mi script de shell? para que pueda ser modificado y leído solo por el usuario root, por seguridad? Estoy ‘ pensando en que un atacante modifique el script, que tiene todos los permisos otorgados sin necesidad de contraseña, para que haga lo que quiere. Obviamente, el atacante no puede ‘ ni siquiera leer el archivo sudoers para saber qué scripts tienen este privilegio, pero aún puede intentar con todos mis scripts personalizados una vez que encuentre la carpeta en la que están. almacenado con la esperanza de que algunos estén permitidos, o algo así.
- @JeffreyLebowski Si tiene una regla sudo que ejecuta el script (directa o indirectamente) entonces ‘ Es vital que solo root (o las personas que tengan privilegios de root de todos modos) puedan escribir en el archivo de script, y en el directorio que contiene el archivo de script, y en su directorio principal, etc. No ‘ importa que cualquiera pueda leer el archivo de secuencia de comandos (a menos que contenga una contraseña o algo, pero esa ‘ es una mala idea, si hay ‘ una contraseña, debe estar en su propio archivo; de lo contrario, hay ‘ demasiado riesgo de filtrarla accidentalmente, por ejemplo, mediante copia pegar esa sección del código en una pregunta de este sitio).
- @alper No. Muy pocas cosas requieren reiniciar. Después de cambiar
sudoers
, no ‘ no necesitas hacer nada especial:sudo
lo marca cada vez.
Respuesta
ADVERTENCIA : esta respuesta se ha considerado insegura. Consulte los comentarios a continuación
Solución completa: Los siguientes pasos lo ayudarán a lograr el resultado deseado:
-
Cree un nuevo archivo de secuencia de comandos (reemplace
create_dir.sh
con el nombre de secuencia de comandos que desee):vim ~/create_dir.sh
El script se creará en el directorio de inicio del usuario
-
Agregue algunos comandos que solo
root
osudo
el usuario puede ejecutar como crear una carpeta en el nivel del directorio raíz:mkdir /abc
Nota: No agregue
sudo
a estos comandos. Guarde y salga (usando:wq!
) -
Asigne permisos de ejecución usando:
sudo chmod u+x create_dir.sh
-
Realice cambios para que este script no requiera una contraseña.
-
Abra
sudoers
archivo:sudo visudo -f /etc/sudoers
-
Agregue la siguiente línea al final:
ahmad ALL=(root) NOPASSWD: /home/ahmad/create_dir.sh
Reemplace
ahmad
con el nombre de usuario que sea. También asegúrese de que esta sea la última línea. Guarde y salga.
-
-
Ahora, cuando ejecute el comando, agregue
sudo
antes como:sudo ./create_dir.sh
Esto ejecutará los comandos dentro del archivo de secuencia de comandos sin pedir una contraseña.
Siga el sencillo pasos mencionados aquí http://step4wd.com/2013/09/14/run-root-commands-in-linux-ubuntu-without-password/
Comentarios
- Sería mejor si proporcionara los pasos relevantes aquí y utilizara el enlace como respaldo para obtener información más detallada. De esa manera, su respuesta conserva el valor posible incluso si ese vínculo ya no sería válido.
- Este consejo es inseguro. La
sudo
parte desudo chmod u+x create_dir.sh
no es necesaria ya que el usuario tiene (presumiblemente) la propiedad de su directorio personal. Dado que el usuario puede escribir encreate_dir.sh
, efectivamente le ha dado un shell root gratuito a ese usuario. - @Lekensteyn Lo que significa también para cualquier programa que se ejecute como usuario . También podría permitir que el usuario ejecute cualquier cosa con sudo sin contraseña.
- ¿Me estoy perdiendo algo? Creo que todo el
chmod
es innecesario, ya que está confiando ensudo
para elevar sus privilegios.
Respuesta
Creo que tu sintaxis es incorrecta. Al menos utilizo lo siguiente que me funciona:
myusername ALL=(ALL) NOPASSWD: /path/to/executable
Comentarios
- El
(ALL)
parte es opcional, dejarla fuera tiene exactamente el mismo efecto. Sin embargo, tener(root)
sería mejor, pero su ausencia no ‘ no explica el problema. - +1 para sudo para este comando y nada más! No hay razón para romper todo el sistema …
- @Johan: Eso ya estaba en la pregunta.
Respuesta
Si desea evitar tener que usar sudo ni tener que cambiar el archivo de configuración de sudoers, puede usar:
sudo chown root:root path/to/command/COMMAND_NAME sudo chmod 4775 path/to/command/COMMAND_NAME
Este hará que el comando se ejecute como root sin la necesidad de sudo.
Comentarios
- Wow, nunca había oído hablar de esta solución antes, alucinante
- @RyanNerd: esta no es una solución segura. Ahora el OP no solo puede ejecutar el comando como root sin una contraseña, sino que ahora cualquiera puede ejecutar el comando como usuario root.
- » chmod 4775 filename » es unidireccional. En segundo lugar, quizás una mejor manera de SETUID , sin redefinir los permisos de archivos completos, es » chmod u + s filename »
- sudo chmod 005 es seguro. No ‘ no desea otorgar permisos de escritura al usuario actual. De lo contrario, cualquiera en su sesión podría hacer cualquier cosa con su script.
Responder
Si tiene una distribución como Manjaro , primero debe tratar con un archivo que anula la definición de / etc / sudoers, puede eliminarlo o trabajar directamente con ese archivo para agregar sus nuevas configuraciones.
Este archivo es:
sudo cat /etc/sudoers.d/10-installer
La ÚNICA forma de verlo es bajo privilegios de root, no puede listar este directorio sin él, este archivo es específico de Manjaro, puede encontrar esta configuración con otro nombre , pero en el mismo directorio.
En el archivo que elija, puede agregar las siguientes líneas para obtener la configuración que desee:
Ignorar la autenticación de un grupo
%group ALL=(ALL) NOPASSWD: ALL
o Ignorar la autenticación de un usuario
youruser ALL=(ALL) NOPASSWD: ALL
o Ignorar la autenticación de un ejecutable para un usuario específico
youruser ALL=(ALL) NOPASSWD: /path/to/executable
NOTA RÁPIDA: está abriendo una puerta para usar SUDO sin autenticación, eso significa que puede ejecutar todo modificando todo desde su sistema, úselo con responsabilidad.
Responder
Verifique que sudo no tenga un alias. Ejecutar así
/usr/bin/sudo /path/to/my/program
Por ejemplo, un alias de shell como este:
alias sudo="sudo env PATH=$PATH"
puede causar este comportamiento.
Comentarios
- Tienes razón, mi comentario estaba fuera de orden aquí , lo siento . Sin embargo, ‘ estoy intrigado: ¿cómo espera que el alias cambie el procesamiento de
sudoers
por sudo? ¿O estás hablando de redireccionarsudo
a algo que siempre imprime este mensaje de error para obtener contraseñas? Ese es el caso poco probable aquí … - Estaba teniendo el mismo problema que el OP. Resultó ser causado por tener
alias sudo="sudo env PATH=$PATH"
en mi~/.bashrc
. En lugar de resolverlo por mí mismo y ocuparme de mis asuntos a ciegas, envié mi respuesta como una posible solución para cualquier otra persona que aparezca en este hilo. - Eso ‘ está bien, pero cuando no es obvio (que en este caso no es ‘ t al menos para algunas personas) es bueno poner una explicación en la respuesta para proporcionar algo de contexto y evitar que la gente utilice a ciegas encantamientos mágicos. +2 (- (- 1) + +1). 🙂
Respuesta
Cuando ejecute su script, debe ejecutarlo como sudo /path/to/my/script
.
Editar: Según su comentario a otra respuesta, desea ejecutar esto desde un icono. Deberá crear un archivo .desktop
que ejecute su programa con sudo, al igual que en la terminal.
También podría considerar usar gtk-sudo
para una solicitud de contraseña visual.
Probablemente debería considerar la idea de que no debería estar ejecutando cosas como root y que cambiar el sistema más adelante para que no si necesita permisos de root sería una mejor manera de hacerlo.
Comentarios
- No haga que los scripts de shell sean setuid . Consulte Permitir setuid en scripts de shell .
- Consideré ni siquiera mencionarlo porque ‘ es una mala opción. Lo acabo de eliminar porque ‘ me preocupa que este autor de la pregunta pueda usar el consejo incluso con la advertencia de que era un mal consejo.
Respuesta
Esto me resolvió el problema (también probé algunas de las otras respuestas, que podrían haberme ayudado):
El script que estaba llamando estaba en /usr/bin
, un directorio para el que no tengo permisos de escritura (aunque normalmente puedo leer cualquier archivo allí). El script fue chmodded + x (permiso ejecutable), pero todavía no funcionó. Moviendo este archivo a una ruta en mi directorio de inicio, en lugar de /usr/bin
, finalmente pude llamarlo con sudo sin ingresar una contraseña.
También algo que dudado (aclarando para futuros lectores): Necesita ejecutar su script como sudo. Escriba sudo
cuando llame al script. No use sudo
para el comando dentro de su secuencia de comandos que realmente necesita root (cambiar la luz de fondo del teclado en mi caso). Quizás eso también funcione, pero no es necesario, y parece una mejor solución para no hacerlo.
Comentarios
- El segundo párrafo tenía la respuesta a mi problema
- @MuhammadAhmadZafar Glad ¡ayudó!
- Usar
sudo
dentro de una secuencia de comandos está perfectamente bien siempre que tenga los derechos apropiados (establecidos ensudoers
) para ejecutar el comando en cuestión sin contraseña. Hace que las cosas sean un poco más seguras. - Realmente podría usar esta respuesta reescrita como un paso a paso ‘ así es como se hace ‘ en lugar de como un diálogo con las otras respuestas
- @WalrustheCat Buen punto. Releyendo mi respuesta, creo que yo mismo podría haber estado un poco confundido. Sin embargo, en este momento, ‘ no recuerdo cuál era la situación exacta, así que no puedo ‘ hacer una descripción mejor. Si lo averigua, tal vez una combinación de varias respuestas, ¡envíe una nueva respuesta!
Respuesta
Otra posibilidad podría ser instalar, configurar y luego usar super para ejecutar su script como
super /path/to/your/script
Si desea ejecutar algún ejecutable (por ejemplo, que ha compilado en ELF binario de algún código fuente de C), que es no un script – como root, podría considerar hacerlo setuid (y en realidad /bin/login
, /usr/bin/sudo
y /bin/su
y super
están usando esa técnica). Sin embargo, tenga mucho cuidado, podría abrir un enorme agujero de seguridad .
Concretamente, su programa debería estar codificado paranoicamente (por lo tanto, verifique todos los argumentos y el entorno y las condiciones externas antes de » actuar «, asumiendo un usuario potencialmente hostil), luego podría usar seteuid (2) y amigos (consulte también setreuid (2) ) con cuidado ( ver también capacidades (7) & credenciales (7) & execve (2) …)
Usted » use chmod u+s
(lea chmod (1) ) al instalar dicho binario.
Pero tenga mucho cuidado .
Lea muchas cosas sobre setuid , incluido Linu avanzado x Programación , antes de codificar tal cosa.
Observe que un script, o cualquier shebang -ed cosa, no se puede establecer. Pero podría codificar (en C) un pequeño setuid-binary envolviéndolo.
Tenga en cuenta que en Linux, el código de la aplicación interactúa con el kernel de Linux usando syscalls (2) . La mayoría de ellos podrían fallar, consulte errno (3) . Muchas aplicaciones de Linux (por ejemplo, GNU bash , GNU make , GNU gdb , GNOME ) son de código abierto: se le permite descargar, estudiar y contribuir a su código fuente.
Comentarios
- La programación avanzada de Linux es un enlace muerto.
Respuesta
Idealmente, si personaliza los comandos que se pueden ejecutar a través de sudo
, debería realizar estos cambios en un archivo separado en /etc/sudoers.d/
en lugar de editar el archivo sudoers
directamente. También debe usar siempre visudo
para editar los archivos. NUNCA debe otorgar NOPASSWD
en ALL
comandos.
Ejemplo: sudo visudo -f /etc/sudoers.d/mynotriskycommand
Inserte su línea otorgando permiso: myuser ALL= NOPASSWD: /path/to/your/program
Luego guarde y salga y visudo
le advertirá si tiene algún error de sintaxis.
Puede ejecutar sudo -l
para ver los permisos que se le han otorgado a su usuario, si alguno de los usuarios específicos NOPASSWD
aparecen comandos ANTES de cualquier comando %groupyouarein ALL=(ALL) ALL
en la salida, se le pedirá su contraseña.
Si encuentra usted mismo crea muchos de estos archivos sudoers.d, entonces tal vez desee crearlos con un nombre por usuario para que sean más fáciles de visualizar. Tenga en cuenta que el orden de los NOMBRES DE ARCHIVO y de las REGLAS dentro del archivo es muy importante, gana el ÚLTIMO que se cargue, ya sea MÁS o MENOS permisivo que las entradas anteriores.
Puede controlar el orden del nombre del archivo usando un prefijo de 00-99 o aa / bb / cc, aunque también tenga en cuenta que si tiene CUALQUIER archivo que no tiene prefijo numérico, se cargará después de los archivos numerados, anulando la configuración. Esto se debe a que, dependiendo de la configuración del idioma, la «ordenación léxica», el shell usa primero los números de ordenación y luego puede intercalar mayúsculas y minúsculas al ordenar en orden «ascendente».
Intente ejecutar printf "%s\n" {{0..99},{A-Z},{a-z}} | sort
y printf "%s\n" {{0..99},{A-Z},{a-z}} | LANG=C sort
para ver si su idioma actual imprime AaBbCc
etc o ABC
y luego abc
para determinar cuál sería la mejor «última» letra prefijo para usar ser.
Responder
Para permitir que cualquier usuario ejecute un programa como sudo sin pedir la contraseña, puede agregar la siguiente línea
%sudo ALL=(root) NOPASSWD: /path/to/your/program
en /etc/sudoers
Tenga en cuenta que % sudo lo hace.
Comentarios
- Si bien esa ‘ es una forma de lograr una regla sudo, no es ‘ t responda la pregunta sobre por qué establecer el indicador NOPASSWD en esta regla aún resultó en una solicitud de contraseña. Vea la respuesta aceptada para tener una idea de por qué sucedió.
Respuesta
Lo siguiente es para el caso en el que desea ejecutar un comando sin contraseña solo si tiene un conjunto específico de opciones, donde una parte de las opciones es la variable . AFAIK, no es posible usar variables o rangos de valores en las declaraciones de sudoers, es decir, puede permitir el acceso explícitamente a command option1
pero no a command option2
usando:
user_name ALL=(root) /usr/bin/command option1
pero si la estructura es command option1 value1
, donde value1
puede variar, necesitaría tener líneas sudoers explícitas para cada valor posible de value1
. El script de shell proporciona una forma de evitarlo.
Esta respuesta se inspiró en la respuesta de M. Ahmad Zafar y soluciona el problema de seguridad allí.
- Cree un script de shell en el que llamar al comando sin
sudo
. - Guarde el script en una carpeta con privilegios de root (por ejemplo,
/usr/local/bin/
), haga el archivo de propiedad raíz (por ejemplo,chown root:wheel /usr/local/bin/script_name
) sin acceso de escritura para otros (por ejemplo,chmod 755 /usr/local/bin/script_name
). -
Agregue la excepción a los sudoers usando visudo:
user_name ALL=(root) NOPASSWD: /usr/local/bin/script_name
. -
Ejecute su secuencia de comandos
sudo script_name
.
Por ejemplo, quiero cambiar el tiempo de espera de la pantalla en macOS. Esto se hace usando:
sudo pmset displaysleep time_in_minutes
Considero que cambiar el tiempo de espera de suspensión es una acción inocente que no justifica la molestia de escribir la contraseña, pero pmset
puede hacer muchas cosas y me gustaría mantener estas otras cosas detrás de la contraseña de sudo.
Así que tengo lo siguiente secuencia de comandos en /usr/local/bin/ds
:
#!/bin/bash if [ $# -eq 0 ]; then echo "To set displaysleep time, run "sudo ds [sleep_time_in_minutes]"" else if [[ $1 =~ ^([0-9]|[1-9][0-9]|1[0-7][0-9]|180)$ ]]; then pmset displaysleep $1 else echo "Time must be 0..180, where 0 = never, 1..180 = number of minutes" fi fi
Al final del archivo sudoers
tengo la siguiente línea:
user_name ALL=(root) NOPASSWD: /usr/local/bin/ds
Para establecer el tiempo de espera en 3 minutos, ejecuto mi secuencia de comandos desde la cuenta de usuario normal user_name
:
sudo ds 3
PD La mayor parte de mi script es validación de entrada, que no es obligatoria, por lo que lo siguiente también funcionaría:
#!/bin/bash pmset displaysleep $1
Respuesta
Alternativamente, puede usar python pudo paquete.
Instalación:
user$ sudo -H pip3 install pudo # you can install using pip2 also
A continuación se muestra el fragmento de código para usar en la automatización de Python para ejecutar comandos con privilegios de root:
user$ python3 # or python2 >>> import pudo >>> (ret, out) = pudo.run(("ls", "/root")) # or pudo.run("ls /root") >>> print(ret) >>> 0 >>> print(out) >>> b"Desktop\nDownloads\nPictures\nMusic\n"
A continuación se muestra el ejemplo de cmd para ejecutar comandos con privilegios de root:
user$ pudo ls /root Desktop Downloads Pictures Music
Respuesta
En el script sudoers
que está dentro de / etc / descomente la línea que se indica a continuación:
#includedir /etc/sudoers.d
Cree un archivo con cualquier nombre dentro del directorio /etc/sudoers.d/ y agregue el contenido como se indica en las respuestas máximas. Como para todos los usuarios como root
#!/bin/bash ALL ALL = NOPASSWD: /path/of/the/script/which/you/want/to/run/as/root
Esta es la forma más segura de ejecutar el script con permiso de root.
/path/to/my/program
fuera un script de Python?.bashrc
)? ¿O incluso un script de shell dentro de/usr/local/sbin
? Para probar./etc
, pero algunos sistemas lo ponen en otro lugar. Si no puede ‘ t encontrarlo, intenteman sudoers
. La ubicación local de ese archivo debe sustituirse en elman
página en el momento en quesudo
se creó para ese sistema.