我有多个远程主机连接到本地主机(服务器-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访问或无法访问。?
这是满足问题的最简单命令(不需要 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。
如果您专门使用 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以验证连接可用。