好玩的小命令——nc(man手册翻译)

今天有人说起这个命令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 #在被迁移机上执行 
#能实现块级别的压缩迁移 。速度是最快的。遇到大量零碎小文件要同步的时候颇有用。
相关文章
相关标签/搜索