¿Cómo proporcionar una contraseña a un comando que solicita uno en bash?

Estoy escribiendo una función de shell de UNIX que va a ejecutar un comando que pedirá al usuario una contraseña. Quiero codificar la contraseña en el script y proporcionarla al comando. Intenté conectar la contraseña en el comando de esta manera:

function() { echo "password" | command } 

Es posible que esto no funcione para algunos comandos, ya que el comando puede vaciar el búfer de entrada antes de solicitar la contraseña.

También intenté redirigir la entrada estándar a un archivo que contiene la contraseña de esta manera, pero eso tampoco funciona:

 function() { echo "password" > pass.tmp command < pass.tmp rm pass.tmp } 

Sé que algunos comandos permiten que se proporcione la contraseña como argumento, pero prefiero ir a través de la entrada estándar.

Estoy buscando una manera rápida y sucia de conectar una contraseña en un comando en bash.

Echa un vistazo a autoexpect (tutorial decente AQUÍ ). Es tan rápido y sucio como puedes conseguir sin recurrir al engaño.

Cómo usar autoexpect para pasar una contraseña a un comando:

Estos pasos se ilustran con un escritorio Ubuntu 12.10. Los comandos exactos para su distribución pueden ser ligeramente diferentes.

Esto es peligroso porque corre el riesgo de exponer cualquier contraseña que utilice a cualquiera que pueda leer el archivo de script de autoexperto.

NO exponga su contraseña de root ni las contraseñas de usuarios avanzados al configurarlas de la manera esperada. Los kits raíz encontrarán esto en un instante y su caja es propiedad.

EXPECT genera un proceso, lee el texto que entra y luego envía el texto predefinido en el archivo de script.

  1. Asegúrate de haber expect y autoexpect instalado:

     sudo apt-get install expect sudo apt-get install expect-dev 
  2. Lea sobre esto:

     man expect man autoexpect 
  3. Vaya a su directorio de inicio:

     cd /home/el 
  4. El usuario el no puede seleccionar un archivo para rootear y debe ingresar una contraseña:

     touch testfile.txt sudo chown root:root testfile.txt [enter password to authorize the changing of the owner] 
  5. Esta es la entrada de contraseña que queremos automatizar. Reinicie la terminal para asegurarse de que sudo nos pida la contraseña nuevamente. Ve a / home / el nuevamente y haz esto:

     touch myfile.txt autoexpect -f my_test_expect.exp sudo chown root:root myfile.txt [enter password which authorizes the chown to root] autoexpect done, file is my_test_expect.exp 
  6. Ha creado el archivo my_test_expect.exp . Su contraseña supersecreta es texto sin formato guardado en este archivo. Esto debería hacerte MUY incómodo. Mitigue algunas molestias restringiendo los permisos y la propiedad tanto como sea posible:

     sudo chown el my_test_expect.exp //make el the owner. sudo chmod 700 my_test_expect.exp //make file only readable by el. 
  7. Usted ve este tipo de comandos en la parte inferior de my_test_expect.exp :

     set timeout -1 spawn sudo chown root:root myfile.txt match_max 100000 expect -exact "\[sudo\] password for el: " send -- "YourPasswordStoredInPlaintext\r" expect eof 
  8. Deberá verificar que los comandos de espera anteriores sean apropiados. Si la secuencia de comandos autoexpect es demasiado sensible o no lo suficientemente sensible, se bloqueará. En este caso, es aceptable porque espera que llegue el texto que siempre llegará.

  9. Ejecute el script esperado como el usuario el:

     expect my_test_expect.exp spawn sudo chown root:root myfile.txt [sudo] password for el: 
  10. La contraseña contenida en my_test_expect.exp fue canalizada a una raíz para enrutar por el usuario el. Para ver si se aceptó la contraseña, mira myfile.txt :

     ls -l -rw-r--r-- 1 root root 0 Dec 2 14:48 myfile.txt 

Funcionó porque es root y el nunca ingresó una contraseña. Si expone su contraseña de root, sudo o power user con este script, entonces será fácil adquirir root en su caja. Tal es la pena para un sistema de seguridad que permite a todos sin hacer preguntas.

Los comandos seguros no permitirán esto, y con razón, me temo, es un agujero de seguridad por el que podrías conducir un camión.

Si su comando no lo permite usando la redirección de entrada, o un parámetro de línea de comando, o un archivo de configuración, entonces tendrá que recurrir a un engaño serio.

Algunas aplicaciones abrirán realmente /dev/tty para garantizar que tendrá dificultades para vencer la seguridad. Puede evitarlos tomando temporalmente /dev/tty (creando el suyo propio como una tubería, por ejemplo) pero esto requiere serios privilegios e incluso puede ser derrotado.

Puede usar la bandera -S para leer desde la entrada estándar. Encuentre abajo un ejemplo:

 function shutd() { echo "mySuperSecurePassword" | sudo -S shutdown -h now } 

Los progtwigs que solicitan contraseñas generalmente establecen el tty en modo “raw” y leen la entrada directamente desde el tty. Si genera el subproceso en una pty puede hacer que funcione. Eso es lo que espera …

Simplemente use:

 echo "password" | sudo -S mount -t vfat /dev/sda1 /media/usb/; if [ $? -eq 0 ]; then echo -e '[ ok ] Usb key mounted' else echo -e '[warn] The USB key is not mounted' fi 

Este código me funciona, y está en /etc/init.d/myscriptbash.sh

Esa es una idea realmente insegura, pero: Usando el comando passwd desde dentro de un script de shell