缘起
检测远程服务器的某一个端口(尤其是 tcp )是否已经被打开,这貌似是 SA 们排错时遇到的一个常见场景,
方案
telnet
最早,我常用的方案是使用 telnet。估计那时也只有 telnet 可用:)
yum -y install telnet;
telnet baidu.com 80;
上面的命令正确连上以后会有输出:
Trying 180.149.132.47...
Connected to baidu.com.
Escape character is '^]'.
nc
后来,发现还有 nc,网络工具中的瑞士军刀:)
yum -y install nc;
nc -vz baidu.com 80;
成功后会提示:
Connection to baidu.com 80 port [tcp/http] succeeded!
仔细看上面的这句输出提示,看出来什么名堂没有?对啦:“tcp/http”!这么说 nc 还能检测 udp 端口不成?man 了一下,还真可以:
nc -vz -u 10.0.0.1 53
成功以后系统提示:
Connection to 10.0.0.1 53 port [udp/domain] succeeded!
bash
再后来,中老年如我,终于返璞归真,发现其实 bash 就直接支持这种检测。OK,废话少说,直接看命令:
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.
故而测试命令很好玩儿:
>/dev/tcp/baidu.co/80;echo $?;
当成功连上 baidu.com 的 tcp 80 端口的时候,返回 0。