
Preciso escrever um script para que meus colegas e eu possamos reiniciar diferentes serviços em vários servidores. Todos nós nos conectamos aos servidores com LDAP, então gostaria que meu script conectasse nossos usuários LDAP ao servidor e depois usasse o sudo para reiniciar os serviços (posso escrever um script em cada servidor para reiniciar todos os serviços necessários). No momento, o script simplesmente executa um comando como
ssh -t user@host "sudo service XXX restart"
O problema é que para cada servidor o script pedirá a senha do usuário duas vezes (uma para a conexão ssh e duas para o comando sudo). Meu primeiro palpite foi solicitar login e senha ao usuário com read -s -p e então usar a variável para fazer login automaticamente com ssh. Aparentemente, Expect é a maneira de fazer isso, mas não encontrei uma maneira de solicitar com segurança uma senha em um script Expect ou solicitá-la em um script bash e passar a variável com segurança no script expect.
Procurei soluções como pssh, cluster ssh que parece estar funcionando, mas não com sudo. Entendo que a melhor maneira de fazer isso é com chaves ssh, mas como vários usuários precisam usar o script, gostaria de usar o login/senha LDAP.
Responder1
Como Glenn sugeriu nos comentários, a maneira correta de fazer isso 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"