linux - pida - sudo password no escribe
Use sudo sin contraseña DENTRO de un script (8)
Como lo mencionó Basilevs, debe agregar su usuario al archivo sudoers
para evitar que los comandos sudo
en el script se queden atascados esperando la contraseña.
En Ubuntu 16, hay una forma más sencilla: simplemente agregue el usuario al sudo group
, de esta manera:
sudo usermod -aG sudo *username*
A partir de entonces, debería funcionar como un encanto.
Nota:
Esto funciona solo con la condición de que la siguiente línea esté en el archivo /etc/sudoers
:
%sudo ALL=NOPASSWD: ALL
(dicha línea otorga privilegios de sudo sin contraseña a nivel de grupo, en este caso al grupo sudo
)
(Si esta línea no está presente y desea agregarla, asegúrese de usar visudo
)
Por alguna razón, necesito, como usuario, ejecutar sin sudo un script script.sh que necesita privilegios de root para funcionar.
Vi como la única solución para poner sudo INSIDE script.sh. Tomemos un ejemplo:
script.sh :
#!/bin/sh
sudo apt-get update
Por supuesto, si ejecuto este script, recibo un mensaje pidiéndome una contraseña. Luego agregué a mi archivo sudoers (al final para anular todo lo demás):
user ALL=(ALL:ALL) NOPASSWD:/path/to/script.sh
Por cierto, también probé la línea:
user ALL=(ALL) NOPASSWD:/path/to/script.sh
(Creo que no entendí completamente la diferencia)
Pero esto no resuelve mi problema si no uso sudo para ejecutar este script:
# ./script.sh
[sudo] password for user:
# sudo ./script.sh
Starts updating...
Bueno, entonces me digo a mí mismo: "Ok, eso significa que si tengo un archivo referido en sudoers como lo hice, funcionará sin avisar solo si lo llamo con sudo, lo que no es lo que quiero".
Entonces, bien, creo otro script script2.sh como sigue:
script2.sh
#!/bin/sh
sudo /path/to/script.sh
De hecho funciona. Pero no estoy realmente satisfecho con esta solución, particularmente por el hecho de que tengo que usar 2 scripts para cada comando.
Esta publicación es para ayudar a las personas que tienen este problema y buscar la misma solución (no encontré una buena publicación), y quizás tengan mejores soluciones de parte de ustedes.
¡Siéntete libre de compartir tus ideas!
EDITAR 1:
Quiero insistir en el hecho de que esta "actualización de apt-get" fue solo un ejemplo lejos de lo que realmente es mi script. Mi script tiene muchos comandos (con algunos archivos de configuración de cd a root-access-only), y la solución no puede ser "Bueno, solo hazlo directamente con apt-get".
El principio de un ejemplo es ayudar a la comprensión, no ser excusa para simplificar la respuesta del problema general.
Como notó, el archivo que debe aparecer en la configuración de sudoers es el que ejecuta sudo
, y no el que ejecuta sudo
.
Dicho esto, lo que hacemos a menudo, es tener algo como
sudo /path/to/script.sh
en la configuración de sudo
, donde script.sh
tiene todos los comandos que el script tiene que hacer.
Luego definimos una función Bash o un alias para que script.sh
sea realmente
#! /bin/bash
read -s -p "Enter Password for sudo: " sudoPW
echo $sudoPW | sudo -S yum update
El único problema es que si algunos comandos no deben ejecutarse como root, debe insertar algunos comandos su - user -c "command"
en el script.
De mi blog: IDMRockstar.com :
El kicker es que a veces, necesito ejecutar comandos como root. Esta es la forma rápida y sucia en que lo logro sin divulgar las contraseñas:
user ALL=(ALL:ALL) NOPASSWD:/path/to/script.sh
De esta manera, al usuario se le solicita la contraseña (y se oculta de la terminal) y luego se pasa a los comandos según sea necesario, por lo que no ejecuto todo el script como root =)
Si tienes una mejor manera, me encantaría escucharla! No soy un experto en shell scripting de ninguna manera.
¡Aclamaciones!
.: Adan
En el nuevo archivo /etc/sudoers.d/apt-get, ponga una sola línea:
user ALL=(ALL:ALL) NOPASSWD:/usr/bin/apt-get update
Aquí se requiere una ruta completa al ejecutable.
Luego usa lo siguiente en tu script:
sudo apt-get update
Aquí, el nombre completo no es obligatorio. Sudo usa la variable de entorno PATH para la resolución ejecutable.
Mientras cambia y verifica la configuración de sudoers, asegúrese de mantener otra sesión de root abierta para la recuperación de errores.
Le sugiero que mire las variables de entorno sudo; específicamente puede usar (y verificar) $ SUDO_USER. Llame a su script con sudo (1 entrada en sudoers), luego haga cosas de usuario como SUDO_USER y rootee cosas como root.
Si desea ejecutar sudo /usr/bin/apt-get update
sin una contraseña, necesita tener la entrada de sudoers:
user ALL=(ALL:ALL) NOPASSWD:/usr/bin/apt-get update
Para el problema más amplio de la secuencia de comandos en su conjunto, hay dos enfoques posibles:
Enfoque 1
Para cada comando en el script que necesita sudo
, cree una línea en sudoers
específicamente para ese comando. En este caso, el script se puede llamar normalmente:
./script1.sh
Enfoque 2
Coloque una línea en sudoers
para el script en su conjunto. Cuando se hace esto, los comandos individuales no necesitan sudo
. Sin embargo, sudo
debe usarse para iniciar el script como en:
sudo ./script.sh
Si su contraseña no es algo de lo que quiera estar muy seguro, (tal vez algún servidor de prueba en la empresa, etc.) puede elevarse a sudo en el script a través de echo como:
echo YourPasswordHere | sudo -S Command
Sin embargo, el aviso aún imprime el texto "ingresar contraseña" para dar salida. Así que no esperes que esté limpio.
Ver esta publicación de Askubuntu.
Simplemente, para ejecutar comandos como root, debe usar su (incluso sudo usa su) Siempre que ejecute sudo ./script2.sh correctamente solo en su lugar: sudo su "#" // comandos como root aquí "#" exit / / comandos como se usan aquí, puede hacer que sea una función de shell con el nombre sudo, pero no hay otra forma mejor, creo que, sin embargo, es el caso de los scripts inti, rc android ..etc debe estar ordenado;)
sin embargo, esto requiere que coloques NOPASSWD: es totalmente seguro
de cualquier manera, aquí simplemente no tiene el principio de permisos de POISX, que se está filtrando, así que no habilite algo para todos los usuarios o viceversa, simplemente llame a sudo todo lo que desee sin nada adicional:
chown root script.sh
chmod 0755 script.sh
chgrp sudo script.sh
"haz el propietario raíz de .sh" "haz que sea de solo lectura y exec para otros" "y colócalo en el grupo sudo", por supuesto, debajo de sudo.