Fork me on GitHub
0%

检测端口是否存活除了 telnet 还有 nc 命令

在之前使用 Windows 系统的时候,我感觉我使用最频繁的两个命令就是 ping 和 telnet。其中 ping 是用来检测是否与主机连通,telnet 用来检测对方主机的端口是否畅通。这两个命令通用的使用场景可能是下面这样的:

比如说用 A 代表我们本地用来开发的电脑, B 代表远程其中一台服务器,上面部署了我们的后端应用,你在 A 上去访问 B 上部署的应用相关接口,这时候出现访问不了的情况。那么我们可能需要先检查下 A 和 B 的网络是否通畅,也就是说 A 是否能正常访问 B,这时我们可能会用 ping 命令来检查,如果能 ping 通,说明 A 和 B 之间的网络是通畅的,否则需要进一步检查为什么两者网络不通了,当然也不排除服务器设置了禁 ping。

如果能 ping 通的话,接下来可能就需要检测端口是否畅通,也就是使用 telnet 命令来检测,如果端口不通,可以检查下部署的应用是否已经挂了,或者是否有防火墙配置。

但是 telnet 命令的作用是执行 telnet 指令开启终端机阶段作业,并登入远端主机。也就是说当你执行下面的命令之后,会根据指定的端口建立连接,连接成功也就成功了,它不会自己断开。

1
telnet server.rookiedev.top 80

后来我在使用 Ubuntu 系统的时候呢,这个命令让我有点苦恼,每次执行这个命令之后都会进入交互模式占据了当前终端,由于它不会自动断开,这就需要我每次测试完了之后自己来手动断开,可是我找了许多断开退出的操作方式,比如说:ctrl + c 或者 ctrl + ] + q,但有时都无法退出来,以至于我每执行一次这个命令都需要关掉一个终端才能断开,然后再另起一个终端来继续操作。当你需要频繁测试的时候,这就太麻烦了。

再到后来使用 macOS 系统的时候,macOS 10.13.1 之后就已经没有这个命令了,需要你自己去安装,不过不知道在 Mac 上面使用这个命令的体验怎么样,至少在 Ubuntu 系统上给我的感觉不太好,当然也有可能是我使用的姿势不对。

至于为什么说不知道在 Mac 上面这个命令的体验怎样呢,因为我遇到了更好的替代命令,也就是今天要说的 Netcat(nc) 命令。如果需要检测对方主机端口是否畅通,可以使用下面命令:

1
nc -zv server.rookiedev.top 80

其中 -z 表示使用 0 输入/输出模式,只在扫描通信端口时使用,连接成功后立即断开,-v 表示显示指令执行过程。同时看下面截图,命令的打印输出结果也让我们一眼就能判断出端口是否通畅,而且命令执行完之后自动断开连接,不会进入交互模式占据终端的使用权。

nc_host_port

说实话,这个命令用来检测端口是否通畅可以说是非常方便了,不过这个命令可谓是非常强大,可以实现的功能远不止这么一点,下面就来简单介绍一下该命令。

Netcat(或nc)是一个使用 TCP 或 UDP 协议跨网络连接读取和写入数据的命令行工具,可以用来调试和监控网络连接,扫描端口的开放情况,传输数据等。同时这个命令在 macOS,Ubuntu,Debian,CentOS 上都已经预安装好了。

语法:nc [options] host port

options 有很多,列举比较常用的一些 options 含义:

  • -h 在线帮助。
  • -i<延迟秒数> 设置时间间隔,以便传送信息及扫描通信端口。
  • -l 使用监听模式,管控传入的资料。
  • -n 直接使用IP地址,而不通过域名服务器。
  • -p<通信端口> 设置本地主机使用的通信端口。
  • -u 使用 UDP 传输协议。
  • -v 显示指令执行过程。
  • -w<超时秒数> 设置等待连线的时间。
  • -z 使用 0 输入/输出模式,只在扫描通信端口时使用。

常见的使用方式有:

开放端口扫描

1
nc -zv 192.168.1.104 20-80

nc_scan_port

该命令同时还可以接管道符 | 添加过滤条件过滤出开放的端口,在扫描的端口比较多的时候就很用了:

1
nc -z -v 192.168.1.104 20-80 2>&1 | grep succeeded

nc_scan_port_grep

注意:该命令默认情况下和主机建立的是 TCP 连接,如果需要 UDP 的可以通过 -u 参数指定。

文件传输

假如说我们现在想从 A 传输文件 test.txt 到 B,A 的 IP 是 192.168.1.107,B 的 IP 是 192.168.1.104, 那么这时可以在 A 上通过 nc 命令开启监听模式,并且输入为你要传输的文件:

1
nc -l 8080 < test.txt

然后在 B 上建立与 A 的连接,并且将输出重定向到指定的文件,这样一旦连接建立成功就会收到 A 发过来的文件并且重定向到你所指定的文件:

1
nc -v 192.168.1.104 8080 > test.txt

接下来你就可以在 B 上看到传输过来的 test.txt 文件了。

聊天会话

对于聊天会话其实和文件传输差不多,这里也假设 A 发起了监听,然后 B 和 A 建立连接,当连接建立成功之后就可以发起聊天了。在 A 上执行:

1
nc -l 8080

在 B 上执行:

1
nc 192.168.1.104 8080

接下来在 A 上输入的内容将会被传输到 B 上,同时 B 上传输的内容会被传输到 A 上,注意下面截图中 server.rookiedev.top 是我用我自己的服务器测试的,你可以用本地的两天主机进行测试,就像上面命令中指定的内网地址一样。

nc_chat_online

上面算是列举了几种关于 Netcat 命令的简单用法,至于更复杂的一些用法,感兴趣的话可以去研究看看,总之 Natcat 这个命令还是非常强大的,可以做到的事情非常多。

参考:

https://www.jianshu.com/p/32c8f9ea0ed9

https://linuxize.com/post/netcat-nc-command-with-examples/

 wechat
扫描上面图中二维码关注微信公众号