跳过导航链接 | |
退出打印视图 | |
手册页第 1 部分:用户命令 Oracle Solaris 11.1 Information Library (简体中文) |
- 任意 TCP 与 UDP 连接和侦听
nc -h
nc [-46dnrtuvz] [-i interval] [-P proxy_username] [-p port] [-s source_ip_address] [-T dspc] [-w timeout] [-X proxy_protocol] [-x proxy_address[:port]][-L timeout] [-e program] [-b bufsize] [-q timeout] [-m bytes] [-I bufsize][-O bufsize] hostname port_list
nc -l [-46DdEFnrtuvzZ] [-i interval] [-T dspc] [-e program] [-b bufsize] [-q timeout] [-R address/port[/proto]] [-m bytes] [-L timeout] [-I bufsize] [-O bufsize] [hostname] port
nc -l [-46DEFdnrtuvzZ] [-i interval] [-T dspc] [-e program] [-b bufsize] [-q timeout] [-R address/port[/proto]] [-m bytes] [-L timeout] [-I bufsize] [-O bufsize] -p port [hostname]
nc -U [-Ddtvz] [-i interval] [-w timeout] [-e program] [-b bufsize] [-q timeout] [-m bytes] path
nc -Ul [-46DdktvZ] [-i interval] [-e program] [-b bufsize] [-q timeout] [-R address/port[/proto]] [-m bytes] path
nc(或 netcat)实用程序可用于与 TCP 或 UDP 相关的各种任务。nc 可以打开 TCP 连接,发送 UDP 数据包,侦听任意 TCP 和 UDP 端口,执行端口扫描,以及处理 IPv4 和 IPv6。与 telnet(1) 不同,nc 精细地编写脚本,并将错误消息分隔到标准错误中,而不是将错误消息发送到标准输出。
nc 命令通常用于以下任务:
简单 TCP 代理
基于 HTTP 客户机和服务器的 shell 脚本
网络守护进程测试
适用于 ssh(1) 的 SOCKS 或 HTTP ProxyCommand
nc 命令还可以作为 netcat 运行(使用相同选项)。
支持以下选项:
强制 nc 仅使用 IPv4 地址。
强制 nc 仅使用 IPv6 地址。
为读取操作指定缓冲区大小。
缺省值为 1024 字节。
启用对套接字的调试。
不尝试从 stdin 进行读取。
使用独占绑定来侦听 TCP 或 UDP 套接字。
在没有 -l 选项的情况下单独使用此选项是错误的。
此选项与 -U 选项结合使用时,不会产生任何影响。
接受连接或建立连接之后执行外部程序。在执行之前,stdin,stdout,stderr 会重定向到网络描述符。仅有一个端口可供该选项使用。
此选项与 -R、-k 或 -i 选项结合使用是错误的。
在 stdin 上看到 EOF 后,不要关闭网络套接字以进行写入。
输出 nc 帮助。
设置接收(输入)套接字缓冲区大小。
此选项与 -U 选项结合使用时,不会产生任何影响。
指定发送和接收的文本行之间的延迟时间 interval。
以秒为单位指定时间间隔,可能包含小数。
此选项还会导致与多个端口的连接之间产生延迟时间,因而也会影响端口扫描模式。
强制 nc 在其当前连接关闭后侦听另一连接。
在没有 -l 选项的情况下单独使用此选项是错误的。
此选项与 -e 选项结合使用是错误的。
在关闭时逗留 (Linger on close)-在网络描述符关闭后直到指定的超时时间(以秒为单位),等待消息发送。
侦听传入连接,而不是启动到远程主机的连接。
此选项与 -s 或 -z 选项结合使用是错误的。
如果 -l 选项与通配符套接字(未指定任何 IP 地址或主机名)一起使用但不与 -4 /-6 选项一起使用,则既可接受 IPv4 连接也可接受 IPv6 连接。
接收至少 byte_count 字节后退出。当与 -l 选项结合使用时,byte_count 会与从客户机接收的字节数进行比较。
byte_count 必须大于 0,而小于 INT_MAX。
在 UDP 端口扫描模式下指定文件。此文件的内容用作每个发出的 UDP 包的有效载荷。
在没有 -u 和 -z 选项的情况下单独使用此选项是错误的。
不对任何地址、主机名或端口执行任何命名或服务查找操作。
使用此选项意味着 hostname 和 port 参数被限制为数字值。
除了对参数施加限制外,与 -v 选项一起使用时,所有地址和端口都将以数字形式输出。此选项与 -U 选项结合使用时,不会产生任何影响。
设置发送(输出)套接字缓冲区大小。
此选项与 -U 选项结合使用时,不会产生任何影响。
指定提供给要求验证的代理服务器的一个用户名 (proxy_username)。如果未指定 proxy_username,则不会尝试进行验证。目前仅 HTTP CONNECT 代理支持代理验证。
此选项与 -l 选项结合使用是错误的。
未与 -l 选项结合使用时,根据特权限制和可用性指定 nc 应使用的源端口。与 -l 选项结合使用时,设置侦听端口。
仅当未指定全局端口参数时,此选项可与 -l 选项结合使用。
在 stdin 上接收到 EOF 后,等待指定的秒数,然后退出。
对指定的 host 和 port 执行端口重定向。
接受连接后,nc 会连接到远程 host/port,并在客户机与远程主机之间传递所有数据。重定向规范的 proto(协议)部分可以是 tcp 或 udp。如果未指定 proto,redirector 将使用与服务器相同的协议。
此选项与 -z 选项结合使用是错误的。
在由 port_list 参数指定的所有端口中随机(而非按顺序)选择目标端口。
此选项与 -l 选项结合使用是错误的。
指定用于发送数据包的接口的 IP。
此选项与 -l 选项结合使用是错误的。
为连接指定区分服务代码点。
对于 IPv4,此选项指定 IP 服务类型 (Type of Service, ToS) IP 标题字段,参数的有效值为字符串标记 lowdelay、throughput、reliability 或前面带有 0x 的 8 位十六进制值。
对于 IPv6(通信流量类),只能使用十六进制值。
使 nc 将 RFC 854 DON'T 和 WON'T 响应发送到 RFC 854 DO 及 WILL 请求。这样就可以使用 nc 编写 telnet 会话脚本。
指定使用 Unix 域套接字。如果不与 -l、nc 一起指定此选项,则它将变成 AF_UNIX 客户机。如果与 -l 选项一起指定此选项,则会创建 AF_UNIX 服务器。
使用此选项要求必须向 nc 提供单个有效的 Unix 域路径参数,而不是提供主机名或端口。
使用 UDP,而不是缺省选项 TCP。
指定详细输出。
如果连接和 stdin 空闲超过了 timeout 秒,则无提示地关闭连接。
缺省设置是没有超时。
此选项对客户机模式下的连接建立阶段或服务器模式下的等待连接过程没有任何影响。
与代理服务器通信时,使用该指定协议。受支持的协议为 4 (SOCKS v.4)、5 (SOCKS v.5) 和 connect(HTTP 代理)。如果未指定协议,则使用 SOCKS v. 5。
此选项与 -l 选项结合使用是错误的。
使用 proxy_address 和 port 上的代理请求到 hostname 的连接。如果未指定 port,则使用代理协议的已知端口(SOCKS 为 1080,HTTP 为 3128)。
此选项与 -l 选项结合使用是错误的。
此选项不适用于 IPv6 地址的数字表示形式。
在侦听模式下,使用 SO_ALLZONES 套接字选项绑定到所有区域中的地址/端口。
此选项需要 SYS_NET_CONFIG 特权。
执行端口扫描。对于 TCP 端口(缺省),尝试在不发送数据的情况下执行连接扫描(完整三路信号握手)。对于 UDP (-u),缺省情况下会发送空 UDP 包。要指定 UDP 有效载荷,可以使用 -N 选项。
UDP 扫描模式具有估计能力,如果它没有接收到否定响应("ICMP Destination Port Unreachable"(无法访问 ICMP 目标端口)消息),它会考虑打开一个端口。对于这种模式,使用 -w 选项设置的超时时间将用来等待来自远程节点的 ICMP 消息或数据。通过 -v,接收到的任何数据都会作为十六进制字节转储到 stderr。
由于大多数操作系统会限制发送 ICMP 消息(以响应输入包)的速率,所以有必要在执行 UDP 扫描时使用 -i,否则结果会不可靠。
此选项与 -l 选项结合使用是错误的。
支持下列操作数:
指定主机名。
hostname 可以是数字 IP 地址或者符号主机名(除非已指定 -n 选项)。
通常,除非已指定 -l 选项或者使用了 -U(在此情况下,参数是一个路径),否则必须指定 hostname。如果随 -l 选项指定了 hostname 参数,则还必须给定 port 参数,并且 nc 会尝试绑定到该地址和端口。如果没有随 -l 选项指定 hostname 参数,则 nc 会尝试在给定 port 的通配符套接字上侦听。
指定路径名。
指定端口。
port_list 可以指定为单个整数、范围或两者的组合。请以 nn-mm 形式指定范围。port_list 至少必须有一个成员,但可以有多个以逗号分隔的端口/范围。
通常,除非已指定 -U 选项(在此情况下,必须指定 Unix 域套接字路径,而不指定 hostname),否则必须指定目标端口。
将包含多个端口的端口列表与 -e 选项结合使用是错误的。
使用 nc 构建最基本的客户机/服务器模型非常简单。在一个控制台上,启动在特定端口上侦听连接的 nc。例如,命令:
$ nc -l 1234
在端口 1234 上侦听连接。在另一个控制台上(或另一台计算机上),连接到 nc 正在侦听的计算机和端口:
$ nc 127.0.0.1 1234
现在端口之间应当有一个连接。在第二个控制台上键入的任何内容都将串联到第一个控制台,反之亦然。在连接建立后,nc 不会真正关心哪一端用作服务器,哪一端用作客户机。可使用 EOF (Ctrl/d) 终止连接。
可以对上一部分中的示例进行扩展,以构建基本的数据传送模型。在连接的一端输入的任何信息都将输出到连接的另一端,并且可以轻松捕获输入和输出,以便模仿文件传送。
通过使用 nc 启动在特定端口上的侦听,并将输出捕获到一个文件中:
$ nc -l 1234 > filename.out
使用另一台计算机,连接到正在侦听的 nc 进程,向其馈送要传送的文件:
$ nc host.example.com 1234 < filename.in
完成文件传送后,连接将自动关闭。
有时,通过手工(而不是通过用户界面)与服务器进行通信非常有用。当可能需要验证服务器正在发送什么数据来响应客户机发出的命令时,它可以帮助排除故障。
例如,要检索某个 Web 站点的主页:
$ echo -n "GET / HTTP/1.0\r\n\r\n" | nc host.example.com 80
这也将显示 Web 服务器发送的标头。如果需要,可以使用 sed(1) 等工具过滤这些标头。
如果用户了解服务器要求的请求格式,可以构造更为复杂的示例。再如,可使用以下方法将电子邮件提交到 SMTP 服务器:
$ nc localhost 25 << EOF HELO host.example.com MAIL FROM: <user@host.example.com RCTP TO: <user2@host.example.com DATA Body of email. . QUIT EOF
知道目标计算机上哪些端口是打开的并正在运行服务可能非常有用。可以使用 -z 标志来指示 nc 报告打开的端口,而不是启动连接。
在此示例中:
$ nc -z 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 之间。
此外,了解正在运行的服务器软件及版本可能非常有用。该信息通常包含在问候标题内。要检索这些问候标题,首先需要建立连接,然后检索标题,之后断开连接。此操作可通过使用 -w 标志指定较小的超时,或者通过向服务器发出 QUIT 命令来实现。
$ echo "QUIT" | nc host.example.com 20-30 SSH-2.0-Sun_SSH_1.1 Protocol mismatch. 220 host.example.com IMS SMTP Receiver Version 0.84 Ready
可能的用途之一是使用 inetd(1M) 创建简单的服务。
以下示例创建了一个从主机 realwww 上的 TCP 端口 8080 到端口 80 的重定向:
# cat << EOF >> /etc/services wwwredir 8080/tcp # WWW redirect EOF # cat << EOF > /tmp/wwwredir.conf wwwredir stream tcp nowait nobody /usr/bin/nc /usr/bin/nc -w 3 realwww 80 EOF # inetconv -i /tmp/wwwredir.conf wwwredir -> /var/svc/manifest/network/wwwredir-tcp.xml Importing wwwredir-tcp.xml ...Done # inetadm -l wwwredir/tcp SCOPE NAME=VALUE name="wwwredir" endpoint_type="stream" proto="tcp" isrpc=FALSE wait=FALSE exec="/usr/bin/nc -w 3 realwww 80" arg0="/usr/bin/nc" user="nobody" default bind_addr="" default bind_fail_max=-1 default bind_fail_interval=-1 default max_con_rate=-1 default max_copies=-1 default con_rate_offline=-1 default failrate_cnt=40 default failrate_interval=60 default inherit_env=TRUE default tcp_trace=TRUE default tcp_wrappers=FALSE
要绑定到特权端口号,需要向 nc 授予 net_privaddr 特权。如果配置了 Solaris Trusted Extensions,并且 nc 应侦听的端口被配置为多级别端口,则 nc 还需要具有 net_bindmlp 特权。
通过在 user_attr(4) 中在帐户的缺省特权集中指定这些特权,可以直接将它们分配给用户或角色。但是,这意味着该用户或角色启动的所有应用程序都拥有这些附加特权。要仅在调用 nc 时授予 privileges(5),建议创建并分配一个 rbac(5) 权限配置文件。有关其他信息,请参见“示例”部分。
示例 1 使用 nc
打开到 host.example.com 的端口 42 的 TCP 连接,使用端口 3141 作为源端口,超时为 5 秒:
$ nc -p 3141 -w 5 host.example.com 42
打开到 host.example.com 的端口 53 的 UDP 连接:
$ nc -u host.example.com 53
打开到 host.example.com 的端口 42 的 TCP 连接,使用 10.1.2.3 作为连接的本地端的 IP:
$ nc -s 10.1.2.3 host.example.com 42
将一个包含端口和端口范围的列表用于针对各种端口的端口扫描:
$ nc -z host.example.com 21-25,53,80,110-120,443
在某个 Unix 域套接字上创建连接并侦听:
$ nc -lU /var/tmp/dsocket
在关联端口为 8888 的 UDP 套接字上创建连接并侦听:
$ nc -u -l -p 8888
这等效于:
$ nc -u -l 8888
在关联端口为 2222 的 TCP 套接字上创建连接并侦听,并且只绑定到地址 127.0.0.1:
$ nc -l 127.0.0.1 2222
通过将逗留 (linger) 选项和超时时间设置为 0,连接到 TCP 端口、发送一些数据然后终止与 TCP RST 段的连接(而不是传统的 TCP 关闭握手):
$ echo "foo" | nc -L 0 host.example.com 22
从本地端口 4545 对主机 host.example.com 上的端口 22 执行端口重定向:
$ nc -R host.example.com/22 -l 4545
在这之后,应该可以运行 ssh(1) 客户机并连接到 host.example.com(使用运行上述命令的 host redir.example.com):
$ ssh -oStrictHostKeyChecking=no -p 4545 redir.example.com
还可以让 nc 侦听 TCP 端口并将 TCP 数据流转换为 UDP(反之亦然):
$ nc -R host.example.com/53/udp -l 4666
使用 10.2.3.4 的端口 8080 上的 HTTP 代理连接到 host.example.com 的端口 42。ssh(1)也可使用此示例。有关更多信息,请参见 ssh_config(4) 中的 ProxyCommand 指令。
$ nc -x10.2.3.4:8080 -Xconnect host.example.com 42
还是同一示例,这一次如果代理要求验证,则使用用户名 ruser 来支持代理验证:
$ nc -x10.2.3.4:8080 -Xconnect -Pruser host.example.com 42
可以按类似如下方式有效地完成基本的 UDP 端口扫描:
$ nc -z -w 3 -u -i 0.5 host.example.com 11-100
在每 2 个端口之间,将暂停 0.5 秒(从而规避 ICMP 消息速率限制)并最多等待 3 秒以接收回复。如果没有接收到回复,端口可能会打开。
要作为具有附加特权的用户或角色(例如缺省的 root 帐户)使用最可能小的特权集运行 nc,还可以使用 ppriv(1) 来调用它。例如,将其限制为仅以绑定到某个特权端口的特权运行:
$ ppriv -e -sA=basic,!file_link_any,!proc_exec,!proc_fork,\ !proc_info,!proc_session,net_privaddr nc -l 42
要允许用户或角色仅以 net_privaddr 特权使用 nc,则需要创建一个权限配置文件。
/etc/security/exec_attr Netcat privileged:solaris:cmd:::/usr/bin/nc:privs=net_privaddr /etc/security/prof_attr Netcat privileged:::Allow nc to bind to privileged ports:help=None.html
使用 user_attr(4) 分配该权限配置文件以允许用户或角色运行 nc,从而允许其在任何端口上侦听。要允许用户或角色使用 nc 仅在特定端口上侦听,则应在权限配置文件中指定一个包装脚本:
/etc/security/exec_attr Netcat restricted:solaris:cmd:::/usr/bin/nc-restricted:privs=net_privaddr /etc/security/prof_attr Netcat restricted:::Allow nc to bind to privileged ports:help=None.html
并且编写一个用以限制许可选项的 shell 脚本,例如,编写一个只允许在 42 和 64 之间的端口(不含两者)上绑定的脚本:
/usr/bin/nc-restricted: #!/bin/sh [ $# -eq 1 ] && [ $1 -gt 42 -a $1 -lt 64 ] && /usr/bin/nc -l -p "$1"
当用户或角色通过配置文件 shell 使用该包装脚本调用 nc 时,这将授予额外的特权。请参见 pfsh(1)、pfksh(1)、pfcsh(1) 和 pfexec(1)。
直接调用 nc 时不会以附加特权运行它,在不使用 pfexec 或配置文件 shell 的情况下调用该脚本时也是如此。
有关下列属性的说明,请参见 attributes(5):
|
数据包名称是 "Committed"(已确定)。-4、-6、-l、-n、-p、-u 和 -w 选项及其参数(如果有),命令行语法是 "Committed"(已确定)。name 和 port 列表参数是 "Committed"(已确定)。端口范围语法是 "Uncommitted"(未确定)。所有其他命令行选项及其参数的接口稳定性级别是 "Uncommitted"(未确定)。
cat(1)、pfcsh(1)、pfexec(1)、pfksh(1)、pfsh(1)、ppriv(1)、sed(1)、ssh(1)、telnet(1)、inetadm(1M)、inetconv(1M)、inetd(1M)、ssh_config(4)、user_attr(4)、attributes(5)、privileges(5)、rbac(5)
nc 的原始实现的作者是 Hobbit (hobbit@avian.org)。
Eric Jackson (ericj@monkey.org) 重新编写了 nc,增加了对 IPv6 的支持。
如果 nc 的实例正在侦听通配符套接字(无论指定的地址族如何),仍可以将其他 nc 进程绑定到具体 IP 地址并接受与该地址的连接。例如,通过运行以下进程:
$ nc -4 -l 5656
可以运行另一个 nc 进程,对特定 IP 地址和同一端口进行侦听:
$ nc -4 -l 10.20.30.40 5656
后一个进程接受与地址 10.20.30.40 以及端口 5656 的 TCP 连接,而前一个进程接受与端口 5656 以及不同地址的所有 TCP 连接。
此外,还可以通过绑定到 IPv4 通配符套接字从侦听通配符套接字(不指定地址族)的进程窃取 IPv4 连接。要禁止出现这种情况以及上述行为,可以使用 -E 选项。