﻿# 神奇的指令：netcat

[netcat](http://en.wikipedia.org/wiki/Netcat) 就像 cat 指令一樣，只是將簡單的 cat 功能完全「網路化」，好用與靈活的程度可說是很驚人，而在 [Top 100 Network Security Tools](http://sectools.org/) 排行榜中還排行第四名呢！

netcat 除了可以當 TCP Client 工具以外，還可以當 TCP Server 的工具，以下我用幾個簡單的例子說明：

**示範 netcat 如何當 TCP Client 工具**

> 底下這段指令代表你要將 /etc 目錄整個打包並壓縮起來，並將資料傳送到 10.0.0.99 主機的 Port 3456，並指定若超過 30 秒沒有連上目的地或 30 秒沒有回應的話自動 Timeout。
> 
> ```
> # tar -zcf - /etc | netcat -w 30 10.0.0.99 3456
> ```

**示範 netcat 如何當 TCP Server 工具**

> 如果拿以上的例子，你可能會想說那你還要自己寫一個 Server 接受這些封包啊！答案是：「只要用 netcat 就可以拿來當 Server 用了，一行程式也不用寫」，底下這段指令是假設從 10.0.0.99 主機執行的。
> 
> ```
> # netcat -l -p 3456 > /backup/my_etc_backup.tar.gz
> ```
> 
> \-l 參數代表進入 Listen mode
> 
> \-p 代表 Listen 的 Port 為 3456
> 
> 之後的 > my\_etc\_backup.tar.gz 代表你要將從 TCP 傳入的所有資料都導入到 /backup/my\_etc\_backup.tar.gz 檔案中。

用以上兩個非常簡單的例子就可以知道，原來在網路之間傳輸資料可以如此的簡單。若知道 [rsync](http://samba.anu.edu.au/rsync/) 工具的人可能會笑說：「用 netcat 太麻煩了吧，用 rsync 同步或備份檔案才更好用吧」。是的，如果要「同步檔案」的話，當然用 [rsync](http://samba.anu.edu.au/rsync/) 比較好用，不過 netcat 還可以做的更多！

因為 netcat 可以模擬任何所有 TCP Protocol 的動作，就如同我們常用 telnet 測試 HTTP、POP3、或 SMTP 協定的時候一樣，只是使用 netcat 可以讓我們更自動化的做些測試，舉幾個例子如下：

**1\. 測試 HTTP 運作是否正常**

> 首先，必須先建立要下的 HTTP 指令檔，假設叫 **GET\_tw.yahoo.com.txt**，內容如下：
> 
> ```
> GET / HTTP/1.0
> Host: tw.yahoo.com
> ```
> 
> *注意：在指令的最後面必須要有兩個「斷行」符號，所以你可以在文字檔後面加上兩行空白行。*
> 
> 然後就可以用以下指令取得 Yahoo! 奇摩 的首頁 HTML：
> 
> ```
> # cat GET_tw.yahoo.com.txt | nc tw.yahoo.com 80
> ```
> 
> 再透過一些指令或程式就可以將測試網頁是否還活著的偵測程式完成且自動化了。

**2\. 測試 SMTP 運作是否正常**

> 測試 SMTP 的方式也跟 HTTP 一樣，就是先把指令都給先寫好，假設檔名是 SMTP\_test.txt，內容如下：
> 
> ```
> HELO localhost
> MAIL FROM:<will@test.com>
> RCPT TO:<will@test.com>
> DATA
> To: Will <will@test.com>
> Subject: This is a test
> 
> This is first line
> .
> QUIT
> ```
> 
> 然後就可以用以下指令將 SMTP Command 送到 smtp.test.com 了：
> 
> ```
> # cat SMTP_test.txt | nc smtp.test.com 25
> ```
> 
> 執行的結果如下：
> 
> ```
> # cat SMTP_test.txt | nc smtp.test.com 25
> 220 smtp.test.com ESMTP Service ready Fri, 11 Jul 2008 19:13:17 +0800 (CST)
> 250 smtp.test.com
> 250 Sender <doggy@test.com> OK
> 250 Recipient <doggy@test.com> OK
> 354 Enter mail, end <CRLF>.<CRLF>
> 250 Message accepted for delivery
> 221 smtp.test.com
> ```

如何上述幾個簡單的範例之外，當然也可以測試包括 FTP, POP3, ... 等任何 TCP-based 的服務都可以。

netcat 幾乎在每一個 Linux distribution 中都有預設安裝，算是一個非常普及的工具。如果你要在 Windows 上使用 netcat 工具的話，可以到[這裡](http://joncraton.org/files/nc111nt.zip)下載。

**相關連結**

-   [netcat](http://en.wikipedia.org/wiki/Netcat) - Wikipedia
-   [CLI Magic: netcat](https://www.linux.com/news/cli-magic-netcat/)
-   [Netcat is the TCP/IP swiss army knife available since 1996](http://www.vulnwatch.org/netcat/)
-   [Netcat 1.10 Bible README](http://www.vulnwatch.org/netcat/readme.html)
-   [Troubleshooting with netcat/telnet](http://www.foureleven.org/art/art_netcat.html)
-   [Sending Emails Using VBScript And NetCat](http://www.codeproject.com/KB/vbscript/Exsead9.aspx)
-   [Netcat – a couple of useful examples](http://www.g-loaded.eu/2006/11/06/netcat-a-couple-of-useful-examples/)
