在这个问题被删除之前我已经读过了这,这,这, 和这;并且大多数链接都没有回答我的问题;因为:
- 我确实需要钥匙和密码
- 我运行多个服务器(50+),我无法承受将它们全部更改为无密码。
- 公钥和私钥也是如此,会占用每个服务器太多时间。
我尝试了 sshpass,但它不知何故弄乱了我与某些设备的 SSH 登录(我不得不重置服务器的 known_hosts)。如果我可以修改脚本以正确使用 sshpass,这将是一个可能的解决方案。
我希望找到 ssh 上的某种选项,可以自动输入密码;类似于:
ssh -o ConnectTimeout=5 -p 'USER_PASSWORD' [email protected].*** sensors | grep Core >> sensors.txt
或者使用可以感知并自动填充(类似宏之类的?)密码的小脚本(无论如何,一半的服务器都有相同的密码)。
我的第二个问题是,我注意到脚本有时会挂起(Ping 连接,但 SSH 不连接),这需要我等待超时或重新启动脚本。不确定这是否是网络问题,或者是什么,但如果我重新启动它,有时它确实会通过。
ConnectTimeout=5 似乎无法按预期工作。只有当服务器离线(未建立 IP 链接)时,脚本才会停止。当服务器在线但 openssh 未进行握手时,脚本会挂起...
答案1
我expect
曾经自动化过无密钥登录。这是我的代码。Shell 包装器:
#!/bin/bash
HOSTNAME=$1
case `echo ${HOSTNAME:7:1}` in
d|q)
ENV='sit'
PW='pw1'
;;
u)
ENV='uat'
PW='pw2'
;;
p)
ENV='prod'
PW='pw3';
;;
esac
# Pass hostname and password to expect script
./go.exp $HOSTNAME $PW
期望脚本:
#!/usr/bin/expect -f
set hostname [lindex $argv 0];
set password [lindex $argv 1];
spawn ssh your_username@$hostname
expect "*:"
send "$password\n"
send "bash\n"
expect "bash-*"
# The next two lines are prompt customization, it is not necessary
send "export PROMPT_COMMAND='echo -ne \"\\033k\$HOSTNAME\\033\\\\\"'\n"
send "export PS1='\\e\[0;33m\\u\\e\[0;36m@\\e\[0;33m\\h \\e\[0;32m\\w> \\e\[m'\n"
# If you don't need interactive session then you may replace the below with whatever you need
interact
注意:假设用户名和提示在任何地方都是相同的,而且这并不安全,因为密码以明文形式作为 arg 传递,因此ps
其他用户可以看到(例如在输出中)