命令行探测服务器某一端口是否打开

缘起

检测远程服务器的某一个端口(尤其是 tcp )是否已经被打开,这貌似是 SA 们排错时遇到的一个常见场景,

方案

telnet

最早,我常用的方案是使用 telnet。估计那时也只有 telnet 可用:)

1
2
yum -y install telnet;
telnet baidu.com 80;

上面的命令正确连上以后会有输出:

Trying 180.149.132.47…
Connected to baidu.com.
Escape character is ‘^]’.

nc

后来,发现还有 nc,网络工具中的瑞士军刀:)

1
2
yum -y install nc;
nc -vz baidu.com 80;

成功后会提示:

Connection to baidu.com 80 port [tcp/http] succeeded!

仔细看上面的这句输出提示,看出来什么名堂没有?对啦:“tcp/http”!这么说 nc 还能检测 udp 端口不成?man 了一下,还真可以:

1
nc -vz -u 10.0.0.1 53

成功以后系统提示:

Connection to 10.0.0.1 53 port [udp/domain] succeeded!

bash

再后来,中老年如我,终于返璞归真,发现其实 bash 就直接支持这种检测。OK,废话少说,直接看命令:

1
man bash

找到这几句提示:

/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.

故而测试命令很好玩儿:

1
>/dev/tcp/baidu.co/80;echo $?;

当成功连上 baidu.com 的 tcp 80 端口的时候,返回 0。