¿Cómo ejecutar un programa específico como root sin una solicitud de contraseña?

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

  • ¿funcionaría esto aún si /path/to/my/program fuera un script de Python?
  • ¿Puede el programa en lugar de ser un alias, configurado para bash (es decir, en .bashrc)? ¿O incluso un script de shell dentro de /usr/local/sbin? Para probar.
  • Nikos: no, no puede ser un alias. Debe apuntar a una ruta real.
  • ¿sudoers? ¿dónde está? Es difícil usar tu respuesta (
  • @VasiliiSuricov: Suele ser ‘ en /etc, pero algunos sistemas lo ponen en otro lugar. Si no puede ‘ t encontrarlo, intente man sudoers. La ubicación local de ese archivo debe sustituirse en el man página en el momento en que sudo se creó para ese sistema.

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 de su.
  • 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:

  1. 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

  2. Agregue algunos comandos que solo root o sudo 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!)

  3. Asigne permisos de ejecución usando:

    sudo chmod u+x create_dir.sh 
  4. Realice cambios para que este script no requiera una contraseña.

    1. Abra sudoers archivo:

      sudo visudo -f /etc/sudoers 
    2. 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.

  5. 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 de sudo 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 en create_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 en sudo 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 redireccionar sudo 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 en sudoers) 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í.

  1. Cree un script de shell en el que llamar al comando sin sudo.
  2. 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).
  3. Agregue la excepción a los sudoers usando visudo:

    user_name ALL=(root) NOPASSWD: /usr/local/bin/script_name.

  4. 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.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *