緣起
檢測遠程服務器的某一個端口(尤其是 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。