检查脚本中的SSH故障

the*_*lat 5 ssh bash loops runtime-error

嗨,什么是检查SSH是否因任何原因失败的最佳方法?我可以使用IF语句(如果它失败的话做什么),我在一个循环中使用ssh命令和传递我的主机名形成一个平面文件.

所以我做了类似的事情:

for i in `cat /tmp/hosts` ; do ssh $i 'hostname;sudo ethtool eth1'; done
Run Code Online (Sandbox Code Playgroud)

我得到这个错误或我无法连接

ssh: host1 Temporary failure in name resolution
Run Code Online (Sandbox Code Playgroud)

我想跳过无法连接的主机是SSH失败.做这个的最好方式是什么?是否存在运行时错误,我可以陷阱绕过无论出于何种原因我无法进入的主机,也许ssh是不允许的,或者我没有正确的密码?

提前谢谢你干杯

tha*_*guy 7

要检查连接和/或运行远程命令是否存在问题:

if ! ssh host command
then
  echo "SSH connection or remote command failed"
fi
Run Code Online (Sandbox Code Playgroud)

要检查连接是否存在问题,无论远程命令是否成功(除非它碰巧返回状态255,这很少见):

if ssh host command; [ $? -eq 255 ]
then 
  echo "SSH connection failed"
fi
Run Code Online (Sandbox Code Playgroud)

应用于您的示例,这将是:

for i in `cat /tmp/hosts` ;  
do 
  if ! ssh $i 'hostname;sudo ethtool eth1'; 
  then 
    echo "Connection or remote command on $i failed";
  fi
done
Run Code Online (Sandbox Code Playgroud)


wbt*_*11a 4

您可以检查 ssh 为您提供的返回值,如下所示: 如何创建 bash 脚本来检查 SSH 连接?

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

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

编辑-我作弊并使用了 nc

像这样的东西:

#!/bin/bash
ssh_port_is_open() { nc -z ${1:?hostname} 22 > /dev/null; }

for host in `cat /tmp/hosts` ; do
    if  ssh_port_is_open $host; then
        ssh -o "BatchMode=yes" $i 'hostname; sudo ethtool eth1';
    else
        echo " $i Down"
    fi
done
Run Code Online (Sandbox Code Playgroud)