Linux网络命令必知必会之瑞士军刀 nc(netcat)

本文首发于个人公众号 Linux云计算网络(id: cloud_dev),专一于干货分享,号内有 10T 书籍和视频资源,后台回复 「1024」便可领取,欢迎你们关注,二维码文末能够扫。

nc,全名叫 netcat,它能够用来完成不少的网络功能,譬如端口扫描、创建TCP/UDP链接,数据传输、网络调试等等,所以,它也常被称为网络工具的 瑞士军刀编程

使用方式

咱们能够这样来使用它:ubuntu

nc [-46DdhklnrStUuvzC] [-i interval] [-p source_port] [-s source_ip_address] [-T ToS] [-w timeout] [-X proxy_protocol] [-x proxy_address[:port]] [hostname] [port[s]]

经常使用选项:vim

  • -4:只使用 IPv4 地址
  • -6:只使用 IPv6 地址
  • -l:启动本地监听
  • -n:不使用 DNS 解析
  • -p:指定源端口
  • -s:指定源 IP 地址
  • -u:使用 UDP,默认是 TCP
  • -v:显示详细信息
  • -w:设定超时时间(只适合用在 Client 端)
  • -d:禁止从标准输入读取数据,也就是客户端输入数据不会发送到服务端
  • -k:让服务端保持链接,不断开

Linux 系统默认没有安装 nc,能够用下面的方法安装:centos

# centos
yum install nc
# ubuntu
apt-get install netcat

创建 C/S 聊天室

nc 的本质是在两台机器之间创建链接,以后就能够基于这个链接作不少事情,数据传输是其中一个最为基本的。咱们下面就使用 nc 来创建一个 C/S 的聊天室。服务器

模拟 Server 端:网络

# -v :输出详细信息
# -l :指定监听地址和端口
nc -v -l 127.0.0.1 6000

模拟 Client 端:ssh

# -p : 指定源端口
nc -v -p 5000 localhost 6000

以后,Client 和 Server 端就能够相互聊天了。tcp

Client:工具

# nc -v -p 5000 localhost 6000
nc: connect to localhost port 6000 (tcp) failed: Connection refused
Connection to localhost 6000 port [tcp/x11] succeeded!
Hi, server
Hi, client

Server:云计算

# nc -v -l 127.0.0.1 6000
Listening on [127.0.0.1] (family 0, port 6000)
Connection from [127.0.0.1] port 6000 [tcp/x11] accepted (family 2, sport 5000)
Hi, server
Hi, client

发送文件

nc 不只能够发送消息,还可发送文件。

假设服务端有一个 out.txt 的空文件,而客户端有一个 in.txt 文件,含有数据:hello server

Server 端接收文件:

nc localhost 6000 > out.txt

Client 端发送文件:

nc localhost 6000 < in.txt

以后,咱们能够看到 Server 端的 out.txt 文件中已经有数据了:

# cat out.txt
hello server

除了能够发送文件,nc 也能够发送目录,只须要将目录压缩发送便可。

支持 UDP 和 IPv6 链接

nc 默认使用 TCP 和 IPv4 协议创建链接,咱们可使用参数 -u-6 参数来分别使用创建 UDP 和 IPv6 链接。

Server 端:

nc -u -6 -l localhost 6000

Client 端:

nc -u -6 localhost 6000

再开另外一个终端,用 lsof 验证:

# lsof -Pni | grep nc
nc       1966            root    3u  IPv6  19317      0t0  UDP *:6000
nc       1976            root    3u  IPv6  19330      0t0  UDP [::1]:49900->[::1]:6000

能够看到,Client 端和 Server 端都显示使用了 UDP 和 IPv6 协议。

端口扫描

端口扫描是一个很是重要的功能,不少时候系统管理员会经过扫描服务器上端口,来识别系统中漏洞,nc 工具提供了很是方便的操做:

nc -vz 192.168.0.117 1-100

这条命令扫描 192.168.1.3 上 1-100 端口区间,有哪些端口是开放的。

# nc -vz 192.168.0.117 1-100
...
nc: connect to 192.168.0.117 port 21 (tcp) failed: Connection refused
Connection to 192.168.0.117 22 port [tcp/ssh] succeeded!
nc: connect to 192.168.0.117 port 23 (tcp) failed: Connection refused
...

能够看到,只有 22 号端口是开放的。

若是咱们想扫描多个服务器上的多个端口是否开放,能够写一个脚原本完成,好比:

首先,用一个 sip.txt 保存全部服务器的地址:

# cat sip.txt
192.168.1.2
192.168.1.3
192.168.1.4

再用一个 port.txt保存要扫描的端口号:

# cat port.txt
22 
80

而后,写一个脚本 portscan.sh 来遍历这个文件。

# vim portscan.sh
#!/bin/sh
for server in `more sip.txt`
do
for port in `more port.txt`
do
nc -zv $server $port
echo ""
done
done

给这个脚本赋予可执行权限:

chmod +x portscan.sh

运行这个脚本就能够自动扫描多个服务器的多个端口是否开放了。

# sh portscan.sh
Connection to 192.168.1.2 22 port [tcp/ssh] succeeded!
Connection to 192.168.1.2 80 port [tcp/http] succeeded!

Connection to 192.168.1.3 22 port [tcp/ssh] succeeded!
Connection to 192.168.1.3 80 port [tcp/http] succeeded!

Connection to 192.168.1.4 22 port [tcp/ssh] succeeded!
Connection to 192.168.1.4 80 port [tcp/http] succeeded!

总结

nc 经过在两台机器之间创建链接来完成不少网络功能,数据传输、网络链接、端口扫描等,也有助于咱们进行网络调试,排查网络故障。


后台回复“加群”,带你进入高手如云交流群

个人公众号 「Linux云计算网络」(id: cloud_dev) ,号内有 10T 书籍和视频资源,后台回复 「1024」 便可领取,分享的内容包括但不限于 Linux、网络、云计算虚拟化、容器Docker、OpenStack、Kubernetes、工具、SDN、OVS、DPDK、Go、Python、C/C++编程技术等内容,欢迎你们关注。

相关文章
相关标签/搜索