Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用密码提示在bash脚本中检查路由器的SSH登录状态_Bash_Ssh_Expect - Fatal编程技术网

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

如何使用密码提示在bash脚本中检查路由器的SSH登录状态,bash,ssh,expect,Bash,Ssh,Expect,我正在运行一个任务,需要检查400个远程路由器上的SSH登录状态。我已经在bash中使用expect编写了脚本,它通过SSH连接远程路由器并在上面运行一些命令。但是,有些路由器不响应SSH。我使用if语句来避免那些在SSH上失败的路由器。用于检查远程路由器状态的示例代码仅在无密码输入或保存私钥的情况下有效。您能帮助我如何检查远程路由器上的SSH状态吗 如果我在对路由器执行SSH时得到密码提示,我可以说服务器能够对路由器执行SSH。不需要为其提供密码 #!/bin/bash ssh -q -o

我正在运行一个任务,需要检查400个远程路由器上的SSH登录状态。我已经在bash中使用expect编写了脚本,它通过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

希望这有帮助

===编辑===>>

因为您没有启用无密码ssh。您可以尝试
telnet
连接到端口22,如果22端口打开,则显示已连接,如果未打开,则显示未连接。您可以对其进行grep。 下面是修改后的代码:(假设ssh在22端口上运行,否则在代码中更改端口。)


谢谢塔里克。我不应该在这里使用“BatchMode=yes”,因为我没有启用无密码登录。它给了我255个退出状态。我想要的是简单地运行命令“ssh”username@IP,系统将返回密码提示。如果它返回密码提示,这意味着远程路由器上启用了SSH。您的脚本将不会获得密码提示,而是直接指向控制台。所以最好是在超时时使用expect。还想知道如何使用它吗?我应该使用什么逻辑来说明SSH正在远程路由器上工作,因为即使在得到密码提示后,退出状态仍给出错误255?我总是使用telnet来检查开放端口。我更新了答案以使用telnet。试试看。
#!/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