Netcat(Linux nc 指令)網路管理者工具實用範例

Netcat 是 Linux 系統下管理者常用的網路工具,這裡蒐集一些關於 Netcat 實用的範例。

Netcat 是 Linux 系統中一個多功能的工具程式,雖然它只是一個小程式,但是能夠做的事情很多,就像瑞士刀一樣,幾乎任何使用 TCP 或 UDP 封包的動作都可以用它來達成,是許多系統管理者(包含我自己)最喜愛的網路診斷工具之一。


Netcat 這個工具在 Linux 系統中的指令名稱是 nc,以下是各種 nc 指令的實用範例。

在一般的 Linux 系統中,從 0 到 1023 這個範圍的連接埠(port)是需要有 root 權限才能使用的,而 1024 以上的連接埠則是可以讓一般的使用者使用,在使用 Netcat 時請注意這個權限問題。

測試特定的 TCP 連接埠(port)是否有開啟

nc 可以用來檢測伺服器特定的連接埠(port)是否有開啟:

nc -v 192.168.0.175 5000

若輸出為:

nc: connect to 192.168.233.208 5000 (tcp) failed: Connection refused

這樣就表示該連接埠沒有開啟。

如果是有開啟的連接埠,會像這樣:

nc -v 192.168.0.175 22

輸出為:

Connection to 192.168.0.175 22 port [tcp/ssh] succeeded!
SSH-2.0-OpenSSH_6.0p1 Debian-4

傳送測試用的 UDP 封包到遠端伺服器

下面這行指令會傳送 UDP 的測試封包到指定的機器與連接埠,-w1 參數是指定 timeout 的時間為 1 秒。

echo -n "foo" | nc -u -w1 192.168.1.8 5000

開啟 UDP 連接埠接收資料

下面這行指令會開啟一個指定的 UDP 連接埠,並將接收到的文字資料直接輸出在終端機中:

nc -lu localhost 5000

遠端機器的連接埠掃描(Port Scanning)

這行指令會掃描指定機器 1 ~ 1000 與 2000 ~ 3000 這兩個範圍的 TCP 連接埠,看看哪些埠號有開啟。

nc -vnz -w 1 192.168.233.208 1-1000 2000-3000

這行則是掃描 UDP 的連接埠:

nc -vnzu 192.168.1.8 1-65535

在兩台主機之間複製檔案

假設現在有兩台主機,分別為 A 主機與 B 主機,若要將一個檔案從 A 主機複製到 B 主機,可以先在 B 主機(檔案接收者)上執行:

nc -l 5000 > my.jpg

然後在 A 主機(檔案傳送者)上執行:

nc hostB.com 5000 < my.jpg

這樣就可以把 my.jpg 這個檔案從 A 主機複製到 B 主機上了。 雖然這個方式跟 scp 指令比起來可能不是最方便的,但是它的特點是不需要登入的動作(也就是說不需要任何帳號與密碼),假設你碰到兩台主機無法互相登入的時候,就可以使用這樣的方式處理。

在兩台主機之間複製整個目錄

如果要使用 nc 指令複製整個目錄,可以使用 tar 指令將整個目錄壓縮成一個檔案後再進行傳送,傳送到另一台主機後,再用 tar 指令解壓縮。 先在 B 主機(檔案接收者)上執行:

nc -l 5000 | tar xvf -

然後在 A 主機(檔案傳送者)上執行:

tar cvf - /path/to/dir | nc hostB.com 5000

備份硬碟資料至遠端主機中

若要將 A 主機的 /dev/sdb 這顆硬碟的資料備份至 B 主機中,可以先在 B 主機上執行:

nc -l 5000 | dd of=sdb-backup.img.gz

然後在 A 主機上執行:

dd if=/dev/sdb | gzip -c | nc hostB.com 5000

藉由遠端主機中的備份檔案回覆硬碟資料

若要使用 B 主機中的備份檔案回覆 A 主機的 /dev/sdb 硬碟資料,則先在 A 主機執行:

nc -l 5000 | gzip -d | sudo dd of=/dev/sdb

然後在 B 主機上執行:

nc hostA.com 5000 < sdb-backup.img.gz

固定頁面的網頁伺服器

下面這行指令可以在 8000 連接埠上建立一個提供固定頁面(不管 HTTP 的請求為何,都送出 test.html)的網頁伺服器:

while true; do nc -l 8000 < test.html; done

執行這行指令後,使用瀏覽器開啟 http://HOST_IP_ADDRESS:8000/test.html,就可以看到 test.html 的內容了。 當瀏覽器打開網頁時,在終端機中就會輸出瀏覽器所送出的 HTTP 請求內容,就像這樣:

GET / HTTP/1.1
Host: localhost:8000
Connection: keep-alive
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.107 Safari/537.36
Accept-Encoding: gzip,deflate,sdch
Accept-Language: zh-TW,zh;q=0.8,en-US;q=0.6,en;q=0.4
GET /favicon.ico HTTP/1.1
Host: localhost:8000
Connection: keep-alive
Accept: */*
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.107 Safari/537.36
Accept-Encoding: gzip,deflate,sdch
Accept-Language: zh-TW,zh;q=0.8,en-US;q=0.6,en;q=0.4

如果要在 80 連接埠上開啟網頁伺服器,就要使用 root 權限:

while true; do sudo nc -l 80 < test.html; done

nc 指令通常都是給管理者進行除錯或測試等動作用的,所以如果只是單純需要臨時的網頁伺服器,使用 Python 的 SimpleHTTPServer 模組會比較方便。

手動送出 HTTP 請求

這行指令會送出一個 HTTP 請求至網頁伺服器上,並接收網頁伺服器的回應訊息:

echo -ne "GET / HTTP/1.0\r\n\r\n" | nc www.google.com 80

這個輸出會包含伺服器回應的標頭資訊,像這樣:

HTTP/1.0 302 Found
Cache-Control: private
Content-Type: text/html; charset=UTF-8
Location: http://www.google.com.tw/?gfe_rd=cr&ei=cQUEU4rVGInE9AXmiIGYDw
Content-Length: 262
Date: Wed, 19 Feb 2014 01:14:25 GMT
Server: GFE/2.0
Alternate-Protocol: 80:quic

<HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8">
<TITLE>302 Moved</TITLE></HEAD><BODY>
<H1>302 Moved</H1>
The document has moved
<A HREF="http://www.google.com.tw/?gfe_rd=cr&amp;ei=cQUEU4rVGInE9AXmiIGYDw">here</A>.
</BODY></HTML>

手動使用 SMTP 協定寄信

在測試郵件伺服器是否正常時,可以使用這樣的方式手動寄送 Email:

nc localhost 25 << EOF
HELO host.example.com
MAIL FROM: <user@host.example.com>
RCPT TO: <user2@host.example.com>
DATA
Body of email.
.
QUIT
EOF

透過代理伺服器(Proxy)連線

這指令會使用 10.2.3.4:8080 這個代理伺服器,連線至 host.example.com42 連接埠。

nc -x10.2.3.4:8080 -Xconnect host.example.com 42

使用 Unix Domain Socket

這行指令會建立一個 Unix Domain Socket,並接收資料:

nc -lU /var/tmp/dsocket

參考資料:Xmodulo

Linux

11 Comments

  1. 阿河

    G.T.Wang您好
    小弟最近再用pi測試溫溼度
    想透過netcat把資料傳到server去
    指令像這樣

    nc -w 1 -u ip_server 514 < test.txt

    想請問接收端的server有需要打什麼指令接收嗎
    不需要的話會在server的哪邊找到檔案呢?
    感謝

    • G. T. Wang

      接收端需要執行類似這樣的指令:
      nc -l 514 > test.txt

      • 阿河

        謝謝
        但那還指令的514 不是會指定預設的TCP PORT嗎
        我那行是指定UDP的 這樣也能成功嗎?

        另還想在請問G.T.Wang 開啟port的方法或指令
        最近在操作時都無法傳輸 想說是PORT的問題
        但不清楚開啟PORT的方法
        不好意思 感謝

        • G. T. Wang

          若是 UDP 就加上 -u,例如 nc -lu 514 > test.txt

          • 阿河

            不好意思又遇到了問題
            我兩邊打上指令後
            接收端那邊顯示
            nc:Permission denied

            請問有解決的辦法嗎

          • G. T. Wang

            您使用的連接埠號碼太小了,要使用 root 權限,或是改用 1024 以上的連接埠。

  2. 請問站長您的 ncat 是哪個版本?
    我的版本沒有 -z 和指定 port 範圍的功能。

    • G. T. Wang

      我用的是 Ubuntu Linux 下 netcat-openbsd 套件所提供的 nc。

  3. 阿河

    感謝 成功了哈哈
    謝謝您的指導 謝謝

  4. 阿河

    不好意思,還是有個小問題~
    後來想再另一台server上測試
    結果沒有成功

    想說會不會有可能是NC版本的問題
    因為執行類似 nc -vnzu 192.168.xx.xx 1-1024
    的指令時都沒反應

    想請問G.T.Wang的NC是怎麼安裝的 或該怎麼更新呢?
    我是安裝 netcat-0.7.1-1.i386.rpm 這個套件的

    • G. T. Wang

      我用的是 Ubuntu Linux 下 netcat-openbsd 套件所提供的 nc。

Leave a Reply