点击上方“C语言与CPP编程”,选择“关注/置顶/星标公众号”
干货福利,第一时间送达!
最近有小伙伴说没有收到当天的文章推送,这是因为微信改了推送机制,有一部分小伙伴刷不到当天的文章,一些比较实用的知识和信息,错过了就是错过了,建议大家加个星标⭐️,就能第一时间收到推送。
在 debian/ubuntu 下面:
readlink -f $(which nc)
看看,结果会有两种:
/bin/nc.traditional
: 默认 GNU 基础版本,一般系统自带。
/bin/nc.openbsd
: openbsd 版本,强大很多。
apt-get install nc-traditional
或者 apt-get install nc-openbsd
来选择安装。不管是 GNU 版本还是 OpenBSD 版本,都有新老的区别,主要是传送文件时 stdin 发生 EOF 了,老版本会自动断开,而新的 gnu/openbsd 还会一直连着,两年前 debian jessie 时统一升过级,导致网上的所有教程几乎同时失效。下面主要以最新的 GNU 版本为主同时对照更强大的 openbsd 版本进行说明。
telnet 192.168.1.2 8080
nc -vz 192.168.1.2 8080
nc -v -v -w3 -z 192.168.1.2 8080-8083
两次 -v
是让它报告更详细的内容,-w3
是设置扫描超时时间为 3 秒。
nc -l -p 8080
这样就监听了 8080 端口,然后在 B 主机上连接过去:
nc 192.168.1.2 8080
-l
以后可以省略 -p
参数,写做:nc -l 8080
,但在 GNU netcat 下面无法运行,所以既然推荐写法是加上 -p
参数,两个版本都通用。两台主机 UDP 数据发送不过去,问题在哪呢?你得先确认一下两台主机之间 UDP 可以到达,这时候没有 nginx 给你用了,怎么测试呢?用 python 写个 udp 的 echo 服务??运维不会认你写的工具的,即使连不通他也会认为你的程序有 bug,于是 netcat 又登场了,在 A 主机上:
nc -u -l -p 8080
监听 udp 的 8080 端口,然后 B 主机上连上去:
nc -u 192.168.1.2 8080
然后像前面测试 tcp 的方法进行检测,结束了 CTRL+C 退出,看看一边输入消息另外一边能否收到,收得到的话可能是你自己的服务原因,收不到的话把 nc 测试结果扔给运维/系统管理员,让他们赶快检查网关和防火墙配置,系统自带的工具测试的结果,既简单又权威。
nc -l -p 8080 > image.jpg
然后在 B 主机上:
nc 192.168.1.2 8080 < image.jpg
/bin/nc.openbsd -N 192.168.1.2 8080 < image.jpg
你机器上的 nc
命令有可能指向 /bin/nc.traditional
或者 /bin/nc.openbsd
任意一个,这里显示指明调用 openbsd 版本的 netcat。
-N
参数,就不需要再开个终端去手工检查传输是否完成,传输结束了就会自动退出。其实 GNU 版本的 netcat 也有可以加个 -q0
参数,达到和 openbsd 版本 -N
的效果:/bin/nc.traditional -q0 192.168.1.2 8080 < image.jpg
最简单的方法,GNU 版本的 netcat 加上 -v -v
参数后,结束时会统计接收和发送多少字节,那么此时 A 主机上显示运行 GNU 版本的 nc 监听端口:
/bin/nc.traditional -v -v -n -l -p 8080 > /dev/null
加 n 的意思是不要解析域名,避免解析域名浪费时间造成统计误差,然后 B 主机上:
time nc -n 192.168.1.2 8080 < /dev/zero
对于 OpenBSD 版本的 nc 我们可以用管道搭配 dd 命令进行统计,服务端运行:
nc -l -p 8080 > /dev/null
客户端运行 dd 搭配 nc:
dd if=/dev/zero bs=1MB count=100 | /bin/nc.openbsd -n -N 192.168.1.2 8080
dd if=/dev/zero bs=1MB count=100 | /bin/nc.traditional -n -q0 192.168.1.2 8080
nc -l -p 8080 | pv
然后再 B 主机运行:
nc 192.168.1.2 8080 < /dev/zero
此时 A 主机那端持续收到 B 主机发送过来的数据并通过管道投递给 pv 命令后,你就能看到实时的带宽统计了,pv 会输出一个实时状态:
353MiB 0:00:15 [22.4MiB/s] [ <=> ]
假设你用串口登录到 A 主机,上面十分原始,包管理系统都没有,sshd/telnetd 都跑不起来,这时候你想用 B 主机通过网络登录 A 主机有没有办法?
/bin/nc.traditional -l -p 8080 -e /bin/bash
按回车打开系统后门,然后再 B 主机那里照常:
nc 192.168.1.2 8080
mkfifo /tmp/f
cat /tmp/f | /bin/bash 2>&1 | /bin/nc.openbsd -l -p 8080 > /tmp/f
然后 B 主机和刚才一样:
nc 192.168.1.2 8080
即可访问,用完注意将 /tmp/f
这个 fifo 文件删除。
还有很多其他用法,比如你可以用 netcat + shell script 写一个 http 服务器,使用 fifo 搭配两层 nc 可以实现 tcp 端口转发,搭配 openssl 命令行工具和 nc 加管道可以把 ssl 的套接字解码并映射成裸的 socket 端口供没有 ssl 功能的工具访问。
当然你要说,这么多复杂的用法你记不住,大部分你都可以用专业软件来代替,那至少你可以先尝试使用 nc 来做 tcp/udp 端口测试,不要再用 telnet/chrome 来测试端口是否可用了,后者太过业余。其他功能可作为备份手段,在极端恶劣的环境下使用一下,也许能帮助到你很多;再你有心情的情况下可以研究下如何使用管道搭配其他工具进行一些高阶操作就行。
来自:知乎,作者:韦易笑
链接:https://zhuanlan.zhihu.com/p/83959309
—— EOF —— 你好,我是飞宇,本硕均于某中流985 CS就读,先后于百度搜索以及字节跳动电商等部门担任Linux C/C++后端研发工程师。
最近跟朋友一起开发了一个新的网站:编程资源网,已经收录了不少资源(附赠下载地址),如果屏幕前的靓仔/女想要学习编程找不到合适资源的话,不妨来我们的网站看看,欢迎扫码下方二维码白嫖~
同时,我也是知乎博主@韩飞宇,日常分享C/C++、计算机学习经验、工作体会,欢迎点击此处查看我以前的学习笔记&经验&分享的资源。
我组建了一些社群一起交流,群里有大牛也有小白,如果你有意可以一起进群交流。
欢迎你添加我的微信,我拉你进技术交流群。此外,我也会经常在微信上分享一些计算机学习经验以及工作体验,还有一些内推机会。
加个微信,打开另一扇窗