本文首發於個人公衆號 Linux雲計算網絡(id: cloud_dev),專一於乾貨分享,號內有 10T 書籍和視頻資源,後臺回覆 「1024」便可領取,歡迎你們關注,二維碼文末能夠掃。
nc,全名叫 netcat,它能夠用來完成不少的網絡功能,譬如端口掃描、創建TCP/UDP鏈接,數據傳輸、網絡調試等等,所以,它也常被稱爲網絡工具的 瑞士軍刀 。編程
咱們能夠這樣來使用它:ubuntu
nc [-46DdhklnrStUuvzC] [-i interval] [-p source_port] [-s source_ip_address] [-T ToS] [-w timeout] [-X proxy_protocol] [-x proxy_address[:port]] [hostname] [port[s]]
經常使用選項:vim
Linux 系統默認沒有安裝 nc,能夠用下面的方法安裝:centos
# centos yum install nc # ubuntu apt-get install netcat
nc 的本質是在兩臺機器之間創建鏈接,以後就能夠基於這個鏈接作不少事情,數據傳輸是其中一個最爲基本的。咱們下面就使用 nc 來創建一個 C/S 的聊天室。服務器
模擬 Server 端:網絡
# -v :輸出詳細信息 # -l :指定監聽地址和端口 nc -v -l 127.0.0.1 6000
模擬 Client 端:ssh
# -p : 指定源端口 nc -v -p 5000 localhost 6000
以後,Client 和 Server 端就能夠相互聊天了。tcp
Client:工具
# nc -v -p 5000 localhost 6000 nc: connect to localhost port 6000 (tcp) failed: Connection refused Connection to localhost 6000 port [tcp/x11] succeeded! Hi, server Hi, client
Server:雲計算
# nc -v -l 127.0.0.1 6000 Listening on [127.0.0.1] (family 0, port 6000) Connection from [127.0.0.1] port 6000 [tcp/x11] accepted (family 2, sport 5000) Hi, server Hi, client
nc 不只能夠發送消息,還可發送文件。
假設服務端有一個 out.txt 的空文件,而客戶端有一個 in.txt 文件,含有數據:hello server
。
Server 端接收文件:
nc localhost 6000 > out.txt
Client 端發送文件:
nc localhost 6000 < in.txt
以後,咱們能夠看到 Server 端的 out.txt 文件中已經有數據了:
# cat out.txt hello server
除了能夠發送文件,nc 也能夠發送目錄,只須要將目錄壓縮發送便可。
nc 默認使用 TCP 和 IPv4 協議創建鏈接,咱們可使用參數 -u
和 -6
參數來分別使用創建 UDP 和 IPv6 鏈接。
Server 端:
nc -u -6 -l localhost 6000
Client 端:
nc -u -6 localhost 6000
再開另外一個終端,用 lsof
驗證:
# lsof -Pni | grep nc nc 1966 root 3u IPv6 19317 0t0 UDP *:6000 nc 1976 root 3u IPv6 19330 0t0 UDP [::1]:49900->[::1]:6000
能夠看到,Client 端和 Server 端都顯示使用了 UDP 和 IPv6 協議。
端口掃描是一個很是重要的功能,不少時候系統管理員會經過掃描服務器上端口,來識別系統中漏洞,nc 工具提供了很是方便的操做:
nc -vz 192.168.0.117 1-100
這條命令掃描 192.168.1.3 上 1-100 端口區間,有哪些端口是開放的。
# nc -vz 192.168.0.117 1-100 ... nc: connect to 192.168.0.117 port 21 (tcp) failed: Connection refused Connection to 192.168.0.117 22 port [tcp/ssh] succeeded! nc: connect to 192.168.0.117 port 23 (tcp) failed: Connection refused ...
能夠看到,只有 22 號端口是開放的。
若是咱們想掃描多個服務器上的多個端口是否開放,能夠寫一個腳原本完成,好比:
首先,用一個 sip.txt
保存全部服務器的地址:
# cat sip.txt 192.168.1.2 192.168.1.3 192.168.1.4
再用一個 port.txt
保存要掃描的端口號:
# cat port.txt 22 80
而後,寫一個腳本 portscan.sh
來遍歷這個文件。
# vim portscan.sh #!/bin/sh for server in `more sip.txt` do for port in `more port.txt` do nc -zv $server $port echo "" done done
給這個腳本賦予可執行權限:
chmod +x portscan.sh
運行這個腳本就能夠自動掃描多個服務器的多個端口是否開放了。
# sh portscan.sh Connection to 192.168.1.2 22 port [tcp/ssh] succeeded! Connection to 192.168.1.2 80 port [tcp/http] succeeded! Connection to 192.168.1.3 22 port [tcp/ssh] succeeded! Connection to 192.168.1.3 80 port [tcp/http] succeeded! Connection to 192.168.1.4 22 port [tcp/ssh] succeeded! Connection to 192.168.1.4 80 port [tcp/http] succeeded!
nc 經過在兩臺機器之間創建鏈接來完成不少網絡功能,數據傳輸、網絡鏈接、端口掃描等,也有助於咱們進行網絡調試,排查網絡故障。
後臺回覆「加羣」,帶你進入高手如雲交流羣
個人公衆號 「Linux雲計算網絡」(id: cloud_dev) ,號內有 10T 書籍和視頻資源,後臺回覆 「1024」 便可領取,分享的內容包括但不限於 Linux、網絡、雲計算虛擬化、容器Docker、OpenStack、Kubernetes、工具、SDN、OVS、DPDK、Go、Python、C/C++編程技術等內容,歡迎你們關注。