我正在创建一个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容错。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top