我正在创建一个bash脚本,该脚本将登录到远程计算机并创建私钥和公钥。
我的问题是远程机器不是很可靠,而且它们并不总是正常运行。我需要一个bash脚本来检查SSH连接是否已启动。在实际创建密钥以供将来使用之前。
答案 0 :(得分:126)
您可以使用返回值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'
要完成。
答案 1 :(得分:19)
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
答案 2 :(得分:14)
你可以使用这样的东西
$(ssh -o BatchMode=yes -o ConnectTimeout=5 user@host echo ok 2>&1)
如果ssh连接正常,这将输出“ok”
答案 3 :(得分:6)
补充@Adrià 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
答案 4 :(得分:3)
尝试:
echo quit | telnet IP 22 2>/dev/null | grep Connected
答案 5 :(得分:2)
关注@user156676,查看ip范围:
#!/bin/sh
IP='192.168.0.'
PWD='your_password'
USR='your_usr'
for i in $(seq 229 255);do
sshpass -p $PWD ssh -q -o ConnectTimeout=3 ${USR}@${IP}${i} exit
let ret=$?
if [ $ret -eq 5 ]; then
echo $IP$i "Refused!" $ret
elif [ $ret -eq 255 ] ; then
echo $IP$i "Server Down!" $ret
elif [ $ret -eq 0 ] ; then
echo $IP$i "Connnected!" $ret
else
echo $IP$i "Unknown return code!" $ret
fi
done
答案 6 :(得分:1)
在成功连接后,ssh
命令下面的退出代码应为0
,否则应为非零值。
ssh -q -o BatchMode=yes user@remote.com exit
if [ $? != "0" ]; then
echo "Connection failed"
fi
答案 7 :(得分:0)
如果有人只想检查端口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"
答案 8 :(得分:0)
如果您想检查远程文件夹是否存在,或者是否真的进行任何其他文件测试:
if [ -n "$(ssh "${user}@${server}" [ -d "$folder" ] && echo 1; exit)" ]; then
# exists
else
# doesn't exist
fi
不要忘记"$(ssh ...)"
中的引号。
答案 9 :(得分:0)
要连接到具有多个接口的服务器
ssh -o ConnectTimeout=1 -q Necktwi@192.168.1.61;[ $? = 1 ] || ssh -o ConnectTimeout=1 -q Necktwi@192.168.1.51
答案 10 :(得分:0)
使用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
答案 11 :(得分:0)
https://onpyth.blogspot.com/2019/08/check-ping-connectivity-to-multiple-host.html
上面的链接是创建用于检查连接性的Python脚本。 您可以使用类似的方法并使用:
ping -w 1 -c 1 "IP Address"
创建bash脚本的命令。
答案 12 :(得分:-6)
我觉得你在这里试图解决错误的问题。你不应该试图让ssh守护进程更稳定吗?尝试运行类似monit的内容,它将检查守护程序是否正在运行,如果不运行则重新启动它(让您有时间找到关闭sshd背后的root问题)。或者网络服务是否麻烦?试着看man ifup
。整个事情就像关闭你一样吗?嗯,这是一个更大的问题...尝试查看您的日志(从syslog开始)查找硬件故障或关闭您的盒子的服务(可能是温度监控器?)。
让你的脚本容错是很好的,但你可能也想让你的boxen容错。