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