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


115

En los días ocupados, me gustaría correr

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

en la noche y acostarse, esperando que la aplicación se instale automáticamente. Pero lo que veo al día siguiente es la pantalla donde 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 hacer esto?


Necesitas haltcorrer como root.
Keith Thompson, el

1
¿No sudotiene un tiempo de espera de 15 minutos? ¿No podría ejecutar, digamos sudo lso algo similar, ingresar su contraseña y luego ejecutar el comando anterior, con los sudoprivilegios aún activos? (No puedo probar esto en este momento, de lo contrario publicaría esto como respuesta.)
Matt

1
El tiempo de espera activado sudoes configurable. Las personas conscientes de la seguridad (también paranoicas, como yo) lo pusieron a cero ... :-)
dda

Respuestas:


173

Sí, use el -Sinterruptor que lee la contraseña de STDIN:

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

Entonces, para su caso, se vería así:

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

por supuesto, reemplace <password>con su contraseña.


42
Obviamente, uno no querría ejecutar esto si hay algún peligro de que alguien más vea la contraseña en el historial del shell.
Brett Daniel el

buscando formas rápidas de ejecutar comandos privilegiados en un host remoto y esto funciona gracias.
nelaaro

13
Si decidió usar el 'echo <contraseña> | Opción sudo -S ', ​​para evitar exponer la contraseña en el historial de comandos, inicie el comando con un carácter ESPACIO. Por supuesto, la mejor opción es canalizar la contraseña desde un archivo seguro.
Shannon Haworth,

Es posible que desee usar eso si tiene la contraseña en un $ VARIABLE (que podría tener provisiones con sops, por ejemplo)
Natim

9 años después y todavía funciona como un encanto :)
WinEunuuchs2Unix

10

Puede reemplazar su línea de comando con esto:

$sudo su

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

Se le pedirá su contraseña de inmediato, luego el resto de los comandos se ejecutarán como superusuario.


8
una versión alternativa (y probablemente preferida) de esto:sudo sh -c "./configure && make && make install && halt"
quckote quack

2
Pero entonces, ¿no tendrían todos los archivos de compilación generados los permisos de superusuario? Esto evitaría que ejecutes ./configure && make como usuario normal más adelante.
user45909

Sí, user45909, tienes toda la razón. Personalmente, nunca he vuelto a ejecutar ./configure && make, excepto después de descargar una actualización del paquete principal de todos modos, pero probablemente no sea típico.
CarlF

10

Varias de las otras soluciones tienen la desventaja de que se ejecutan innecesariamente ./configurey makecomo root.

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

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

Tenga en cuenta el uso de comillas dobles para permitir $USERque el shell (no root) lo expanda.

También podría agregar un sleep 60antes del haltcomando. A veces he hecho cosas como esta, esperando que el comando se ejecute durante mucho tiempo, pero algo sale mal y termina de inmediato; el sleepme permite matar a la orden antes de que el sistema se apaga. O puede usar shutdowncon un argumento de tiempo.


9

También puede configurar sudo con visudopara permitirle al usuario usar make como sudo sin contraseña.

User_Alias USERS = your_user
Cmnd_Alias CMDS = /usr/bin/make
USERS ALL = (ALL) NOPASSWD: CMDS

9

Establezca 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 siguiente canalizará de forma segura su contraseña al comando sudo, sin retener un historial de su contraseña.

"-S", significa usar stdin para la contraseña,

"-K" significa ignorar las credenciales almacenadas en caché para obligar 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 desea ver los comandos que ejecutó en el historial más adelante, no estarán allí. Otro método es actualizar el caché de credenciales de autenticación de sudo (el valor predeterminado está habilitado con 5 minutos de tiempo de espera), luego ejecutar el sudo por separado. Pero la desventaja de esto es que deberá tener en cuenta el 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

Tenga en cuenta que ejecuté un sudo antes de cada comando para asegurarme de que el caché de sudo esté actualizado, ya que el valor predeterminado es 5 minutos. Sí, whoami no debería tomar 5 minutos, pero me imagino que podría ejecutarlo antes de cada comando para mantener la coherencia. También podría poner "export HISTIGNORE = ' sudo -S'"en su archivo ~ / .bashrc, luego cárguelo con". ~ / .bashrc "o cierre sesión y luego inicie sesión. Sin embargo, estoy pensando en usar esto para fines de script, así que lo mantendré en la parte superior de todos mis scripts para las mejores prácticas de seguridad. Configuración de" echo "" | sudo -S -v "a una variable en su lugar también podría ser una buena idea, luego simplemente ejecute la variable antes de cada comando que necesite privilegios de root, vea el comentario de Janar. El comentario de" John T "también debe incluir el parámetro" -k " , como si ejecuta "sudo -S" sin "-k" y la caché de autenticación de sudo ya tiene sus credenciales (y todavía es válida, la caché de autenticación de sudo predeterminada es de 5 minutos), entonces bash ejecutará su contraseña como un comando, que es malo.


1
Solo como una pequeña nota sobre cómo hacer que las cosas no estén disponibles en el historial, ejecute su comando con un solo espacio al frente. Por alguna razón, esto hace que la historia lo ignore.
Matt Fletcher el

4

Tenga en cuenta que he descubierto que el método no funciona en una versión anterior de sudo, específicamente "Sudo versión 1.6.7p5":

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

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

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

Esta no es una respuesta a la pregunta original. Para criticar o solicitar una aclaración de un autor, deje un comentario debajo de su publicación; siempre puede comentar sus propias publicaciones y, una vez que tenga suficiente reputación , podrá comentar cualquier publicación .
DavidPostill

@Darren DeHaven: ¿Podría explicar cómo se convirtió en la respuesta a la pregunta que se hace aquí?
Renju Chandran chingath

4

También puedes hacer esto:

sudo -S <<< "password" command

solo este me funciona en mac os.
Mehdico

2

Si desea tener más cuidado, puede hacer un script, cambiar los permisos del archivo para que solo la raíz pueda leer y editar y luego simplemente ejecutarlo.

Ejemplo:
1) Crear un archivo:

gedit ~/.easy.install  

2) Pegue esto y guarde:

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

3) Hazlo ejecutable:

sudo chmod +x ~/.easy.install  

4) Cambie los permisos del archivo para que solo la raíz pueda leerlo y editarlo:

sudo chmod 700 ~/.easy.install  

5) Ejecutar:

~/.easy.install  

Disfruta ;-)


echo <contraseña> seguirá apareciendo en la lista de procesos y si alguien tiene suerte con ps aux en el momento exacto, puede ver la contraseña en texto sin cifrar. Es mejor guardar la contraseña en un archivo y usar <para redirigir desde el archivo a sudo.
bobpaul

1

Configurar sudo de esa manera es peligroso si alguien ve el hecho de que sudo no requiere contraseña en su cuenta. A menos que sepa lo que está haciendo, no haga eso. He tenido que suceder en mi programa local de A + Training con mi computadora experimental demasiadas veces ... -_-

Sin embargo, lo que dijo John T. suena bien, excepto que todavía existe el riesgo de encontrar la contraseña en el historial de shell. Lo que dijo CarlF suena mejor, pero si falla un comando, la computadora seguirá ejecutándose con privilegios de superusuario.


0

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 usar variables, algo 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 la variable minera en lugar de sudo,

$AutoSuDo apt-get update;

Eso es bastante útil con algunos scripts 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 contesta el 19 de abril de 11 a las 23:56
  • user224306 comentario el 14 de mayo de 13 a las 17:38 para John T respuesta el 9 de noviembre de 2009 a las 2:47

0

El problema esta resuelto. Por ejemplo, para el usuario root:

echo -e 'password\npassword\n' | sudo passwd root

¿Qué hace -e flag, @jerson Martinez?
user674669

1
El indicador -e para echo le permite interpretar ciertas secuencias con significados especiales.
Jerson Martínez
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.