netcat (nc)

Table of Contents

1. nc 简介

Netcat (often abbreviated to nc) is a computer networking service for reading from and writing to network connections using TCP or UDP.

The original version of netcat was a Unix program. The last version (1.10) was released in March 1996.
There are several implementations on POSIX systems, including rewrites from scratch like GNU netcat or OpenBSD netcat.

说明: nc 的语法在不同的系统中有差异,使用前请仔细查阅当前系统 man 文档。

2. nc 基本用法

nc 的基本用法为:

nc [options] host port

默认 nc 使用 TCP 协议连接到指定的主机和端口。

2.1. 使用 UDP (-u)

如果要使用 UDP 协议,则可以指定 -u 选项。

nc -u host port

2.2. 实例:retrieve the home page of a web site

如何得到网站的主页?

$ nc host.example.com 80
GET / HTTP/1.0


说明:按照 HTTP 协议要求,在"GET / HTTP/1.0"后面要输入两个换行。

也可以用下面的方法:

$ printf "GET / HTTP/1.0\r\n\r\n" | nc host.example.com 80

2.3. 测试端口是否打开 (-z)

可以用 -z 来测试端口是否打开(进行端口扫描)。如:

$ nc -z -v 127.0.0.1 22         # 测试端口 22 是否打开
Connection to 127.0.0.1 port 22 [tcp/ssh] succeeded!
$ echo $?                       # 如果测试成功(端口打开),则返回 0
0
$ nc -z -v 127.0.0.1 1-1000     # 批量测试端口 1 到 1000 是否打开
localhost [127.0.0.1] 631 (ipp) open
localhost [127.0.0.1] 111 (sunrpc) open
localhost [127.0.0.1] 25 (smtp) open
localhost [127.0.0.1] 22 (ssh) open
$ echo $?                       # 批量测试时,只要有一个测试成功(端口打开),就会返回 0
0

说明 1:其中 -v 表示 verbose 模式。
说明 2: 对 UDP 的端口扫描总会显示成功,所以 -z -u 一起使用没有用处。

通过 -G (连接前的超时)和 -w (连接后的超时)选项可以设置超时时间,如:

$ nc -G 3 -w 3 -z -v 74.125.200.139 443
nc: connectx to 74.125.200.139 port 443 (tcp) failed: Operation timed out

2.4. Listen for connection (-l)

-l 可以使 nc 监听在某个端口,等待连接。

在终端 1 中,使 nc 监听在 4444 端口,等待连接。

$ nc -l 4444

打开另一个终端 2,连接到端口 4444。

$ nc localhost 4444

这时,两个终端可以相互通信了,输入文本后按回车即可把消息发送到对方。

2.4.1. 实例:在两台电脑间传送文件

要把电脑 A 中的文件 backup.iso 传送到电脑 B 中。
可以在电脑 A 中运行下面命令:

$ cat backup.iso | nc -l 4444

在电脑 B 中运行下面命令即可得到电脑 A(假设其 IP 为 192.168.0.2)中的文件 backup.iso:

$ nc 192.168.0.2 4444 > backup.iso

2.5. 模拟 http server

下面使用 nc 来模拟一个 http 服务器。不管收到什么请求,服务器都返回下面内容:

HTTP/1.1 200 OK
Server: nc
Connection: close

ok

把上面内容保存为文件 1.txt,其换行符要求为 CRLF(可以使用 unix2dos 进行转换)。

在一个终端执行下面命令即可启动 http 服务器:

$ nc -q 1 -l 8000 <1.txt

上面服务器在接收到请求后会退出,使用下面命令可以让其退出后又启动:

$ while true; do nc -q 1 -l 8000 <1.txt; done

在另一个终端中执行下面命令模拟客户端:

$ curl localhost:8000
ok

Author: cig01

Created: <2011-04-03 Sun>

Last updated: <2019-11-20 Wed>

Creator: Emacs 27.1 (Org mode 9.4)