如何创建bash脚本来检查SSH连接?

chu*_*tsu 78 connection ssh bash

我正在创建一个bash脚本,该脚本将登录到远程计算机并创建私钥和公钥.

我的问题是远程机器不是很可靠,而且它们并不总是正常运行.我需要一个bash脚本来检查SSH连接是否已启动.在实际创建密钥以供将来使用之前.

小智 150

您可以使用返回值ssh检查这一点,为您提供:

$ ssh -q user@downhost exit
$ echo $?
255

$ ssh -q user@uphost exit
$ echo $?
0
Run Code Online (Sandbox Code Playgroud)

编辑:另一种方法是使用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)
Run Code Online (Sandbox Code Playgroud)

但是你必须grep消息(nmap不使用返回值来显示端口是否被过滤,关闭或打开).

EDIT2:

如果您对ssh-port的实际状态感兴趣,可以grep openegrep 'open|closed|filtered'以下代码替换:

$ nmap host -PN -p ssh | egrep 'open|closed|filtered'
Run Code Online (Sandbox Code Playgroud)

只是为了完整.

  • 根本没有关于命令的解释......或者你实际上在做什么......什么是`$?`?等等 (3认同)
  • 为了完整,你能指出哪个返回码意味着成功,哪个意味着SSH失败? (2认同)
  • 很棒的答案!但是,您没有提到尝试将ssh`转换为down主机仅在例如60秒的超时后失败 - 这可能对某些用法来说是禁止的.此外,如果主机名如果在`〜/ .ssh/config`中定义,则第一个`ssh`方法有效,而第二个`nmap`方式失败,``failed to resolve"<hostname>"`. (2认同)

小智 21

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
Run Code Online (Sandbox Code Playgroud)

  • 一行输出:(ssh -q -o“ BatchMode = yes” -o“ ConnectTimeout = 3” user@host.com“ echo 2&gt;&1” &amp;&amp; echo SSH_OK || echo SSH_NOK)| 尾-n1 (2认同)

小智 16

你可以使用这样的东西

$(ssh -o BatchMode=yes -o ConnectTimeout=5 user@host echo ok 2>&1)
Run Code Online (Sandbox Code Playgroud)

如果ssh连接正常,这将输出"ok"


iar*_*oyo 10

补充@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
Run Code Online (Sandbox Code Playgroud)


小智 7

尝试:

echo quit | telnet IP 22 2>/dev/null | grep Connected
Run Code Online (Sandbox Code Playgroud)


mat*_*att 6

下面的ssh命令应该有0一个成功连接的退出代码,否则为非零值。

ssh -q -o BatchMode=yes user@remote.com exit

if [ $? != "0" ]; then
    echo "Connection failed"
fi
Run Code Online (Sandbox Code Playgroud)

  • 伟大的!我还建议添加 -o ConnectTimeout=5,以便在目标端口被过滤的情况下更快地退出。 (2认同)