page contents

每天一个Linux 命令—— nc 命令

那么 receiver 将无法收到数据,具体原因还未找到,有知道的网友也麻烦留言告知,万分感谢。

attachments-2020-12-1LJlpbD15fe0359c21a06.png

1.命令简介

nc(netcat)是一个短小精悍、功能实用、简单可靠的网络工具,主要有如下作用:
(1)端口侦听,nc 可以作为 server 以 TCP 或 UDP 方式侦听指定端口;
(2)端口扫描,nc 可以作为 client 发起 TCP 或 UDP 请求;
(3)机器之间传输文件;
(4)机器之间网络测速。

nc 实际上是 ncat 的软链接。ncat 是为 Nmap 项目编写的,是 Nmap 套件中的一员,它旨在成为可靠的后端工具,可立即为其他应用程序和用户提供网络连接。ncat 不仅可以使用 IPv4 和 IPv6,还可以为用户提供几乎无限的潜在用途。

Nmap 是


2.命令格式

`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]]` 


3.选项说明

`-4/6
    强制只使用 IPv4/IPv6 地址
-D
    在套接字上启用调试
-d
    不从 stdin 读取
-h
    打印出帮助信息
-k
    强制 nc 在当前连接完成后继续侦听另一个连接。注意如果不使用 -l 选项,则使用此选项是错误的
-l
    指定 nc 应该侦听传入的连接,而不是启动到远程主机的连接。将此选项与 -p、-s  -z 选项结合使用是错误的。此外,使用 -w 选项指定的超时将被忽略
-n
    不要在任何指定的地址、主机名或端口上执行任何 DNS 或服务查找
-r
    随机选择源端口和目标端口,而不是按照系统分配的顺序或范围内的顺序选择它们
-S
    启用 RFC 2385 TCP MD5 签名选项
-t
    使 nc 发送 RFC 854 DON'T  WON'T 响应 RFC 854  DO  WILL 请求。这使得使用 nc 编写 telnet 会话脚本成为可能
-U
    指定使用 Unix 域套接字
-u
    使用 UDP 代替默认选项 TCP
-v
    显示命令执行过程
-z
    表示 zero,只扫描侦听守护进程,而不向它们发送任何数据。此选项与 -l 选项结合使用是错误的
-C
    发送 CRLF 作为换行符
-i interval
    指定发送和接收的文本之间的延迟时间间隔。还可指定连接到多个端口之间的延迟时间
-p source_port
    指定 nc 应使用的源端口,但须受特权限制和可用性限制。将此选项与 -l 选项结合使用是错误的
-s source_ip_address
    设置本地主机送出数据包的 IP 地址。注意将此选项与 -l 选项结合使用是错误的
-T ToS
    指定连接的 IP 服务类型(TOS)。有效值是标记 ''lowdelay'', ''throughput'', ''reliability'',或以 0x 开头的 8 位十六进制值
-w timeout
    如果连接和 stdin 空闲超过指定秒数,则连接将被关闭。-w 标志对 -l 选项没有影响。缺省不超时
-X proxy_protocol
    请求 nc 在与代理服务器对话时使用指定的协议。支持的协议是 “4”(SOCKsv.4)、“5”(SOCKV.5)  “connect”(HTTPS proxy)。如果未指定协议,则使用 SOCKS v.5
-x proxy_address[:port]
    使用指定代理服务器地址和端口连接到主机。如果未指定端口,则使用代理协议的已知端口(SOCKS为1080,HTTPS为3128)` 

nc 的控制参数不少,常用的几个参数如下所列:

`-l
    指定 nc 将处于侦听模式。指定该参数,则意味着 nc 被当作 server,侦听并接受连接,而非向其它地址发起连接
-p PORT
    指定 nc 使用的源端口
-s 
    指定发送数据的源 IP 地址,适用于多网卡机器
-u
    指定 nc 使用 UDP 协议,默认为 TCP
-v
    输出交互或出错信息,新手调试时尤为有用
-w
    超时秒数,后面跟数字 
-z
    表示 zero,扫描时不发送任何数据` 

4.常用示例

(1)通过 ll 命令查看 nc 命令。

`lrwxrwxrwx 1 root root 4 Aug 30 22:33 /usr/bin/nc -> ncat` 

(2)监听本地端口。
假设在当前命令行终端 A 进行监听。

`nc -vl 8888
Ncat: Version 6.40 ( http://nmap.org/ncat )
Ncat: Listening on :::8888
Ncat: Listening on 0.0.0.0:8888` 

开启另外一个命令行终端 B,同样使用 nc 发起连接。

`nc -v 127.0.0.1 8888` 

另一个终端 A 将会收到请求并打印连接信息:

`Ncat: Connection from 127.0.0.1.
Ncat: Connection from 127.0.0.1:37229.` 

如果在终端 B 输入内容,那么终端 A 将收到终端 B 发送的内容并打印到标准输出。

(3)利用 nc 之间的连接进行文件传输。
使用 nc 传输文件还是比较方便的,因为不用 scp 和 rsync 那种输入密码的操作了。把 A 机器上的一个文本文件发送到 B 机器上
需注意操作次序,receiver 先侦听端口,sender 向 receiver 所在机器的该端口发送数据。

receiver:

`nc -l 8888 > received.txt` 

sender:

`nc 127.0.0.1 8888 < file.txt` 

receiver 接收完毕,会自动退出监听。接收文件与原文件 md5 值相同,表示文件接收成功。

`md5sum file.txt
8f6aab448ec32637b84c3484a1a44e0b  file.txt

md5sum received.txt
8f6aab448ec32637b84c3484a1a44e0b  received.txt` 

(4)利用 nc 传输目录。
发送目录与发送文件类似,只不过是利用 tar 先将目录打包成一个文件,然后发送。接收方再利用 tar 进行解压缩还原为目录。

receiver:

`nc -l 8888 | tar -xzvf -` 

sender:

`tar -czvf - DIR_NAME | nc 127.0.0.1 8888` 

注意,tar -f 选项后跟横杠 - 表示从标准输入读取或将结果输出到标准输出。

(5)测试网速。
测试网速其实利用了传输文件的原理,就是把来自一台机器的 /dev/zero 发送给另一台机器的 /dev/null
就是把一台机器的无限个 0,传输给另一个机器的空设备上,然后新开一个窗口使用 dstat 命令监测网速
在这之前需要保证机器先安装 dstat 工具。

`yum install -y dstat` 

第 1 步,在 A 机器先启动接收数据的命令,监听自己的 8888 端口,把来自这个端口的数据都输出给空设备(这样不写磁盘,测试网速更准确)。

`nc -l 8888 > /dev/null` 

第 2 步,在 B 机器发送数据,把无限个 0 发送给 A 机器的 8888 端口。

`nc 10.0.1.161 8888 < /dev/zero` 

在 A 机器新的窗口上使用 dstat 命令查看当前网速。dstat 命令比较直观,它可以查看当前 CPU,磁盘,网络,内存页和系统的一些当前状态指标。我们只需要关注 recv 和 send 两列,分别表示接收和发送的数据,另外注意数字后面的单位 B,KB,MB。

attachments-2020-12-xMtaIFOC5fe0389996135.png

5.FAQ

使用 nc 测试网速时,如果是在同一台机器发送数据,即:

`nc 127.0.0.1 8888 < /dev/zero` 

*   1

那么 receiver 将无法收到数据,具体原因还未找到,有知道的网友也麻烦留言告知,万分感谢。


attachments-2020-12-H4NYGius5fe038aa28c68.jpg来源:https://dablelv.blog.csdn.net/article/details/105104410

  • 发表于 2020-12-21 11:09
  • 阅读 ( 684 )
  • 分类:操作系统

你可能感兴趣的文章

相关问题

0 条评论

请先 登录 后评论
Pack
Pack

1135 篇文章

作家榜 »

  1. 轩辕小不懂 2403 文章
  2. 小柒 1478 文章
  3. Pack 1135 文章
  4. Nen 576 文章
  5. 王昭君 209 文章
  6. 文双 71 文章
  7. 小威 64 文章
  8. Cara 36 文章