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?
/path/to/my/program
fuera un script de Python?.bashrc
) ¿O incluso un script de shell dentro/usr/local/sbin
? Para probar./etc
, está dentro , pero algunos sistemas lo colocan en otro lugar. Si no puedes encontrarlo, inténtaloman sudoers
. La ubicación local para ese archivo debe sustituirse en laman
página en el momento en quesudo
se creó ese sistema.Si hay varias entradas coincidentes
/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, necesitará la excepción al final.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 los lectores que no ejecutan Ubuntu o que han cambiado la configuración de sudo predeterminada (el sudo de Ubuntu está bien de forma predeterminada) : ejecutar scripts de shell con privilegios elevados es arriesgado, debe comenzar desde un entorno limpio (una vez que el shell ha comenzado, es demasiado tarde (consulte Permitir setuid en los scripts de shell ), por lo que necesita sudo para encargarse de eso). Asegúrese de que usted tiene
Defaults env_reset
en/etc/sudoers
o que esta opción es el valor predeterminado de tiempo de compilación (sudo sudo -V | grep env
debe incluirReset the environment to a default set of variables
).fuente
john ALL=(ALL) NOPASSWD: all
. No tiene sentido pasar porsu
.sudoers
, no es necesario hacer nada especial:sudo
cheques cada vez.ADVERTENCIA : esta respuesta se ha considerado insegura. Ver comentarios a continuación
Solución completa: los siguientes pasos lo ayudarán a lograr el resultado deseado:
Cree un nuevo archivo de script (reemplace
create_dir.sh
con el nombre de script deseado):El script se creará en el directorio de inicio del usuario.
Añadir algunos comandos que sólo una
root
osudo
usuario puede ejecutar como crear una carpeta en el nivel de directorio raíz:Nota: No agregue
sudo
a estos comandos. Guardar y salir (usando:wq!
)Asignarle permisos de ejecución usando:
Realice cambios para que este script no requiera una contraseña.
Abre el
sudoers
archivo:Agregue la siguiente línea al final:
Reemplace
ahmad
con su nombre de usuario. También asegúrese de que esta sea la última línea. Guardar y Salir.Ahora, cuando ejecute el comando, agregue
sudo
antes:Esto ejecutará los comandos dentro del archivo de script sin pedir una contraseña.
Siga los sencillos pasos mencionados aquí http://step4wd.com/2013/09/14/run-root-commands-in-linux-ubuntu-without-password/
fuente
sudo
parte desudo chmod u+x create_dir.sh
es innecesaria ya que el usuario tiene (presumiblemente) la propiedad sobre su directorio de inicio. Dado que el usuario puede escribircreate_dir.sh
, efectivamente le ha dado un shell raíz gratuito a ese usuario.chmod
es innecesario, ya que confías ensudo
elevar tus privilegios.Creo que tu sintaxis está mal. Al menos uso lo siguiente que me funciona:
fuente
(ALL)
parte es opcional, dejarla afuera tiene exactamente el mismo efecto. Sin(root)
embargo, tener sería mejor, pero su ausencia no explica el problema.Si desea evitar tener que usar sudo ni cambiar el archivo de configuración de sudoers, puede usar:
Esto hará que el comando se ejecute como root sin la necesidad de sudo.
fuente
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:
La ÚNICA forma de verlo está bajo privilegios de root, no puede enumerar 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 las configuraciones deseadas:
Ignorar la autenticación para un grupo
o Ignorar la autenticación de un usuario
o Ignorar la autenticación de un ejecutable para un usuario específico
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.
fuente
Verifique que sudo no tenga alias. Corre asi
Por ejemplo, un alias de shell como este:
puede causar este comportamiento.
fuente
sudoers
sudo? ¿O estás hablando de redirigirsudo
a algo que siempre imprime este mensaje de error para sacar las contraseñas? Ese es el caso poco probable aquí ...alias sudo="sudo env PATH=$PATH"
en mi~/.bashrc
. En lugar de solo resolverlo por mí mismo y seguir ocupándome ciegamente de mi negocio, presenté mi respuesta como una posible solución para cualquier otra persona que se encuentre en este hilo.Cuando ejecutas tu script necesitas ejecutarlo como
sudo /path/to/my/script
.Editar: según su comentario a otra respuesta, desea ejecutar esto desde un icono. Deberá crear un
.desktop
archivo que ejecute su programa con sudo, al igual que en el terminal.También podría considerar usar
gtk-sudo
una solicitud visual de contraseña.Probablemente debería considerar la idea de que no debería ejecutar las cosas como root y que cambiar el sistema más adelante para que no necesite permisos de root sea una mejor manera de hacerlo.
fuente
Esto resolvió el problema para mí (también probé algunas de las otras respuestas, que podrían haber ayudado):
El script al que estaba llamando estaba en
/usr/bin
un directorio para el que no tengo permisos de escritura (aunque generalmente puedo leer cualquier archivo allí). El script tenía chmodded + x (permiso ejecutable), pero aún no funcionaba. 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 dudé (aclarando para futuros lectores): debe ejecutar su script como sudo. Escriba
sudo
cuando llame al script. No lo usesudo
para el comando dentro de su script 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.fuente
sudo
dentro de un script está perfectamente bien siempre que tenga los derechos apropiados (establecidossudoers
) para ejecutar el comando en cuestión sin una contraseña. Hace las cosas un poco más seguras.Otra posibilidad podría ser instalar, configurar y luego usar el supercomando para ejecutar su script como
Si desea ejecutar alguna binario ejecutable (por ejemplo, que ha compilado en ELF binario a partir de un cierto código fuente de C), lo cual es no un Script como root, es posible considerar la posibilidad de que setuid (y, de hecho
/bin/login
,/usr/bin/sudo
y/bin/su
, ysuper
todos están usando esa técnica ) Sin embargo, tenga mucho cuidado, podría abrir un gran agujero de seguridad .Concretamente, su programa debe estar codificado paranoicamente (así que verifique todos los argumentos y el entorno y las condiciones externas antes de "actuar", suponiendo que sea un usuario potencialmente hostil), entonces puede usar seteuid (2) y amigos (ver también setreuid (2) ) cuidadosamente (ver también capacidades (7) y credenciales (7) y execve (2) ...)
Utilizará
chmod u+s
(lea chmod (1) ) cuando instale dicho binario.Pero ten mucho cuidado .
Lea muchas cosas sobre setuid , incluida la Programación avanzada de Linux , antes de codificar tal cosa.
Tenga en cuenta que un script, o cualquier cosa de shebang , no se puede configurar. Pero podría codificar (en C) un pequeño setuid-binario envolviéndolo.
fuente
Idealmente, si está personalizando qué comandos se pueden ejecutar
sudo
, debería realizar estos cambios en un archivo separado en/etc/sudoers.d/
lugar de editar elsudoers
archivo directamente. También debe usar siemprevisudo
para editar los archivos. NUNCA debe otorgarNOPASSWD
losALL
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 avisará 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 losNOPASSWD
comandos específicos del usuario aparece ANTES de cualquier%groupyouarein ALL=(ALL) ALL
comando en la salida, se le solicitará su contraseña.Si se encuentra creando muchos de estos archivos sudoers.d, entonces tal vez desee crearlos nombrados 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, el ÚLTIMO cargado gana, ya sea MÁS o MENOS permisivo que las entradas anteriores.
Intente ejecutar
printf '%s\n' {{0..99},{A-Z},{a-z}} | sort
yprintf '%s\n' {{0..99},{A-Z},{a-z}} | LANG=C sort
ver si su idioma actual se imprime,AaBbCc
etc. oABC
luegoabc
para determinar cuál sería el mejor "último" prefijo de letra para usar.fuente
Para permitir que cualquier usuario ejecute el programa como sudo sin pedir 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.
fuente
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 variable . AFAIK no es posible usar variables o rangos de valores en las declaraciones de sudoers, es decir, puede permitir el acceso explícito a,
command option1
pero nocommand option2
usar:user_name ALL=(root) /usr/bin/command option1
pero si la estructura es
command option1 value1
, dondevalue1
puede variar, necesitaría tener líneas sudoers explícitas para cada valor posible devalue1
. El script de Shell proporciona una forma de evitarlo.Esta respuesta fue inspirada por la respuesta de M. Ahmad Zafar y soluciona el problema de seguridad allí.
sudo
./usr/local/bin/
), haga que el archivo sea propiedad de root (por ejemplochown root:wheel /usr/local/bin/script_name
) sin acceso de escritura para otros (por ejemplochmod 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
.Ejecutar la 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 del sueño es una acción inocente que no justifica la molestia de escribir una contraseña, pero
pmset
puede hacer muchas cosas y me gustaría mantener estas otras cosas detrás de la contraseña de sudo.Entonces tengo el siguiente script en
/usr/local/bin/ds
:Al final del
sudoers
archivo 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 script 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:
fuente