如何在bash脚本中使用密码提示检查路由器的SSH登录状态



我正在运行一项任务,需要检查400个远程路由器上的SSH登录状态。我已经使用expect-in-bash编写了脚本,通过SSH访问远程路由器并运行一些命令。然而,有些路由器没有响应SSH。我使用if语句来避免那些在SSH上失败的路由器。只有当我们有无密码输入或保存私钥时,检查远程路由器状态的示例代码才能工作。你能帮助我如何检查远程路由器上的SSH状态吗?

如果我在对路由器执行SSH时收到密码提示,我可以说服务器能够对路由器进行SSH。无需提供密码。

#!/bin/bash
ssh -q -o BatchMode=yes -o ConnectTimeout=7 username@IP exit
echo $?
if [ $? -ne 0 ]
then
  # Do stuff here if example.com SSH is down
  echo "Can not connect to the device"
fi

好吧,如果您使用的是expect包,那么这里也有超时选项。

否则,上面的shell代码是正确的方法,除了一些更正:

#!/bin/bash
ssh -q -o BatchMode=yes -o ConnectTimeout=7 username@IP date
ret=$?
echo $ret
if [ $ret -ne 0 ]
then
  # Do stuff here if example.com SSH is down
  echo "Can not connect to the device"
fi

您可以看到,我们正在将$?立即分配给一个变量。如果您不这样做,那么$?将包含echo $?命令的返回值,该值将始终为0。因此,为所有ssh提供了true。此外,我建议运行一些其他命令,而不是使用ssh运行exit

希望这能帮助

===已编辑===>gt>

好吧,因为您没有启用无密码ssh。您可以尝试将telnet连接到端口22,如果22端口处于打开状态,则它将显示为已连接,如果未打开,则它不会显示,您可以对其进行grep操作。这是修改后的代码:(假设ssh在22端口上运行,否则请更改代码中的端口。(

#!/bin/bash
echo "" | telnet $IP 22 | grep "Connected"
ret=$?
echo $ret
if [ $ret -ne 0 ]
then
  # Do stuff here if example.com SSH is down
  echo "Can not connect to the device"
fi

最新更新