当前位置: 首页 > 知识库问答 >
问题:

如何确定远程主机是否可以通过SSH访问,而不需要实际执行SSH

阎元徽
2023-03-14

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

ping -c1 <remotehost-IP> 

if [ "$?" != "0" ];then
echo "Not reachable.Exiting..."
exit 1;
fi

然而,ping测试无法为我提供任何检查,以确保过滤后的远程主机IP可以通过SSH连接/端口22访问。

    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

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

所以我想知道是否有任何方法可以事先检查远程IP是否可以通过SSH访问?

共有3个答案

仲孙俊贤
2023-03-14

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

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

这不会告诉您实际使用的协议是否真的SSH,但通常足以确定给定端口正在侦听。您的里程可能会有所不同。

慎懿轩
2023-03-14

Netcat也应该做这项工作。

nc -z host 22

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

输出如下所示:

Connection to localhost 22 port [tcp/ssh] succeeded!

因此,如果您想以编程方式处理这个问题,您可以将输出抛出到/dev/null,然后检查$?等于0以验证连接是否可用。

酆景辉
2023-03-14

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

ssh -o PubkeyAuthentication=no -o PasswordAuthentication=no -o KbdInteractiveAuthentication=no -o ChallengeResponseAuthentication=no host.foo.com 2>&1 | grep "Permission denied"

解释:尝试与禁用的常用auth方法和grep STDERR连接,以表示“权限被拒绝”。如果主机正在为SSH提供服务(无论凭据如何),并且未挂起等待密码输入,则返回退出状态0。

 类似资料:
  • 我刚刚为Github repo创建了一个Wiki,并将其克隆到我的桌面上。只有使用进行克隆的选项,这意味着每次我尝试推送git时,都会要求我输入用户名和密码。 在Github Wiki中,有什么方法可以像我在所有标准回购中一样使用SSH吗? 我查看了 Wiki 帮助,但在那里找不到任何东西。 顺便说一句,我在吉特哈布中使用了2FA。

  • 问题内容: 我想测试使用Java可以访问远程系统,或者换句话说使用Java“发送ping”。该功能应封装在具有布尔值的方法中,例如 我已经测试了Java Process类,但是由于使用OutputBuffers进行复杂的输出处理,因此我认为这不是最好的方法。 另一种可能性是创建一个Socket Connection并处理抛出的异常,但是如果远程系统是一个“裸”的Unix系统,则另一端可能没有Soc

  • 问题内容: 在我的我确定,我可以在命令行后使用的功能: 使用此命令时,仅在远程主机上执行该命令。该命令在本地主机上执行。这是因为分号将两个不同的命令分开:命令和命令。 我尝试如下定义函数(注意单引号): 我试图将命令和命令放在一起,但是参数解析不取决于我给函数的内容。总是试图执行命令 在远程主机上。 如何正确定义,所以剧本正在改变进入目录后,在远程主机上执行,具有传递给参数的能力来? 问题答案:

  • 我希望使用jmx或JSTATD通过ssh隧道(到EC2机器)使用visualvm应用程序。我该怎么做?下面是已经尝试(和失败)的列表:(顺便说一句:如果visual vm不合适,如何在远程计算机上查找内存泄漏?) 我在EC2机器上设置了jstatd服务器(应用程序已经在上面运行),然后在VisualVM中设置了一个将本地端口3333映射到远程端口1099的隧道,我试图在端口3333上使用jstat

  • 问题内容: 我将开发环境设置为vmware中的Ubuntu服务器(安装了LAMP)。vmware在我的本地Windows 7计算机上运行。当我尝试通过HeidiSQL程序访问我的mysql服务器时,连接失败。我得到: 但是,我可以通过PhpMyAdmin访问数据库服务器。MySQL正在运行,我的连接凭据和端口均正确。 我读到您应该输入要连接的计算机的IP地址,作为my.cnf文件中的“绑定地址”。

  • 当我得到一个Spring豆(通过getBean())时,有没有办法从java代码中验证豆子是否已经用范围=原型定义了? Spring配置: Java: sc 我可以实例化它两次并比较对象,但是我想避免不必要的对象创建。这个答案的反义词可能会有用:https://stackoverflow.com/a/9125610/156477