
Necesito escribir un script para que mis colegas y yo podamos reiniciar diferentes servicios en varios servidores. Todos nos conectamos a los servidores con LDAP, así que me gustaría que mi script conecte a nuestros usuarios LDAP al servidor y luego use sudo para reiniciar los servicios (puedo escribir un script en cada servidor para reiniciar todos los servicios necesarios). En este momento el script simplemente ejecuta un comando como
ssh -t user@host "sudo service XXX restart"
El problema es que para cada servidor el script solicitará la contraseña del usuario dos veces (una para la conexión ssh y dos para el comando sudo). Mi primera suposición fue solicitar al usuario el inicio de sesión y la contraseña con read -s -p y luego usar la variable para iniciar sesión automáticamente con ssh. Aparentemente, Expect es la forma de hacer esto, pero no encontré una manera de solicitar de forma segura una contraseña en un script de Expect o solicitarla en un script de bash y pasar la variable de forma segura en el script de expect.
Busqué soluciones como pssh, cluster ssh que parece estar funcionando pero no con sudo. Entiendo que la mejor manera de hacerlo es con claves ssh, pero dado que varios usuarios necesitan usar el script, me gustaría usar el inicio de sesión/contraseña LDAP.
Respuesta1
Como sugirió Glenn en los comentarios, la forma correcta de hacerlo era usar stty :
# grab the password
stty -echo
send_user -- "Password for $user@$host: "
expect_user -re "(.*)\n"
send_user "\n"
stty echo
set pass $expect_out(1,string)
#... later
send -- "$pass\r"