请帮助我解决以下情况。
我有1000台linux服务器。我需要找出哪些服务器正在接受来自我的主服务器的无密码连接。下面是我使用的命令。以下命令的问题是,当目标服务器要求输入密码时,我的循环停止工作。
for i in `cat srv`; do echo Server $i\n; ssh $i "uptime"; done
输出:
Server server001
04:56:01 up 62 days, 9:18, 0 users, load average: 0.09, 0.14, 0.13
服务器服务器002
Password:
我该如何解决它?
答案1
尝试-o BatchMode=yes
作为ssh
选项。
这可以防止在命令行中确认密码以及接受远程主机指纹。
您可能希望检查 ssh 的返回代码
for host in $(< serverlist)
do
echo testing $host
if ssh -o BatchMode=yes $host uptime
then echo host $host OK
else echo host $host KO
fi
done > result.log
答案2
使用 GNU Parallel 你可以这样做:
查找可以执行此操作的服务器不是接受无密码登录:
cat srv |
parallel timeout 3 ssh {} true ' &>/dev/null ||' echo {}
要查找接受无密码登录的服务器:
parallel --nonall --timeout 3 --slf srv --tag echo
添加-j100
一次在 100 台服务器上运行。
答案3
使用 SSH 选项指定您只想使用 PubKey 而不是密码身份验证:
for i in `cat srv`; do echo Server $i\n; ssh -o PubKeyAuthentication=yes -o PasswordAuthentication=no $i "uptime"; done
这超出了本问题的范围,但您可能需要检查ssh
命令的返回值以确定连接是否成功。