我正在创建一个bash脚本,该脚本将登录到远程计算机并创建私钥和公钥。
我的问题是,远程计算机不是很可靠,并且它们并非总是处于启动状态。我需要一个bash脚本来检查SSH连接是否建立。在实际创建密钥以供将来使用之前。
我正在创建一个bash脚本,该脚本将登录到远程计算机并创建私钥和公钥。
我的问题是,远程计算机不是很可靠,并且它们并非总是处于启动状态。我需要一个bash脚本来检查SSH连接是否建立。在实际创建密钥以供将来使用之前。
Answers:
您可以使用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不使用返回值显示端口是否已过滤,关闭或打开)。
编辑2:
如果您对ssh-port的实际状态感兴趣,可以grep open
用egrep 'open|closed|filtered'
以下命令代替:
$ nmap host -PN -p ssh | egrep 'open|closed|filtered'
只是为了完整。
ssh
进入故障主机仅在超时(例如60秒)后失败-这对于某些用法可能是禁止的。另外,如果在中定义了主机名~/.ssh/config
,则第ssh
一种方法有效,而第二种nmap
方法失败Failed to resolve "<hostname>"
。
$?
?等
ssh -q user@downhost exit | echo $?
将连接结果通过管道
你可以用这样的东西
$(ssh -o BatchMode=yes -o ConnectTimeout=5 user@host echo ok 2>&1)
如果ssh连接正常,则将输出“ ok”
使用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
https://onpyth.blogspot.com/2019/08/check-ping-connectivity-to-multiple-host.html
上面的链接是创建用于检查连接性的Python脚本。您可以使用类似的方法并使用:
ping -w 1 -c 1 "IP Address"
创建bash脚本的命令。
我觉得您正在尝试解决错误的问题。您不应该尝试使ssh守护程序更稳定吗?尝试运行诸如monit之类的东西,它将检查守护进程是否正在运行,如果守护进程没有运行,则重新启动它(给您时间找到sshd关闭后的根本问题)。还是网络服务麻烦?尝试看看man ifup
。整个该死的东西只是想对你关闭吗?好吧,这是一个更大的问题……尝试查看您的日志(以syslog开头),以查找导致故障的硬件故障或服务(也许是温度监视器?)。
使脚本具有容错能力非常好,但是您可能还希望使Boxen容错。
ssh-keygen
会在本地计算机上生成密钥对,然后ssh-copy-id
将公钥复制到远程计算机。看来您做事的方式有所不同。为什么,您的目标是什么?