2013-07-19 16:54:10 +0000 2013-07-19 16:54:10 +0000
369
369

测试远程系统上的端口是否可以访问(不使用telnet)

以前,我们用telnet来查看远程主机上的端口是否开放:telnet hostname port会尝试连接到任何主机上的任何端口,并让你访问原始TCP流。久而久之,很容易忘记哪些端口对哪些主机是开放的。

有没有其他方法来测试远程系统上的端口是否开放–使用安装了有限的Linux系统,而telnet又不能使用,那么请问有什么方法可以测试远程系统上的端口是否开放呢?

答案 (13)

418
418
418
2013-12-03 21:34:41 +0000

好看又省事! 单端口:

nc -zv 127.0.0.1 80
nc -zv 127.0.0.1 22 80 8080

多端口:

nc -zv 127.0.0.1 20-30

范围:

&001

297
297
297
2013-07-22 10:37:11 +0000

Bash已经可以访问TCPUDP端口了。从man page:

/dev/tcp/host/port
    If host is a valid hostname or Internet address, and port is an integer port number
    or service name, bash attempts to open a TCP connection to the corresponding socket.
/dev/udp/host/port
    If host is a valid hostname or Internet address, and port is an integer port number
    or service name, bash attempts to open a UDP connection to the corresponding socket.

所以你可以用这样的方法:

xenon-lornix:~> cat < /dev/tcp/127.0.0.1/22
SSH-2.0-OpenSSH_6.2p2 Debian-6
^C pressed here

Taa Daa!

104
104
104
2013-07-19 18:07:26 +0000

Netcat是个好用的工具:

nc 127.0.0.1 123 &> /dev/null; echo $?

0 如果端口123打开,将输出1,如果关闭,将输出&007。

61
61
61
2014-09-02 17:59:36 +0000

在不使用其他工具,例如 socat 的情况下,最简单的方法是上面 @lornix 的回答中描述的。这只是为了补充一个实际的例子,如果你想通过命令行测试另一个服务器是否有一个给定的端口可以通过命令行访问,那么在Bash中如何使用psuedo-device /dev/tcp/...。 所以我们要把这些输出都抓到一个子命令中,也就是skinner中的输出,然后重定向到这个子命令的输出。

48
48
48
2013-07-19 17:05:30 +0000

我发现curl可能会用类似于telnet的方法来完成工作,curl甚至会告诉你监听器期望的协议是哪个协议。如果curl可以连接,它将报告一个协议不匹配并退出(如果监听器不是web服务)。如果curl不能连接,它就会超时。

例如,主机10.0.0.0.0.99上的端口5672不是被防火墙关闭就是被防火墙屏蔽了:

$ curl http://10.0.0.99:5672
curl: (7) couldn't connect to host

然而,从不同的系统中,主机10.0.0.0.99上的端口5672可以到达。 0.0.0.99可以到达,似乎正在运行AMQP监听器。

$ curl http://10.0.0.99:5672
curl: (56) Failure when receiving data from the peer
AMQP

&001

要区分不同的消息:第一次失败是因为curl无法连接到该端口。第二个失败是一个成功测试,尽管curl预计是HTTP监听器而不是AMQP监听器。

13
13
13
2015-06-02 06:27:59 +0000
[admin@automation-server 1.2.2]# nc -v -z -w2 192.168.193.173 6443
nc: connect to 192.168.193.173 port 6443 (tcp) failed: Connection refused

[admin@automation-server 1.2.2]# nc -v -z -w2 192.168.194.4 6443
Connection to 192.168.194.4 6443 port [tcp/sun-sr-https] succeeded!

希望它能解决你的问题 :)

11
11
11
2016-03-16 11:21:40 +0000

以下是单行本:

</dev/tcp/localhost/11211 && echo Port is open || echo Port is closed

使用Bash语法讲解的【@lornix答案】(https://superuser.com/a/622641/87805).

更多信息,请查看。高级Bash-Scripting Guide: Chapter 29./dev/proc.

8
8
8
2017-05-31 08:45:09 +0000

我纠结了一整天,因为这些答案似乎都不适合我。问题是nc的最新版本不再有-z标志,而通过TCP直接访问(根据@lornix和@slm的说法),当主机无法到达时,直接访问就会失败。 希望有人会发现这些信息对你有用。

6
6
6
2018-08-10 12:20:04 +0000

结合 @kenorb 和 @Azukikuru 的答案,你可以测试端口的打开/关闭/封锁。

4
4
4
2019-02-12 20:21:11 +0000

这里有一个函数可以根据你的系统安装了什么,选择其中一种方法:

# Check_port <address> <port> 
check_port() {
if ["$(which nc)" != ""]; then 
    tool=nc
elif ["$(which curl)" != ""]; then
     tool=curl
elif ["$(which telnet)" != ""]; then
     tool=telnet
elif [-e /dev/tcp]; then
      if ["$(which gtimeout)" != ""]; then  
       tool=gtimeout
      elif ["$(which timeout)" != ""]; then  
       tool=timeout
      else
       tool=devtcp
      fi
fi
echo "Using $tool to test access to $1:$2"
case $tool in
nc) nc -v -G 5 -z -w2 $1 $2 ;;
curl) curl --connect-timeout 10 http://$1:$2 ;;
telnet) telnet $1 $2 ;;
gtimeout) gtimeout 1 bash -c "</dev/tcp/${1}/${2} && echo Port is open || echo Port is closed" || echo Connection timeout ;;
timeout) timeout 1 bash -c "</dev/tcp/${1}/${2} && echo Port is open || echo Port is closed" || echo Connection timeout ;;
devtcp) </dev/tcp/${1}/${2} && echo Port is open || echo Port is closed ;;
*) echo "no tools available to test $1 port $2";;
esac

}
export check_port
2
2
2
2013-07-19 17:01:16 +0000

你的盒子上应该没有,但可以用nmap试试。

1
1
1
2019-08-07 23:17:13 +0000

参考一下,扩展一下@peperunas的回答:

,用nmap来测试的方法是:

nmap -p 22 127.0.0.1

(上面的例子是用localhost来做示范

0
0
0
2018-10-26 13:49:54 +0000

如果你需要在系统上进行测试,你可以使用我们的测试工具 dda-serverspec https://github.com/DomainDrivenArchitecture/dda-serverspec-crate )来完成这些任务。你可以定义你的期望值

{:netcat [{:host "mywebserver.com" :port "443"}
          {:host "telnet mywebserver.com" :port "80"}
          {:host "telnet mywebserver.com" :port "8443"}]}
{:existing [{:node-name "test-vm1"
             :node-ip "35.157.19.218"}
            {:node-name "test-vm2"
             :node-ip "18.194.113.138"}]
 :provisioning-user {:login "ubuntu"}}

,并对这些期望值进行测试,可以是针对本地主机或远程主机(通过ssh连接)。对于远程测试,你必须定义一个目标:

&001

&001

你可以用java -jar dda-serverspec.jar --targets targets.edn serverspec.edn

运行测试。