2009-11-09 02:37:00 +0000 2009-11-09 02:37:00 +0000
123
123

sudo con contraseña en una línea de comando?

En días de mucho trabajo, me gustaría ejecutar

$ ./configure && make && sudo make install && halt

en la noche e ir a la cama, esperando que la aplicación se instale automáticamente. Pero lo que veo al día siguiente es la pantalla donde el sudo me pide la contraseña. Entonces, ¿cómo podría ejecutar sudo con contraseña en una línea de comando, o hay algún otro método para hacerlo?

Respuestas (11)

185
185
185
2009-11-09 02:47:20 +0000

Sí, usa el interruptor -S que lee la contraseña de STDIN:

$echo <password> | sudo -S <command>

Así que para tu caso se vería así:

$./configure && make && echo <password> | sudo -S make install && halt

por supuesto, reemplaza <password> con tu contraseña.

11
11
11
2009-11-09 03:03:22 +0000

También puede configurar el sudo con visudo para que el usuario pueda usar make as sudo sin contraseña.

User_Alias USERS = your_user
Cmnd_Alias CMDS = /usr/bin/make
USERS ALL = (ALL) NOPASSWD: CMDS
10
10
10
2012-08-08 06:52:50 +0000

Varias de las otras soluciones tienen la desventaja de que ejecutan innecesariamente ./configure y make como raíz.

Esto es un poco enrevesado, pero debería funcionar:

sudo sh -c "su $USER -c ./configure && su $USER -c make && make install && halt"

Note el uso de comillas dobles para permitir que $USER sea expandido por el shell (no-raíz).

También podría agregar un sleep 60 antes del comando halt. A veces he hecho cosas como esta, esperando que el comando se ejecute durante mucho tiempo, pero algo sale mal y termina inmediatamente; el sleep me permite matar el comando antes de que el sistema se apague. O puedes usar shutdown con un argumento de tiempo.

10
10
10
2009-11-09 03:14:31 +0000

Podrías reemplazar tu línea de comandos con esto:

$sudo su

$./configure && make && make install && halt

Se te pedirá tu contraseña inmediatamente, luego el resto de los comandos se ejecutarán como superusuario.

9
9
9
2014-11-25 19:43:17 +0000

Ponga HISTIGNORE en “sudo -S

$ export HISTIGNORE='*sudo -S*'

Luego pase su contraseña de forma segura a sudo:

$ echo "your_password" | sudo -S -k <command>

“HISTIGNORE” significa no guardar este comando en el historial. Ese es el historial en memoria o el archivo “~/.bash_history”.

Por ejemplo, lo que sigue a continuación canalizará de manera segura su contraseña al comando sudo, sin retener el historial de su contraseña.

“-S”, significa usar stdin para la contraseña,

“-k” significa ignorar las credenciales en caché para forzar a sudo a preguntar siempre. Esto es para un comportamiento consistente.

$ export HISTIGNORE='*sudo -S*'
$ echo "<your_password>" | sudo -S -k whoami
$ echo "<your_password>" | sudo -S -k cat /etc/shadow
$ echo "<your_password>" | sudo -S -k bash /tmp/myscript.sh

La desventaja del método anterior es que si quieres ver los comandos que ejecutaste en el historial más tarde no estarán ahí. Otro método es actualizar el caché de credenciales de autenticación de sudo (por defecto está habilitado con 5 minutos de tiempo de espera), y luego ejecutar el sudo por separado. Pero la desventaja de esto es que tendrá que estar atento al caché de 5 minutos.

Por ejemplo:

$ export HISTIGNORE='*sudo -S*'
$ echo "<your_password>" | sudo -S -v
$ sudo whoami
$ echo "<your_password>" | sudo -S -v
$ sudo cat /etc/shadow
$ echo "<your_password>" | sudo -S -v
$ sudo /tmp/myscript.sh

Nota He ejecutado un sudo antes de cada comando para asegurarme de que el caché de sudo está actualizado, ya que el valor por defecto es de 5 minutos. Sí, el whoami no debería tardar 5 minutos, pero me imagino que también podría ejecutarlo antes de cada comando para mayor consistencia. También podrías poner “exportar HISTIGNORE=‘sudo -S’” en tu archivo ~/.bashrc, y luego cargarlo con “. ~/.bashrc” o cerrar sesión y luego iniciar sesión. Sin embargo, estoy pensando en usar esto para propósitos de scripts, así que lo mantendré en la parte superior de todos mis scripts para las mejores prácticas de seguridad. Establecer “echo ”“ | sudo -S -v” a una variable en su lugar también podría ser una buena idea, entonces sólo ejecuta la variable antes de cada comando que necesite privilegios de root, ver el comentario de Janar. El comentario de “John T” también debería incluir el parámetro “-k”, ya que si ejecutas “sudo -S” sin “-k” y el caché de autenticación de sudo ya tiene tus credenciales (y sigue siendo válido, el caché de autenticación de sudo por defecto es de 5 minutos) entonces bash ejecutará tu contraseña como un comando en su lugar, lo cual es malo.

5
5
5
2015-06-09 14:15:37 +0000

También puedes hacer esto:

sudo -S <<< "password" command
4
4
4
2014-12-08 15:18:13 +0000

Nota, he encontrado que el método no funciona en una versión antigua de sudo, específicamente “Sudo version 1.6.7p5”:

$ echo "<your_password>" | sudo -S -k whoami

Donde como este método funciona en versiones antiguas y nuevas sudo:

$ echo "<your_password>" | sudo -S -v
$ sudo whoami
2
2
2
2011-04-19 23:56:23 +0000

Si quieres tener más cuidado, podrías hacer un guión, cambiar los permisos del archivo para que sólo root pueda leer y editar y luego simplemente ejecutarlo.

Ejemplo: 1) Crear un archivo:

gedit ~/.easy.install

2) Pegar esto y guardar:

./configure && make && echo <password> | sudo -S make install && halt

3) Hacerlo ejecutable:

sudo chmod +x ~/.easy.install

4) Cambiar los permisos del archivo para que sólo root pueda leerlo y editarlo:

sudo chmod 700 ~/.easy.install

5) Ejecutar:

~/.easy.install

Disfruta ;-)

1
1
1
2010-11-10 03:37:15 +0000

Configurar un sudo así es peligroso si alguien ve el hecho de que el sudo no requiere una contraseña en su cuenta. A menos que sepa lo que está haciendo, no lo haga. Me ha pasado en mi programa local de entrenamiento A+ con mi ordenador experimental demasiadas veces… -\Lo que dijo John T. suena bien, excepto que aún existe el riesgo de encontrar la contraseña en el historial de la computadora. Lo que dijo CarlF suena mejor, pero si un comando falla, la computadora seguirá funcionando con privilegios de superusuario.

0
0
0
2018-11-08 16:51:03 +0000

El problema está resuelto. Por ejemplo, a la raíz del usuario:

echo -e 'password\npassword\n' | sudo passwd root
0
0
0
2014-06-29 20:57:36 +0000

Personalmente hago lo mismo que John T respondió el 9 de noviembre de 2009 a las 2:47, también he mejorado el mío de acuerdo con la orientación de su respuesta, gracias.

La diferencia es que tiendo a hacer uso de variables, algo así como:

AutoSuDo=$" $echo pass | sudo -S";
# Change AutoSuDo to something else.
# Note that string starts with space,
# useful only if used as first command in line

De esa manera puedo usar fácilmente mi variable en lugar de sudo,

$AutoSuDo apt-get update;

Eso viene muy bien con algunos guiones más largos. Principalmente hago uso de estos para computadoras personales de otros, que tengo que mantener.

También recomiendo prestar atención a:

  • desgua responder el 19 de Abril ‘11 a las 23:56
  • user224306 comentar el 14 de Mayo '13 a las 17:38 para John T responder el 9 de Noviembre '09 a las 2:47