我需要编写一个脚本,以便我的同事和我自己可以在多台服务器上重新启动不同的服务。我们都使用 LDAP 连接到服务器,因此我希望我的脚本将我们的 LDAP 用户连接到服务器,然后使用 sudo 重新启动服务(我可以在每个服务器上编写一个脚本来重新启动所需的所有服务)。现在,脚本只需运行如下命令
ssh -t user@host "sudo service XXX restart"
问题是,对于每个服务器,脚本都会要求输入两次用户密码(一次用于 ssh 连接,两次用于 sudo 命令)。我的第一个猜测是使用 read -s -p 提示用户输入登录名和密码,然后使用变量自动使用 ssh 登录。显然,Expect 是执行此操作的方法,但我没有找到在 Expect 脚本中安全地提示密码或在 bash 脚本中提示密码并在 expect 脚本中安全地传递变量的方法。
我确实查找了 pssh、cluster ssh 等解决方案,它们似乎可以工作,但不能使用 sudo。我知道最好的方法是使用 ssh 密钥,但由于多个用户需要使用该脚本,所以我想使用 LDAP 登录名/密码。
答案1
正如 Glenn 在评论中所建议的那样,正确的方法是使用 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"