实用linux命令-nc
本文定位:速查手册。 按使用场景组织 nc 的常用调用方式,供现场对照执行,不展开底层网络原理。
版本说明
本文基于 OpenBSD nc(绝大多数 Linux 发行版默认安装)和 GNU nc(部分老系统)整理。两者参数兼容,但 OpenBSD nc 的 -v 输出更详细。macOS 自带的是 BSD 分支,与本文 Linux 命令基本一致。下文命令均以 OpenBSD nc 为准;GNU nc 若参数不同会单独注明。
# 场景一:文件传输
nc 最常见的用途——两端建立 TCP 连接直接传文件,不需要 ftp/scp/rsync。
发送文件:
nc -l 1234 < /path/to/file.tar.gz
接收文件(在另一台机器执行):
nc 192.0.2.11 1234 > file.tar.gz
易错点:发送端必须先启动监听(-l),否则接收端连接会失败。若顺序错误,接收端会立即退出并生成空文件。
发送文件夹(tar + nc 管道):
tar zcvf - /path/to/dir/ | nc -l 1234
nc 192.0.2.11 1234 | tar zxvf -
2
显示传输进度(配合 pv):
tar zcvf - /path/to/dir/ | pv | nc -l 1234
# 场景二:端口连通性测试
替代 telnet 的轻量级方案,无需安装额外工具。
测试单端口是否开放:
nc -zv 192.0.2.11 80
-z:零 I/O 模式(只探测,不发送数据)-v:显示详细输出
批量扫描端口范围:
nc -zv 192.0.2.11 20-100
指定超时避免挂起(扫描防火墙后的主机时尤其重要):
nc -zv -w 3 192.0.2.11 22
-w 3:3 秒超时
易错点:nc 的端口扫描是串行的,大范围扫描(如 1-65535)极慢。批量端口探测请用 nmap。
# 场景三:简易服务器与调试
临时模拟服务或转发数据,用于开发调试。
模拟 TCP 服务器(回显模式):
nc -l 8080
执行后 nc 在本机 8080 端口监听,任何连接过来的数据都会原样返回。
发送 HTTP 请求测试:
printf "GET / HTTP/1.1\r\nHost: example.com\r\n\r\n" | nc example.com 80
创建简易聊天通道:
机器 A 执行:
nc -l 12345
机器 B 执行:
nc 192.0.2.11 12345
连接建立后,任一方输入内容按回车,对方立即收到。
# 场景四:加密传输(配合 openssl)
nc 本身不加密,敏感数据需配合 openssl 做端到端加密。
发送端加密传输:
tar zcvf - /path/to/dir/ | openssl enc -aes-256-cbc -salt | nc -l 1234
接收端解密:
nc 192.0.2.11 1234 | openssl enc -d -aes-256-cbc -salt | tar zxvf -
执行时会提示输入密码,两端密码需一致。
# 场景五:UDP 调试
DNS、SNMP、NTP 等协议基于 UDP,nc 的 UDP 模式可用于调试。
启动 UDP 监听:
nc -u -l 53
发送 UDP 数据包:
echo "test" | nc -u 192.0.2.11 53
差异点:UDP 是无连接的,nc -u -l 不会显示连接建立信息,收到数据时直接显示内容。
易错点:UDP 不保证数据到达,也没有重传机制。测试 DNS 等协议时无响应不一定是网络问题,可能是协议格式不匹配。如需可靠传输请用 TCP 模式。
排查 DNS 示例:
# 向指定 DNS 服务器发送 UDP 探测
nc -u -v 8.8.8.8 53
2
# 场景六:代理与流量转发
nc 可作为简易代理中转流量。
TCP 端口转发(将本地 8080 转发到远程 80):
nc -l 8080 -c "nc remote.server.com 80"
使用场景:临时绕过防火墙限制,或在调试时拦截/查看流经某端口的数据。
# 常用参数速查表
| 参数 | 含义 | 典型用法 |
|---|---|---|
-l | 监听模式(服务端) | nc -l 8080 |
-p PORT | 指定本地端口 | nc -p 1234 192.0.2.11 80 |
-z | 零 I/O 模式(扫描用) | nc -zv host port |
-v | 详细输出 | nc -zv host 22 |
-w SEC | 超时秒数 | nc -w 3 host port |
-n | 不解析 DNS(纯 IP) | nc -nv 192.0.2.11 80 |
-u | UDP 模式(默认 TCP) | nc -u -l 53 |
-k | 监听持续接受(默认一次) | nc -kl 8080 |
# 坑与边界
1. 权限问题
低端口(<1024)需要 root 权限:
sudo nc -l 80
2. 连接不自动关闭
nc 传输完成后不会自动关闭连接,需要发送端按 Ctrl+C 或接收方断开。批量脚本中应配合 -w 1(发送完成后 1 秒自动关闭)。
3. 与 ncat/socat 的关系
nc:最原始的 netcat,功能简单,几乎所有系统自带ncat(nmap 套件):支持 SSL、代理、同时多连接,功能更现代socat:最强大,支持 Unix socket、文件描述符转发,但语法复杂
选型建议:临时调试用 nc,生产脚本用 ncat,复杂转发用 socat。
🤖 Agent 可直接解析的元数据块(点击展开)
{
"_meta": {
"doc_version": "2022-03-10",
"article_id": "linux-nc-cheatsheet",
"profile_context": "any",
"estimated_setup_time": "5min"
},
"quick_start": {
"send_file": "nc -l 1234 < file.tar.gz",
"receive_file": "nc 192.0.2.11 1234 > file.tar.gz",
"port_scan": "nc -zv host 80",
"port_range_scan": "nc -zv host 20-100",
"simple_server": "nc -l 8080",
"http_test": "printf 'GET / HTTP/1.1\\r\\nHost: host\\r\\n\\r\\n' | nc host 80"
},
"safety_rules": [
"nc 明文传输,敏感数据必须配合 openssl 加密",
"公网环境避免直接使用 nc 暴露端口",
"大范围端口扫描请用 nmap,nc 太慢"
],
"verification": {
"listen_success": "ss -tlnp | grep :1234",
"transfer_complete": "ls -lh file.tar.gz && md5sum file.tar.gz"
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25