我制作了这个脚本来检查我是否可以连接到许多服务器的列表:
for SERVER in $(cat servers.txt); do
ssh root@$SERVER && echo OK $SERVER || echo ERR $SERVER
done
问题是,如果我第一次连接到服务器,服务器会询问经典问题“The authenticity of host ‘x.x.x.x’ can't be established... bla bla bla
”然后我必须回答是或否,它会失去使其成为一个目的脚本,有没有办法绕过它,所以我可以将它添加到脚本?
此外,有些服务器中我没有密钥,但他们可以选择输入密码。在这种情况下,它将等到我尝试使用密码继续执行脚本,所以我想知道是否有办法改进此脚本,因此如果服务器要求输入密码,则将其设置为ERR $ SERVER并继续脚本?
感谢您的帮助。
答案 0 :(得分:2)
您可以使用-o标志在SSH中设置选项:
for SERVER in $(cat servers.txt); do
ssh -o StrictHostKeyChecking=no -o BatchMode=yes root@$SERVER exit && echo OK $SERVER || echo ERR $SERVER
done
查看ssh_config的联机帮助页:man ssh_config
,了解-o标志可用的所有选项。
答案 1 :(得分:1)
您确实需要建立SSH连接吗?
或者只是打开SSH端口上主机的套接字连接,足以确定服务器是否在线?
<强> servers.txt 强>
hostA.example.com
hostB.example.com
hostC.example.com
<强> port-probe.sh 强>
#!/bin/bash
PORT=22
TIMEOUT=3
for SERVER in $(cat servers.txt); do
# Open a socket and send a char
echo "-" | nc -w $TIMEOUT $SERVER $PORT &> /dev/null
# Check exit code of NC
if [ $? -eq 0 ]; then
echo "$SERVER is Available."
else
echo "$SERVER is Unavailable."
fi
done
答案 2 :(得分:1)
如果您有很多服务器,您可能想要同时连接所有服务器。这样,如果任何服务器没有响应,它只等待最多2分钟(默认TCP connect
超时)。
连接到每个服务器而不分配终端并执行echo .
命令,将输出重定向到命名文件。以异步方式在循环中发出这些命令。然后wait
直到所有命令完成,迭代日志文件并检查哪些文件中有点。然后报告其日志文件中没有点的服务器。
E.g:
#/bin/bash
servers="$@"
for server in $servers; do
ssh -o StrictHostKeyChecking=no -o PasswordAuthentication=no -Tn $server echo . >$server.log 2>$server.error.log &
done
wait # After 2 minutes all connection attempts timeout.
for server in $servers; do
[[ -s $server.log ]] || echo "Failed to connect to $server" >2
done