检查我是否可以访问多个服务器的脚本
script to check if I can access multiple servers
我制作了这个脚本来检查我是否可以连接到许多服务器的列表:
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 并继续脚本?
感谢您的帮助。
您真的需要建立 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
您可以使用 -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 标志一起使用的选项。
如果您有很多服务器,您可能想要同时连接到所有服务器。这样,如果任何服务器没有响应,它最多只等待 2 分钟(默认 TCP connect
超时)。
在不分配终端的情况下连接到每个服务器并执行echo .
命令,将输出重定向到一个命名文件中。在一个循环中异步发出这些命令。然后 wait
直到所有命令完成,遍历日志文件并检查哪些文件中有点。然后报告其日志文件中没有点的服务器。
例如:
#/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
我制作了这个脚本来检查我是否可以连接到许多服务器的列表:
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 并继续脚本?
感谢您的帮助。
您真的需要建立 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
您可以使用 -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 标志一起使用的选项。
如果您有很多服务器,您可能想要同时连接到所有服务器。这样,如果任何服务器没有响应,它最多只等待 2 分钟(默认 TCP connect
超时)。
在不分配终端的情况下连接到每个服务器并执行echo .
命令,将输出重定向到一个命名文件中。在一个循环中异步发出这些命令。然后 wait
直到所有命令完成,遍历日志文件并检查哪些文件中有点。然后报告其日志文件中没有点的服务器。
例如:
#/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