题
我正在创建一个bash脚本,该脚本将登录到远程计算机并创建私钥和公钥。
我的问题是远程机器不是很可靠,而且它们并不总是正常运行。我需要一个bash脚本来检查SSH连接是否已启动。在实际创建密钥以供将来使用之前。
解决方案
您可以使用返回值ssh检查这一点:
$ ssh -q user@downhost exit
$ echo $?
255
$ ssh -q user@uphost exit
$ echo $?
0
编辑:另一种方法是使用nmap(你不需要密钥或登录东西):
$ a=`nmap uphost -PN -p ssh | grep open`
$ b=`nmap downhost -PN -p ssh | grep open`
$ echo $a
22/tcp open ssh
$ echo $b
(empty string)
但是你必须grep消息(nmap不使用返回值来显示端口是否被过滤,关闭或打开)。
EDIT2:
如果您对ssh-port的实际状态感兴趣,可以将 grep open
替换为 egrep'open | closed | filtered'
:
$ nmap host -PN -p ssh | egrep 'open|closed|filtered'
要完成。
其他提示
ssh -q -o "BatchMode=yes" -i /home/sicmapp/.ssh/id_rsa <ID>@<Servername>.<domain> "echo 2>&1" && echo $host SSH_OK || echo $host SSH_NOK
你可以使用这样的东西
$(ssh -o BatchMode=yes -o ConnectTimeout=5 user@host echo ok 2>&1)
这将输出“ok”如果ssh连接正常
补充 @ Adri&#224;的回应Cidre
你可以这样做:
status=$(ssh -o BatchMode=yes -o ConnectTimeout=5 user@host echo ok 2>&1)
if [[ $status == ok ]] ; then
echo auth ok, do something
elif [[ $status == "Permission denied"* ]] ; then
echo no_auth
else
echo other_error
fi
尝试:
echo quit | telnet IP 22 2>/dev/null | grep Connected
如果有人只想检查端口22是否在远程计算机上打开,这个简单的netcat命令很有用。我使用它是因为nmap和telnet不适合我。此外,我的ssh配置使用键盘密码验证。
这是GUESSWHOz提出的解决方案的变体。
nc -q 0 -w 1 "${remote_ip}" 22 < /dev/null &> /dev/null && echo "Port is reachable" || echo "Port is unreachable"
如果您想检查存在的远程文件夹,或任何其他文件测试:
if [ -n "$(ssh "${user}@${server}" [ -d "$folder" ] && echo 1; exit)" ]; then
# exists
else
# doesn't exist
fi
不要忘记&quot; $(ssh ...)&quot;
中的引号。
连接到具有多个接口的服务器
ssh -o ConnectTimeout=1 -q Necktwi@192.168.1.61;[ $? = 1 ] || ssh -o ConnectTimeout=1 -q Necktwi@192.168.1.51
使用BASH 4+脚本的示例:
# -- ip/host and res which is result of nmap (note must have nmap installed)
ip="192.168.0.1"
res=$(nmap ${ip} -PN -p ssh | grep open)
# -- if result contains open, we can reach ssh else assume failure) --
if [[ "${res}" =~ "open" ]] ;then
echo "It's Open! Let's SSH to it.."
else
echo "The host ${ip} is not accessible!"
fi
我觉得你在这里试图解决错误的问题。你不应该试图让ssh守护进程更稳定吗?尝试运行像 monit 这样的程序,它将检查守护程序是否正在运行并重启它,如果它不是' t(给你时间找到关闭sshd背后的根本问题)。或者网络服务是否麻烦?尝试查看 man ifup
。整个事情就像关闭你一样吗?嗯,这是一个更大的问题...尝试查看您的日志(从syslog开始)查找硬件故障或关闭您的盒子的服务(可能是温度监控器?)。
让你的脚本容错是很好的,但你可能也想让你的boxen容错。