🍁博主简介:
🏅云计算领域优质创作者
🏅2022年CSDN新星计划python赛道第一名 🏅2022年CSDN原力计划优质作者
🏅阿里云ACE认证高级工程师
🏅阿里云开发者社区专家博主💊交流社区:CSDN云计算交流社区欢迎您的加入!
nc是一个简单、可靠的网络工具,被广泛应用于实现TCP/UDP端口的侦听、端口扫描、机器之间传输文件等多种网络任务。
nc全称netcat,又叫做瑞士军刀,是一款简单、可靠的网络工具
1、nc命令的作用
- 实现任意TCP/UDP端口的侦听,nc可以作为server以TCP或UDP方式侦听指定端口
- 端口扫描,nc可以作为client发起TCP或UDP连接
- 机器之间传输文件
- 机器之间网络测速
2、安装nc命令
CentOS/RHEL/Fedora:
yum install -y nc
nc --version
Ncat: Version 7.50 ( https://nmap.org/ncat )
或者
dnf install nc
Debian/Ubuntu:
apt-get install netcat
3、基本用法
nc命令的基本语法格式如下:
nc [options] hostname port
[options]
代表命令的选项
hostname
是目标主机的域名或IP地址
port
是目标端口号。
4、常用参数选项
- -h:帮助
- -4:仅使用 IPv4
- -6:仅使用 IPv6
- -v:显示详细信息,包括连接和数据传输的详细信息。
- -z:指定在连接成功后关闭连接,而不是等待输入。
- -n:指定不使用DNS解析主机名。
- -w:指定连接超时时间(以秒为单位)。
- -l:指定 nc 作为服务器监听连接。
- -p:指定本地端口号。
- -s:指定本地源地址。
- -k:指定服务器在接受一个连接后保持监听状态,以便接受多个连接。
- -u:指定使用UDP协议。
- -e, --exec:执行给定的命令。
- -c, --sh-exec:通过 /bin/sh 执行给定的命令。可使用管道符之类的符号
- -z:指定在连接成功后关闭连接,而不是等待输入。
- -b:指定在连接成功后将标准输入和标准输出重定向到后台。
- -t:允许nc与telnet兼容,例如处理特殊转义序列。
- -r:指定在连接成功后随机选择本地端口号。
- –version:显示 Ncat 的版本信息并退出
5、常见用法示例
-
测试远程主机指定TCP/UDP端口是否开放
- TCP端口测试:
nc -zv 8.8.8.8 53
- UDP端口测试:`
nc -uzv 8.8.8.8 53
-
打开一个TCP连接
- 连接到远程主机的指定端口:
nc example.com 80
- 本地监听指定端口:
nc -l -p 8080
-
文件传输
- 从本地主机向远程主机发送文件:
nc host port < file
- 从远程主机向本地主机接收文件:
nc -l -p port > file
-
端口扫描
- 扫描指定范围的端口:
nc -zv 192.168.1.1 20-1024
-
端口转发
- 将本地端口的请求转发到远程端口:
nc -l -p local_port -c 'nc remote_host remote_port'
6、注意事项
- nc命令在不同的Linux发行版中可能有所不同,某些版本可能已经被ncat(netcat的增强版,来自nmap项目)所取代。
- 在使用nc命令时,建议查看其帮助文档(
nc -h
)以了解所有可用的选项和用法。 - 对于需要更高级功能的场景,如SSL/TLS加密、通过HTTP代理进行转发等,可以考虑使用ncat命令。
nc命令是一个功能强大的网络工具,通过合理使用其选项和参数,可以完成多种网络任务。
7、实战演练
7.1 网络连通性测试和端口扫描
测试主机的TCP端口
服务器1监听在tcp的60000端口
$ nc -lp 60000
# 或者省略-p
$ nc -l 60000
查看端口
$ netstat -ntlpu | grep 60000
tcp 0 0 0.0.0.0:60000 0.0.0.0:* LISTEN 2553/nc
tcp6 0 0 :::60000 :::* LISTEN 2553/nc
服务器2上测试
$ nc -zv 10.0.0.11 60000
Ncat: Version 7.50 ( https://nmap.org/ncat )
Ncat: Connected to 10.0.0.11:60000.
Ncat: 0 bytes sent, 0 bytes received in 0.00 seconds.
测试主机的UDP端口
服务器1监听在udp的60000端口
$ nc -lup 60000
# 或者省略-p
$ nc -lu 60000
查看端口
$ netstat -ntlpu | grep 60000
udp 0 0 0.0.0.0:60000 0.0.0.0:* 2633/nc
udp6 0 0 :::60000 :::* 2633/nc
服务器2上测试
$ nc -vzu 10.0.0.11 60000
Ncat: Version 7.50 ( https://nmap.org/ncat )
Ncat: Connected to 10.0.0.11:60000.
Ncat: UDP packet sent successfully
Ncat: 1 bytes sent, 0 bytes received in 2.00 seconds.
补充
加上 -w
可以设置超时时长
nc -vzw 2 10.0.0.11 60000
设置超时时长2s
脚本中使用
端口正常的话,查询 $?
,就是0
$ nc -z 10.0.0.11 22
$ echo $?
0
如果不正常,就不为0
$ nc -z 10.0.0.11 221
$ echo $?
1
当为ip的时候,加上-n选项会更高效
- 提高效率,避免的不必要的dns查询
- 脚本自动化,避免因为dns问题导致整个任务失败
- 安全稳定,避免dns欺骗或者缓存的问题
nc -vzn 10.0.0.11 60000
7.2 文件和目录的传输
传输文件
服务器2上待传输的文件
cat test.txt
第一行
第二行
第三行
第四行
服务器1上监听60000端口,并将传入的内容写入文件
nc -l 60000 > test.txt
服务器2上发送文件内容到服务器1的60000端口上
nc 10.0.0.11 60000 < test.txt
查看服务器1上的文件
cat test.txt
第一行
第二行
第三行
第四行
7.3 传输文件夹
利用tar来传输
经过我的测试管道后面最后必须是 -
,不能是其余自定义的文件名
启动服务器1上的接收服务
nc -l 60000 | tar xfvz -
启动服务器2上的发送命令
tar czf - ./nginx/* | nc 10.0.0.11 60000
./nginx/*
是指的相对路径,如果是 *
则表示当前文件夹的所有文件和文件夹
具体过程就是
把当前目录的所有文件打包为 -
,然后使用nc发送给服务器2
然后这边收到了之后再解包