如何在不实际执行ssh的情况下查找远程主机是否可以通过SSH访问

2 unix linux ssh bash shell

我有多个远程主机连接到本地主机(服务器-A)。为了确保/过滤真正可以访问localhost的主机列表,我执行ping测试。

ping -c1 <remotehost-IP> 

if [ "$?" != "0" ];then
echo "Not reachable.Exiting..."
exit 1;
fi
Run Code Online (Sandbox Code Playgroud)

但是ping测试无法为我提供任何检查,以确保通过SSH连接/端口22可以访问已过滤的remotehost-IP。

    non-root-user@localhost>ssh 172.26.192.15
    ssh: connect to host 172.26.192.15 port 22: Connection refused
 non-root-user@localhost>echo $?
 1

non-root-user@localhost>ssh -v  172.26.192.15
OpenSSH_3.9p1, OpenSSL 0.9.7a Feb 19 2003
debug1: Reading configuration data /etc/ssh/ssh_config
debug1: Applying options for *
debug1: Connecting to 172.26.192.15 [172.26.192.15] port 22.
debug1: connect to address 172.26.192.15 port 22: Connection refused
ssh: connect to host 172.26.192.15 port 22: Connection refused
Run Code Online (Sandbox Code Playgroud)

查询:

如果连接被拒绝,上面为我检查工作。但是,如果可以进行SSH连接,那么我将进入远程主机或进入密码提示。这导致检查返回码的障碍。

因此,我想知道是否有任何方法可以事先检查远程IP是否可以通过SSH访问或无法访问。?

Sla*_*lag 9

这是满足问题的最简单命令(不需要 nmap 或 nc):

ssh -o PubkeyAuthentication=no -o PasswordAuthentication=no -o KbdInteractiveAuthentication=no -o ChallengeResponseAuthentication=no host.foo.com 2>&1 | grep "Permission denied"
Run Code Online (Sandbox Code Playgroud)

说明:尝试连接禁用的常用身份验证方法并 grep STDERR 获取“权限被拒绝”。如果主机正在为 SSH 提供服务,无论凭据如何,并且不会挂起等待密码输入,则返回退出状态 0。

  • 所以对我来说最后的命令是:`ssh -o BatchMode=yes -o ConnectTimeout=5 -o PubkeyAuthentication=no -o PasswordAuthentication=no -o KbdInteractiveAuthentication=no -o ChallengeResponseAuthentication=no -p 12345 127.0.0.1 2&gt;&amp;1 | fgrep -q "权限被拒绝"; 回声 $?` (3认同)
  • 我想知道为什么不赞成这一点,因为这是最直接的解决方案。我唯一要添加的是几个选项:`-o BatchMode=yes` 以避免在任何情况下等待键盘输入(例如,如果主机身份已更改),以及 `-o ConnectTimeout=5` 以控制时间. 我还希望在 grep 命令中添加 `-q` 以使其保持静音。 (2认同)

Tod*_*obs 6

Bash 特定的解决方案

如果您专门使用 Bash shell,那么您可以访问 TCP 和 UDP 套接字。例如:

if (exec 3<>/dev/tcp/74.207.252.238/22) 2> /dev/null; then
    echo open
else
    echo closed
fi
Run Code Online (Sandbox Code Playgroud)

这不会告诉您实际使用的协议是否真的是 SSH,但通常足以确定给定端口正在侦听。你的旅费可能会改变。


小智 5

Netcat也应该做这项工作。

nc -z host 22
Run Code Online (Sandbox Code Playgroud)

-z指定不发送数据,仅扫描正在运行的守护程序

输出将如下所示:

Connection to localhost 22 port [tcp/ssh] succeeded!
Run Code Online (Sandbox Code Playgroud)

因此,如果您想以编程方式更多地处理此问题,则可以将输出扔到/ dev / null,然后检查$?等于0以验证连接可用。