手册页部分 1: 用户命令

退出打印视图

更新时间: 2014 年 7 月
 
 

netcat(1)

名称

nc, netcat - 任意 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] [-S sla-prop] 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] [-S sla-prop] [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]
   [-S sla-prop] -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 运行(使用相同选项)。

选项

支持以下选项:

–4

强制 nc 仅使用 IPv4 地址。

–6

强制 nc 仅使用 IPv6 地址。

–b bufsize

为读取操作指定缓冲区大小。

缺省值为 1024 字节。

–D

启用对套接字的调试。

–d

不尝试从 stdin 进行读取。

–E

使用独占绑定来侦听 TCP 或 UDP 套接字。

在没有 –l 选项的情况下单独使用此选项是错误的。

此选项与 –U 选项结合使用时,不会产生任何影响。

–e program

接受连接或建立连接之后执行外部程序。在执行之前,stdin,stdout,stderr 会重定向到网络描述符。仅有一个端口可供该选项使用。

此选项与 –R–k–i 选项结合使用是错误的。

–F

stdin 上看到 EOF 后,不要关闭网络套接字以进行写入。

–h

输出 nc 帮助。

–I bufsize

设置接收(输入)套接字缓冲区大小。

此选项与 –U 选项结合使用时,不会产生任何影响。

–i interval

指定发送和接收的文本行之间的延迟时间 interval

以秒为单位指定时间间隔,可能包含小数。

此选项还会导致与多个端口的连接之间产生延迟时间,因而也会影响端口扫描模式。

–k

强制 nc 在其当前连接关闭后侦听另一连接。

在没有 –l 选项的情况下单独使用此选项是错误的。

此选项与 –e 选项结合使用是错误的。

–L timeout

在关闭时逗留 (Linger on close)-在网络描述符关闭后直到指定的超时时间(以秒为单位),等待消息发送。

–l

侦听传入连接,而不是启动到远程主机的连接。

此选项与 –s–z 选项结合使用是错误的。

如果 –l 选项与通配符套接字(未指定任何 IP 地址或主机名)一起使用但不与 –4 /–6 选项一起使用,则既可接受 IPv4 连接也可接受 IPv6 连接。

–m byte_count

接收至少 byte_count 字节后退出。当与 –l 选项结合使用时,byte_count 会与从客户机接收的字节数进行比较。

byte_count 必须大于 0,而小于 INT_MAX

–N file

在 UDP 端口扫描模式下指定文件。此文件的内容用作每个发出的 UDP 包的有效载荷。

在没有 –u–z 选项的情况下单独使用此选项是错误的。

–n

不对任何地址、主机名或端口执行任何命名或服务查找操作。

使用此选项意味着 hostnameport 参数被限制为数字值。

除了对参数施加限制外,与 –v 选项一起使用时,所有地址和端口都将以数字形式输出。此选项与 –U 选项结合使用时,不会产生任何影响。

–O bufsize

设置发送(输出)套接字缓冲区大小。

此选项与 –U 选项结合使用时,不会产生任何影响。

–P proxy_username

指定提供给要求验证的代理服务器的一个用户名 (proxy_username)。如果未指定 proxy_username,则不会尝试进行验证。目前仅 HTTP CONNECT 代理支持代理验证。

此选项与 –l 选项结合使用是错误的。

–p port

未与 –l 选项结合使用时,根据特权限制和可用性指定 nc 应使用的源端口。与 –l 选项结合使用时,设置侦听端口。

仅当未指定全局端口参数时,此选项可与 –l 选项结合使用。

–q timeout

stdin 上接收到 EOF 后,等待指定的秒数,然后退出。

–R addr/port[/proto]

对指定的 hostport 执行端口重定向。

接受连接后,nc 会连接到远程 host/port,并在客户机与远程主机之间传递所有数据。重定向规范的 proto(协议)部分可以是 tcpudp。如果未指定 protoredirector 将使用与服务器相同的协议。

此选项与 –z 选项结合使用是错误的。

–r

在由 port_list 参数指定的所有端口中随机(而非按顺序)选择目标端口。

此选项与 –l 选项结合使用是错误的。

–s source_ip_address

指定用于发送数据包的接口的 IP。

此选项与 –l 选项结合使用是错误的。

–S sla-prop

指定为套接字创建的 MAC 流的属性。sla-prop 以属性的 'name=value' 逗号分隔列表的形式提供。

当前支持的属性名称为 maxbwpriorityinherit

maxbwpriority 来自 flowadm(1M) 中定义的属性,表示流的最大带宽和优先级。maxbw 的允许值为整数加上可选的后缀(缺省为 Mega)。priority 的值可以为 'high'、'medium' 和 'low'。

在创建流时,必须至少指定 maxbwpriority 之一。

inherit 的值可以为 'on' 和 'off',缺省值为 'off'。缺省情况下,接受的/新的套接字(由 accept(3C) 返回)不会继承侦听器套接字的属性。当将其设置为 'on' 时,新的套接字将继承侦听器套接字的属性。当需要对新套接字实施属性时,这对于 –l 选项很有用。

此选项需要 SYS_FLOW_CONFIG 特权。此选项还要求指定 IP 地址或主机名。

–T dscp

为连接指定区分服务代码点。

对于 IPv4,此选项指定 IP 服务类型 (Type of Service, ToS) IP 标题字段,参数的有效值为字符串标记 lowdelaythroughputreliability 或前面带有 0x 的 8 位十六进制值。

对于 IPv6(通信流量类),只能使用十六进制值。

–t

使 ncRFC 854 DON'TWON'T 响应发送到 RFC 854 DOWILL 请求。这样就可以使用 nc 编写 telnet 会话脚本。

–U

指定使用 Unix 域套接字。如果不与 –lnc 一起指定此选项,则它将变成 AF_UNIX 客户机。如果与 –l 选项一起指定此选项,则会创建 AF_UNIX 服务器。

使用此选项要求必须向 nc 提供单个有效的 Unix 域路径参数,而不是提供主机名或端口。

–u

使用 UDP,而不是缺省选项 TCP。

–v

指定详细输出。

–w timeout

如果连接和 stdin 空闲超过了 timeout 秒,则无提示地关闭连接。

缺省设置是没有超时。

此选项对客户机模式下的连接建立阶段或服务器模式下的等待连接过程没有任何影响。

–X proxy_protocol

与代理服务器通信时,使用该指定协议。受支持的协议为 4 (SOCKS v.4)、5 (SOCKS v.5) 和 connectHTTP 代理)。如果未指定协议,则使用 SOCKS v. 5

此选项与 –l 选项结合使用是错误的。

–x proxy_address[:port]

使用 proxy_addressport 上的代理请求到 hostname 的连接。如果未指定 port,则使用代理协议的已知端口(SOCKS1080HTTP3128)。

此选项与 –l 选项结合使用是错误的。

此选项不适用于 IPv6 地址的数字表示形式。

–Z

在侦听模式下,使用 SO_ALLZONES 套接字选项绑定到所有区域中的地址/端口。

此选项需要 SYS_NET_CONFIG 特权。

–z

执行端口扫描。对于 TCP 端口(缺省),尝试在不发送数据的情况下执行连接扫描(完整三路信号握手)。对于 UDP (–u),缺省情况下会发送空 UDP 包。要指定 UDP 有效载荷,可以使用 –N 选项。

UDP 扫描模式具有估计能力,如果它没有接收到否定响应("ICMP Destination Port Unreachable"(无法访问 ICMP 目标端口)消息),它会考虑打开一个端口。对于这种模式,使用 –w 选项设置的超时时间将用来等待来自远程节点的 ICMP 消息或数据。通过 –v,接收到的任何数据都会作为十六进制字节转储到 stderr

由于大多数操作系统会限制发送 ICMP 消息(以响应输入包)的速率,所以有必要在执行 UDP 扫描时使用 –i,否则结果会不可靠。

此选项与 –l 选项结合使用是错误的。

操作数

支持下列操作数:

hostname

指定主机名。

hostname 可以是数字 IP 地址或者符号主机名(除非已指定 –n 选项)。

通常,除非已指定 –l 选项或者使用了 –U(在此情况下,参数是一个路径),否则必须指定 hostname。如果随 –l 选项指定了 hostname 参数,则还必须给定 port 参数,并且 nc 会尝试绑定到该地址和端口。如果没有随 –l 选项指定 hostname 参数,则 nc 会尝试在给定 port 的通配符套接字上侦听。

path

指定路径名。

port
port_list

指定端口。

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 功能

可能的用途之一是使用 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 的端口 7777 的 TCP 连接,对套接字设置最大 50Mbps 的带宽:

    
$ nc -M maxbw=50M host.example.com 7777
    
  

打开到 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

在关联端口 2222 上创建 TCP 套接字并进行侦听,并在侦听器和连接的套接字上创建高优先级的 MAC 流:

    
$ nc -l -M priority=high,inherit=on host.example.com 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 的端口 42ssh(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 脚本,例如,编写一个只允许在 4264 之间的端口(不含两者)上绑定的脚本:


/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)

属性类型
属性值
可用性
network/netcat
接口稳定性
请参见下文。

数据包名称是 "Committed"(已确定)。–4–6–l–n–p–u–w 选项及其参数(如果有),命令行语法是 "Committed"(已确定)。nameport 列表参数是 "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 选项。