今天有人說起這個命令nc
能夠用來同步文件,對零碎小文件很快,因而就關注了一下nc的man手冊,發現這玩意真是很是牛逼。本身翻譯一下nc的man手冊,先看看這個程序能完成什麼工做吧。原文來源: ubuntu 13.04中的man nc
,手冊時間:May 16, 2014web
NC(1) BSD General Commands Manual NC(1) 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:<user@host.example.com> RCPT TO:<user2@host.example.com> 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* ⟨hobbit@avian.org⟩. Rewritten with IPv6 support by Eric Jackson <ericj@monkey.org>. Modified for Debian port by Aron Xu ⟨aron@debian.org⟩. 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. BSD May 16, 2014 BSD
再來一個進階點的實用小例子shell
nc -l 1234 |tar -xvf - #目標機上執行 tar -cvf - 目錄 |nc 目標機IP 1234 #在被遷移機上執行 #能實現塊級別的壓縮遷移 。速度是最快的。遇到大量零碎小文件要同步的時候頗有用。