1. 程式人生 > >linux nc 詳解

linux nc 詳解

nc

功能說明:功能強大的網絡工具

netcat(nc)是一個簡單而有用的工具,不僅可以通過使用TCP或UDP協議的網絡連接讀寫數據,同時還是一個功能強大的網絡調試和探測工具,能夠建立你需要的幾乎所有類型的網絡連接

安裝:

root@pts/0 # yum -y install nc

幫助:

root@pts/0 # nc -h
usage: nc [-46DdhklnrStUuvzC] [-i interval] [-p source_port]
          [-s source_ip_address] [-T ToS] [-w timeout] [-X proxy_version]
          [-x proxy_address[:port]] [hostname] [port[s]]
        Command Summary:
                -4              Use IPv4
                -6              Use IPv6
                -D              Enable the debug socket option
                -d              Detach from stdin
                -h              This help text
                -i secs         Delay interval for lines sent, ports scanned
                -k              Keep inbound sockets open for multiple  connects
                -l              Listen mode, for inbound connects
                -n              Suppress name/port resolutions
                -p port         Specify local port for remote connects
                -r              Randomize remote ports
                -S              Enable the TCP MD5 signature option
                -s addr         Local source address
                -T ToS          Set IP Type of Service
                -C              Send CRLF as line-ending
                -t              Answer TELNET negotiation
                -U              Use UNIX domain socket
                -u              UDP mode
                -v              Verbose
                -w secs         Timeout for connects and final net reads
                -X proto        Proxy protocol: "4", "5" (SOCKS) or "connect"
                -x addr[:port]  Specify proxy address and port
                -z              Zero-I/O mode [used for scanning]
        Port numbers can be individual or ranges: lo-hi [inclusive]

man 手冊翻譯:

NAME
     nc — 一個任意的TCP和UDP連接和監聽工具

SYNOPSIS
     nc [-46bCDdhklnrStUuvZz] [-I length] [-i interval] [-O length] [-P proxy_username] [-p source_port] [-q seconds] [-s source] 
        [-T toskeyword] [-V rtable] [-w timeout]
        [-X proxy_protocol] [-x proxy_address[:port]] [destination] [port]

DESCRIPTION
     nc (或 netcat) 實用工具用於任何涉及到TCP, UDP, 或 UNIX-domain sockets的場景[不怎麽會翻譯這個,按大致意思來了
        原文:The nc (or netcat) utility is used for just about anything under the sun involving TCP, UDP, or UNIX-domain sockets.]. 
        它可以打開TCP 連接, 發送UDP數據包,監聽任意的TCP和UDP端口, 實現端口掃描, 和同時處理IPV4和IPV6. 
        不同於telnet(1), nc腳本很nice, 並且輸出錯誤信息到標準錯誤,而不是標準輸出, as telnet(1) does with some.

     常見用法包括:

           ·   簡易 TCP 代理
           ·   基於HTTP客戶端和服務端的shell腳本
           ·   網絡守護進程測試
           ·   一個用於ssh(1)的 SOCKS 或 HTTP 代理命令行 
           ·   還有很多,很多

     有以下選項可用:

     -4      強制nc只使用IPv4地址。

     -6      強制nc只使用IPV6地址.

     -b      允許廣播.

     -C      發送CRLF作為換行符.

     -D      開啟debugging 在 socket.

     -d      不嘗試從stdin讀取數據.

     -h      打印nc幫助信息.

     -I length
             指定TCP接收緩沖區大小.

     -i interval
             指定文本行發送和接收的延時時間.  也可以制造連接到多端口的延時.

     -k     強制nc持續監聽另一個連接直到它的連接完成.  沒有 -l 選項是錯誤的.

     -l      用於指定nc應該監聽一個傳入的連接,而不是連接到遠程主機.  該選項不能與以下選項聯合使用
             -p, -s, 或 -z 選項.  此外, 任何用-w選項指定的超時會被忽略.

     -n      任何指定的地址,主機名或端口都不做任何DNS或服務解析.

     -O length
             指定TCP發送緩沖區的大小.

     -P proxy_username
             指定一個用戶名到代理服務器用於請求認證。如果沒有指定用戶名那麽將不會嘗試認證。 代理認證功能目前只支持HTTP CONNECT代理.

     -p source_port
             指定nc使用的源端口,受到權限和可用性的限制.

     -q seconds
             在stdin EOF之後, 等待指定秒數之後再退出. 如果秒數是負數, 永久等待.

     -r      指定源和/或目標端口隨機選擇而不是一個範圍序列或系統分配的順序.

     -S      開啟RFC 2385 TCP MD5簽名選項.

     -s source
             指定IP的接口用於發送數據包.  對於UNIX-domain 數據報 sockets, 指定創建和使用本地臨時socket文件
             這樣可以使數據報可以被接收。不可同時使用-l選項.

     -T toskeyword
             改變IPv4 TOS值.  toskeyword may be one of critical, inetcontrol, lowcost, lowdelay, 
             netcontrol, throughput, reliability, or one of the DiffServ Code Points: ef, af11
             ... af43, cs0 ... cs7(這句不會翻譯); 或者一個十六進制或十進制數. 

     -t      引發nc發送RFC 854 DON‘The WON‘T響應給RFC 854 DO和WILL請求。這使得使用nc腳本化telnet會話成為可能。

     -U     限定使用 UNIX-domain sockets.

     -u      使用UDP代替默認的TCP選項。對於UNIX-domain sockets,使用一個數據報 socket 代替一個 stream socket.
             如果使用UNIX-domain socket, 除非給定-s標記,否則會在/tmp創建一個臨時的receiving socket。

     -V rtable
             設置要使用的路由表. 默認是 0.

     -v     使nc給出更詳細的輸出.

     -w timeout
             無法建立的或者閑置的連接在指定秒數之後超時.  
             -w標記不會影響到-l選項, 例如. nc 將會不間斷的監聽一個連接, 無論有沒有-w標記.  默認都是不超時的.

     -X proxy_protocol
             要求nc使用指定協議連接到代理服務器.  支持的協議有 “4” (SOCKS v.4), 
             “5” (SOCKS v.5) and “connect” (HTTPS proxy).
             如果不指定協議, SOCKS version 5將會使用.

     -x proxy_address[:port]
             要求nc使用指定代理地址和端口連接到目標。如果不指定端口, 使用默認的代理協議端口 (1080 for SOCKS, 3128 for HTTPS).

     -Z      DCCP mode(數據報擁塞控制協議).

     -z      指定nc只是掃描正在監聽的守護進程,不發送任何數據.  不可和-l選項同時使用。

     目標可以是一個數字IP地址或字符主機名(除過指定-n選項外). 
     一般來說, 必須指定目標, 除非給出-l選項 (在這種情況下使用本地主機).  
     對於 UNIX-domain sockets, 一個目標是必要的,並且是一個socket路徑被用於連接(或監聽,如果-l選項被給定的話)。

     端口可以是一個整數或者一個範圍的端口號.  端口範圍使用這種格式指定nn-mm. 一般來說, 一個目標端口必須被指定, 除非-U選項被給出.

客戶端/服務器模式
     使用nc建立一個非常基本的客戶端/服務器模式是非常簡單的。在一個控制臺上,開啟nc監聽一個指定的端口等待連接。範例:

           $ nc -l 1234

     nc現在正在監聽1234端口等待連接。在第二個控制臺上(或第二臺機器), 連接到正在監聽的主機端口上:

           $ nc 127.0.0.1 1234

     現在應該在端口之間建立了連接。在第二個控制臺上的任何鍵入內容將會串發到第一個控制臺上,反之亦然.  在連接建立之後,
     nc不真正關心哪一方用於‘服務端’,哪一方用於‘客戶端’. 連接可以用EOF中斷 (‘^D’).

     在這個netcat沒有-c或-e選項, 但是你仍然可以在連接建立之後執行一個命令通過文件描述符重定向的形式。
     這裏務必小心,因為開放一個端口讓任何人連接並執行任意的命令在你的站點上是非常危險的。
     如果你真的想這麽做,這裏是一個範例:

     在‘服務器’端:

           $ rm -f /tmp/f; mkfifo /tmp/f
           $ cat /tmp/f | /bin/sh -i 2>&1 | nc -l 127.0.0.1 1234 > /tmp/f

     在‘客戶端’:

           $ nc host.example.com 1234
           $ (shell prompt from host.example.com)

     通過這個步驟, 你在‘服務器’端創建了一個fifo在/tmp/f並且使nc監聽地址127.0.0.1的1234端口,
     當一個‘客戶端’建立連接成功到那個端口,/bin/sh在‘服務器’端執行並且給‘客戶端’shell提示符。

     當連接終止時,nc同樣也會退出。如果你想持續監聽,使用-k, 但是命令退出時這個選項將不會重啟它或保持nc運行(這句翻譯好別扭,
     貼出原文參考:but if the command quits this option won‘t restart it or keep nc running.)
     同樣別忘了刪掉文件描述符當你不再需要它的時候:

           $ rm -f /tmp/f

數據傳輸
     前一個區域的範例可以擴展為構建一個基本的數據傳輸模式. 任何信息輸入的一端將會通過連接輸出到另一端, 
     並且輸入和輸出可以輕松捕獲用於文件傳輸。

     首先使用nc監聽一個指定端口,並且捕獲輸出到一個文件:

           $ nc -l 1234 > filename.out

     使用第二個機器,連接到nc進程監聽的這個端口上,餵給它要傳輸的文件:

           $ nc host.example.com 1234 < filename.in

     在文件完成傳輸之後,連接會自動關閉。

和服務器交談
     有時“手工”和服務器交談比通過一個用戶接口更有用。這可以幫助解決故障,當需要驗證由客戶端發起的請求,
     服務器發送的什麽數據響應到命令行時是有必要的。舉個例子,檢測網站主頁:

           $ printf "GET / HTTP/1.0\r\n\r\n" | nc host.example.com 80

     註意這同樣顯示了web服務器發送的headers.  他們可以使用例如sed(1)之類的工具過濾,如果有必要的話.

     更多復雜的範例同樣可以構建當用戶知道服務器需要的請求格式時。再比如,一個email可以使用以下方式提交到一個SMTP服務端:

           $ nc [-C] localhost 25 << EOF
           HELO host.example.com
           MAIL FROM:<[email protected]>
           RCPT TO:<[email protected]>
           DATA
           Body of email.
           .
           QUIT
           EOF

端口掃描
     想在目標機器上了解哪些端口開放並且運行服務可能很有用。-z標記可以用於告訴nc報告開放的端口,而不是初始化一個連接。
     通常通過聯合使用-v選項打開詳細輸出到stderr很有用。

     例如:

           $ nc -zv host.example.com 20-30
           Connection to host.example.com 22 port [tcp/ssh] succeeded!
           Connection to host.example.com 25 port [tcp/smtp] succeeded!

     端口範圍限定掃描20 - 30,通過升序.

     你同樣可以指定一個要掃描的端口列表,例如:

           $ nc -zv host.example.com 80 20 22
           nc: connect to host.example.com 80 (tcp) failed: Connection refused
           nc: connect to host.example.com 20 (tcp) failed: Connection refused
           Connection to host.example.com port [tcp/ssh] succeeded!

     端口掃描順序由你給定的次序決定.

     亦或者,對於知道哪個服務端軟件正在運行,是哪個版本可能有用。這些信息通常包含在 greeting banners 。
     為了獲取這些信息,有必要首先制造一個連接,然後當banner獲取到的時候破壞掉連接。
     這可以通過用-w標記指定一個短時間超時,或者可能通過發送一個"QUIT"命令給服務器的方式來獲得:

           $ echo "QUIT" | nc host.example.com 20-30
           SSH-1.99-OpenSSH_3.6.1p2
           Protocol mismatch.
           220 host.example.com IMS SMTP Receiver Version 0.84 Ready

其他範例
     打開一個TCP連接到host.example.com的42端口,使用31337作為源端口,並且設置5秒超時:

           $ nc -p 31337 -w 5 host.example.com 42

     打開一個UDP連接到host.example.com的53端口:

           $ nc -u host.example.com 53

     打開一個TCP連接到host.example.com的42端口,使用10.1.2.3作為本地端IP用於連接:

           $ nc -s 10.1.2.3 host.example.com 42

     創建和監聽一個UNIX-domain stream socket:

           $ nc -lU /var/tmp/dsocket

     連接到host.example.com的42端口,通過10.2.3.4上的8080端口的HTTP代理連接。
     這個範例同樣可以使用ssh(1)實現; 更多信息請參考ssh_config(5)中的ProxyCommand directive。

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

     同樣的範例,這次使用“ruser”用戶名開啟代理認證,如果代理需要認證的話:

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

SEE ALSO
     cat(1), ssh(1)

AUTHORS
     Original implementation by *Hobbit* [email protected]?.
     Rewritten with IPv6 support by Eric Jackson <[email protected]>.
     Modified for Debian port by Aron Xu [email protected]?.

CAVEATS
     UDP port scans using the -uz combination of flags will always report success irrespective of the target machine‘s state.  
     However, in conjunction with a traffic sniffer either on
     the target machine or an intermediary device, the -uz combination could be useful for communications diagnostics.
     Note that the amount of UDP traffic generated may be limited
     either due to hardware resources and/or configuration settings.

再來一個進階點的實用小例子

nc -l 1234 |tar -xvf - #目標機上執行
tar -cvf - 目錄 |nc 目標機IP 1234 #在被遷移機上執行 
#能實現塊級別的壓縮遷移 。速度是最快的。遇到大量零碎小文件要同步的時候很有用。

linux nc 詳解