題 測試遠程系統上的端口是否可訪問(沒有telnet)


在過去,我們使用過 telnet 查看遠程主機上的端口是否已打開: telnet hostname port 將嘗試連接到任何主機上的任何端口,並允許您訪問原始TCP流。

目前,我使用的系統沒有安裝telnet(出於安全原因),默認情況下阻止所有主機的所有出站連接。隨著時間的推移,很容易忘記哪些端口對哪些主機開放。

是否有另一種方法來測試遠程系統上的端口是否打開 - 使用安裝了有限數量的軟件包的Linux系統,以及 telnet 不可用?


272
2017-07-19 16:54


起源


有關: 檢查遠程主機上一個端口的狀態 在SO - kenorb


答案:


Bash已經能夠訪問 TCP 和 UDP 端口一段時間。從手冊頁:

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


228
2017-07-22 10:37



這也似乎有效 MinGW的。例如,一個遙控器 VNC 192.168.2.100上的服務器使用“cat </dev/tcp/192.168.2.100/5900”以“RFB 003.008”響應。 - Peter Mortensen
但是在沒有打開的端口上它會在22秒後超時(試過 Ubuntu 14.04 (Trusty Tahr)用於遠程服務器)。有趣的是,超時時間遠短於nc(見 thnee的回答)。 - Peter Mortensen
@lornix,好的,但在這種情況下,我必須使用不帶-z選項的nc得到相同的結果,但它仍然不起作用:#nc -v -w5 127.0.0.1 18080連接到127.0.0.1 18080端口[tcp / *]成功了! #cat </dev/tcp/127.0.0.1/18080掛起沒有任何結果。只想了解何時可以使用“/ dev / tcp / host / port”選項 - Alexandr
@Alexandr ...實際上,“掛起沒有任何結果”是非常期待的行為。 貓 正在等待輸入。 NC 有額外的智能,使其能夠感知無數據待處理並停止嘗試。 貓 不 相當 聰明。嘗試 cat < /dev/tcp/localhost/22,你應該得到你的sshd標題。顯然,在發送任何內容之前,您在端口18080上的進程等待進入的內容。港口22(SSH用它的版本和諸如此類的東西來迎接你。試試看! - lornix
@lornix,非常感謝您的解釋!現在限制是明確的。我認為使用nc應該是檢查端口的首選方法。 - Alexandr


好又囉!從手冊頁。
單端口:

nc -zv 127.0.0.1 80

多個端口:

nc -zv 127.0.0.1 22 80 8080

港口範圍:

nc -zv 127.0.0.1 20-30

319
2017-12-03 21:34



似乎是最好的答案,謝謝。 ;-) - lpapp
這種情況在試用時被絞死了 Ubuntu 14.04 (Trusty Tahr)用於關閉端口的遠程服務器(相同的LAN)(在127秒後超時) - 因此不太適合腳本。它確實適用於端口打開的服務。使用選項“-w2”可能是解決方案。 - Peter Mortensen
對UDP端口使用-u選項。 - Efren
在版本6.4的ncat -z無法識別。我能夠沒有z - smishra
您可以使用以下方法檢查多個範 nc -zv 127.0.0.1 22,80,8080,20-30,443-446 (nc版本:1.107-4)。 - bobbel


Netcat是一個有用的工具:

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

會輸出 0 如果端口123打開,並且 1 如果它關閉了


96
2017-07-19 18:07



這是一個比我自己更優雅和可編寫腳本的答案。對於那些隱瞞了安全意識的系統管理員來說,這是不幸的 telnet也是版主 nc (雖然 - 奇怪的是 - 不是 curl 要么 wget)。 - Steve HHH
是的,完全是武斷的。 - thnee
讓我們 FOR 陳述開始了! - Chad Harrison
這種情況在試用時被絞死了 Ubuntu 14.04 (Trusty Tahr)用於關閉端口的遠程服務器(相同的LAN)(大約127秒後超時) - 因此不太適合腳本。雖然對於端口打開,返回0的服務確實有效。使用選項“-w2”可能是解決方案。 - Peter Mortensen
我認為 -G 2 更適合TCP超時 - A B


最簡單的方法,不使用其他工具,如 socat,如上面@ lornix的回答所述。這只是為了添加一個如何使用偽設備的實際示例 /dev/tcp/... 如果您想要測試另一台服務器是否具有可通過命令行訪問的給定端口,請在Bash中進行測試。

例子

假設我的網絡上有一個名為的主機 skinner

$ (echo > /dev/tcp/skinner/22) >/dev/null 2>&1 \
    && echo "It's up" || echo "It's down"
It's up

$ (echo > /dev/tcp/skinner/222) >/dev/null 2>&1 && \
    echo "It's up" || echo "It's down"
It's down

你想要包裝的原因 echo > /dev/... 在這樣的括號中, (echo > /dev/...) 是因為如果你不這樣做,那麼通過對連接斷開的測試,你會看到這些類型的消息出現。

$ (echo > /dev/tcp/skinner/223) && echo hi
bash: connect: Connection refused
bash: /dev/tcp/skinner/223: Connection refused

這些不能簡單地重定向到 /dev/null 因為他們來自嘗試將數據寫入設備 /dev/tcp。所以我們捕獲子命令中的所有輸出,即 (...cmds...) 並重定向子命令的輸出。


51
2017-09-02 17:59



這很棒。希望它會被投票到頂部。我只在頁面上讀到這個,因為我在關閉之前不小心滾動了。 - Still.Tony
@ Okuma.Tony - 是的,這總是Q的問題,有很多答案8-)。感謝您的反饋,非常感謝。 - slm


我找到 curl 可能會以類似的方式完成工作 telnet,和 curl 甚至會告訴你聽眾期望的協議。

從主機名和端口構造HTTP URI作為第一個參數 curl。如果 curl 可以連接,它將報告協議不匹配並退出(如果監聽器不是Web服務)。如果 curl 無法連接,它會超時。

例如,主機10.0.0.99上的端口5672被防火牆關閉或阻止:

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

但是,從另一個系統,可以到達主機10.0.0.99上的端口5672,並且似乎正在運行AMQP偵聽器。

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

區分不同的消息很重要:第一次失敗是因為 curl 無法連接到端口。然而,第二次失敗是成功的考驗 curl 期望HTTP偵聽器而不是AMQP偵聽器。


36
2017-07-19 17:05



如果捲曲不可用,wget可能是。 wget -qS -O- http://ip.add.re.ss:port 應該有效地做同樣的事情。 - α CVn
這甚至適用於主機名,例如。 curl myhost:22。 - 에이바
這可能是不正確的。我正在運行一個tomcat服務,但是收到404錯誤。 #curl -k 192.168.194.4:6443 <html> <head> <title> Apache Tomcat / 7.0.34 - 錯誤報告</ title> <style> <! - H1 --- HR {color:#525D76;} - > </ style> </ head> <body> <h1> HTTP狀態404 - / </ h1> <HR size =“1”noshade =“noshade”> <p> <b>類型</ b>狀態報告</ p> <p> <b>消息</ b> <u> / </ u> </ p> <p> <b>描述</ b> <u>請求的資源不可用。</ u> </ p> < HR size =“1”noshade =“noshade”> <h3> Apache Tomcat / 7.0.34 </ h3> </ body> </ html> - Mohammad Shahid Siddiqui
看我的 崗位 用類似的方法。 - kenorb


[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!

希望它能解決你的問題:)


8
2018-06-02 06:27



是的,這是更好的 - 幾乎立即關閉端口的時間。 - Peter Mortensen
這總是使用TCP還是有辦法讓它檢查UDP? - kmoe


這是單行:

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

使用Bash語法解釋 @lornix回答

有關詳細信息,請檢查: 高級Bash-Scripting Guide:第29章。 /dev 和 /proc


7
2018-03-16 11:21





我一整天都在苦苦掙扎,因為這些答案似乎都不適合我。問題是最新版本的 nc 不再有了 -z 標誌,而當主機無法訪問時,通過TCP直接訪問(根據@lornix和@slm)會失敗。我終於找到了 這一頁,我終於發現不是一個而是  工作實例:

  1. nc -w1 127.0.0.1 22 </dev/null

    (該 -w flag負責超時,以及 </dev/null 取代了 -z 旗)

  2. timeout 1 bash -c '(echo > /dev/tcp/127.0.0.1/22) >/dev/null 2>&1'

    (該 timeout 命令負責超時,其餘來自@slm)

然後,簡單地使用 && 和/或 || (甚至 $?)提取結果。希望有人會發現這些信息很有用。


6
2018-05-31 08:45





它不應該放在你的盒子上,但試試吧 nmap


2
2017-07-19 17:01



nmap 是一個很好的工具,但在這些系統上不可用。而不是下載 nmap,編譯它,將它安裝到我的主目錄,然後將其複製到所有其他系統,我希望找到一種方法,使用大多數Linux安裝中現有的工具。 - Steve HHH