今天有人提及这个命令nc
可以用来同步文件,对零碎小文件很快,于是就关注了一下nc的man手册,发现这玩意真是非常牛逼。自己翻译一下nc的man手册,先看看这个程序能完成什么工作吧。原文来源: ubuntu 13.04中的man nc
,手册时间:May 16, 2014
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:<[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.
BSD May 16, 2014 BSD
再来一个进阶点的实用小例子
nc -l 1234 |tar -xvf - #目标机上执行
tar -cvf - 目录 |nc 目标机IP 1234 #在被迁移机上执行
#能实现块级别的压缩迁移 。速度是最快的。遇到大量零碎小文件要同步的时候很有用。