netcat 命令介绍及使用示例
netcat 命令介绍及使用示例
nc(netcat)是一个强大的网络工具,它可以用于读取和写入数据流,支持 TCP 和 UDP 协议。它常被用于网络调试和网络服务的创建。
一、安装方法
centos 中,执行 yum install nc procps-ng -y
二、功能介绍
1. IP 端口监控
使用nc进行端口扫描可以检查指定主机的指定端口是否开放。例如,下面的命令可以检查 192.168.1.1 的 80 端口是否开放:
nc -zv 192.168.1.1 80
这里,-z选项使nc在连接建立后立即关闭,-v选项使nc在连接建立或关闭后报告其状态。
2. 文件传输
nc也可以用于文件传输。例如,你可以在一台机器上使用nc创建一个监听端口,然后在另一台机器上通过该端口发送文件。例如,下面的命令在 192.168.1.1 的 1234 端口上创建一个监听,等待接收文件:
nc -l 1234 > received_file
然后,在另一台机器上,你可以使用下面的命令发送文件:
nc 192.168.1.1 1234 < file_to_send
3. 聊天
nc还可以用于创建一个简单的聊天服务。例如,你可以在一台机器上使用下面的命令创建一个聊天服务:
nc -l 1234
然后,在另一台机器上,你可以使用下面的命令连接到该聊天服务:
nc 192.168.1.1 1234
三、使用示例
1. 持续监控 IP 和端口是否正常
# 前台运行
watch -n 5 "(date +%Y-%m-%d:%H:%M:%S.%3N ; nc -vz 192.168.1.1 8301 2>&1; echo '') | tee -a /tmp/netcat-192.168.1.1-8301.log"
# 后台运行
nohup watch -n 5 "(date +%Y-%m-%d:%H:%M:%S.%3N ; nc -vz 192.168.1.1 8301 2>&1; echo '') | tee -a /tmp/netcat-192.168.1.1-8301.log" &
前台运行命令解析:每隔 5 秒检查一次与 192.168.1.1:8301 的连接是否通畅,并将结果连同当前时间追加到文件 /tmp/netcat-192.168.1.1-8301.log 中,同时也在屏幕上显示。
下面是对这个命令的逐一解析:
watch -n 5:watch是一个周期性执行命令的程序,-n 5表示每隔 5 秒执行一次后面的命令。date +%Y-%m-%d:%H:%M:%S.%3N:这是一个用来获取当前日期和时间的命令,格式为年-月-日:时-分-秒。毫秒。nc -vz 192.168.1.1 8301 2>&1:nc是 Netcat 的简写,一个用于检查网络连接的工具。-vz参数表示在建立连接时给出详细信息并在建立连接后立即关闭。192.168.1.1是要检查的 IP 地址,8301是要检查的端口号。2>&1是将标准错误(2)重定向到标准输出(1),也就是说错误信息和正常信息都会被输出。echo '':这是一个输出空行的命令,用于在每次执行结果之间添加空行,使得日志更易读。tee -a /tmp/netcat-192.168.1.1-8301.log:tee命令用于将数据重定向到文件,同时还能输出到终端。-a参数表示将数据追加到已有文件中,而不是覆盖。/tmp/netcat-192.168.1.1-8301.log是存放日志的文件路径。
所以,这条命令的整体功能就是每隔 5 秒检查一次 IP 地址为 192.168.1.1,端口号为 8301 的网络连接状态,并将日期、时间、连接状态以及错误信息等记录到 /tmp/netcat-192.168.1.1-8301.log 文件中。
为什么选用 netcat,而不是 ping 或 telnet ?
(1)Ping 命令实际上并不使用 TCP 或 UDP 端口。它基于 ICMP 协议工作,只能表示主机之间是否能通,即无法指定使用 TCP 或 UDP 协议,也无法指定端口。
(2)相比于 netcat,telnet 在 IP 端口监控 方面功能单一,仅能表示互通与否。netcat 除了能输出验证耗时外,还支持多种配置项,可以满足各类需求。
2. 发送多个数据包
执行如下命令:
echo -e "packet 1\npacket 2\npacket 3" | nc 192.168.1.1 1234
注意的是,这些数据包并不是独立的。它们都是在一个 TCP 连接中发送的,所以如果你想要发送独立的数据包,你可能需要开启多个 nc 进程
四、遇到问题
1. nc(netcat) 执行结果无法用 tee 或输出重定向符号保存到指定文件
(1)问题描述
centos 中 tee 无法将 nc 执行结果保存到/tmp/nc。过程及结果:
[root@host-name server]# nc -vz 192.168.1.1 8301 | tee -a /tmp/nc
Ncat: Version 7.50 ( https://nmap.org/ncat )
Ncat: Connected to 192.168.1.1:8301.
Ncat: 0 bytes sent, 0 bytes received in 0.01 seconds.
[root@host-name server]# cat /tmp/nc
使用重定向符 > 或 >> 效果一样
(2)解决方案
nc 命令添加重定向操作,将标准错误输出重定向到标准输出,如下:
[root@host-name server]# nc -vz 192.168.1.1 8301 2>&1 | tee -a /tmp/nc
Ncat: Version 7.50 ( https://nmap.org/ncat )
Ncat: Connected to 192.168.1.1:8301.
Ncat: 0 bytes sent, 0 bytes received in 0.01 seconds.
[root@host-name server]# cat /tmp/nc
Ncat: Version 7.50 ( https://nmap.org/ncat )
Ncat: Connected to 192.168.1.1:8301.
Ncat: 0 bytes sent, 0 bytes received in 0.01 seconds.
(3)命令解析
这个 shell 命令的功能是测试从当前主机到指定主机(192.168.1.1)的指定端口(8301)的网络连接,并将测试结果输出到文件(/tmp/nc)中。下面是详细的解析:
nc -vz 192.168.1.1 8301:这是使用nc(netcat)命令测试网络连接的部分。其中,-v选项表示详细模式,命令执行时会显示详细信息;-z选项表示在发送任何数据之前先扫描开放的端口;192.168.1.1和8301分别是目标主机的 IP 地址和端口号。2>&1:这个是 shell 中的重定向操作,表示将标准错误(2)的输出重定向到标准输出(1)。这样做的目的是将nc命令的所有输出(包括正常的输出和错误的输出)都能被后面的tee命令接收。| tee -a /tmp/nc:这是使用tee命令将nc命令的输出写入文件的部分。其中,|是管道符,用来将一个命令的输出作为另一个命令的输入;-a选项表示追加模式,即将输出追加到指定的文件中,而不是覆盖文件;/tmp/nc是指定的文件路径。
(4)原因分析
猜测:nc 执行结果属于标准错误输出,通过测试发现确认如此,验证过程如下:
[root@host-name server]# > /tmp/nc
[root@hostname server]# nc -vz 192.168.1.1 8301 2>> /tmp/nc
[root@hostname server]# cat /tmp/nc
Ncat: Version 7.50 ( https://nmap.org/ncat )
Ncat: Connected to 192.168.1.1:8301.
Ncat: 0 bytes sent, 0 bytes received in 0.01 seconds.
[root@host-name server]# nc -vz 192.168.1.1 8301 1>> /tmp/nc
Ncat: Version 7.50 ( https://nmap.org/ncat )
Ncat: Connected to 192.168.1.1:8301.
Ncat: 0 bytes sent, 0 bytes received in 0.01 seconds.
[root@host-name server]# cat /tmp/nc
补充说明: ubuntu 下可能要安装 netcat-traditional 版本,具体参考:How to switch to netcat-traditional in Ubuntu?
2. watch 执行命令不支持变量
(1)问题描述
执行以下命令,每次输出的时间都为固定值
watch -n 5 "echo $(date +%Y-%m-%d:%H:%M:%S.%3N)"
(2)原因分析
运行 watch 命令后解析变量值,top 中看到的实际执行的命令如下
530264 root 20 0 57620 4904 3824 S 0.0 0.0 0:00.00 watch -n 5 echo 2024-03-08:20:45:39.771
(3)解决办法
- 移除变量中的、$(),修改后为
watch -n 5 "date +%Y-%m-%d:%H:%M:%S.%3N" - 将 watch 执行命令都迁移到 sh 脚本中,watch 执行 sh 脚本
五、相关补充
1. telnet 远程登录使用简介
安装:yum install telnet-server telnet
服务端启动服务:systemctl enable telnet.socket
客户端登录:telnet 192.168.1.1 23
注意: telnet 网络上发送未加密的数据,包括密码。因此,你应该尽量避免在生产环境中使用 Telnet,而是使用更安全的协议,如 SSH。
2. 多行命令之间使用;和&的区别
; 会无论前一个命令是否成功都执行下一个命令,而 && 则只有当前一个命令成功时才会执行下一个命令。
3. nohup & 和 &的区别
它们都可以用于在后台运行进程,但是它们的工作方式和效果有所不同。
nohup命令:
nohup 是 "no hang up" 的缩写,用于在系统挂起或者用户退出系统后继续运行指定的命令。
例如,你可以这样使用 nohup 命令:
nohup command &
这条命令会把 command 运行在后台,并且即使你退出了系统,command 也会继续运行。
&命令:
& 是 Unix 或 Linux 系统中的一个 shell 操作符,用于把命令放到后台运行。
例如,你可以这样使用 & 命令:
command &
这条命令会把 command 运行在后台,但是如果你退出了系统,command 会被停止。
nohup和&的区别:
nohup命令可以保证在用户退出系统后命令继续运行。&命令只能把命令放到后台运行,如果用户退出系统,命令会被停止。
所以,如果你想在退出系统后命令能继续运行,你应该使用 nohup 命令。
netcat 命令介绍及使用示例的更多相关文章
- Linux ar命令介绍 和常用示例
制作静态库要用到ar命令,命令格式: ar [-]{dmpqrtx}[abcfilNoPsSuvV] [membername] [count] archive files... {dmpqrtx}中的 ...
- 8 个实用的 Linux netcat 命令示例
Netcat 或者叫 nc 是 Linux 下的一个用于调试和检查网络工具包.可用于创建 TCP/IP 连接,最大的用途就是用来处理 TCP/UDP 套接字. 这里我们将通过一些实例来学习 netca ...
- linux netcat 命令详解
功能说明:强大的网络工具语 法:nc [-hlnruz][-g<网关...>][-G<指向器数目>][-i<延迟秒数>][-o<输出文件>][-p< ...
- Mongodb常用命令介绍
查看命令的方式: 1.在shell中运行db.listCommands() 2.在浏览器中访问管理员接口:http://ipaddress:28017/_commands 下面介绍在Mongodb中最 ...
- netcat命令
1 简介 netcat是网络工具中的瑞士军刀,它能通过TCP和UDP在网络中读写数据.通过与其他工具结合和重定向,你可以在脚本中以多种方式使用它.使用netcat命令所能完成的事情令人惊讶. netc ...
- Linux Netcat 命令——网络工具中的瑞士军刀
原文:http://www.oschina.net/translate/linux-netcat-command netcat是网络工具中的瑞士军刀,它能通过TCP和UDP在网络中读写数据.通过与其他 ...
- linux netcat命令
netcat是网络工具中的“瑞士军刀”,它能通过TCP和UDP在网络中读写数据.通过与其他工具结合和重定向,你可以在脚本中以多种方式使用它.使用netcat命令所能完成的事情令人惊讶. netcat所 ...
- maven常用命令介绍
mvn 3.0.4 创建maven项目命令 mvn archetype:generate -DgroupId=damocles-autocredit -DartifactId=damocles ...
- 【Ansible 文档】【译文】Ad-Hoc 命令介绍
Introduction To Ad-Hoc Commands Ad-Hoc命令介绍 下面的例子展示了如何使用 /usr/bin/ansible 来运行ad hoc任务. 什么是ad hoc命令? 一 ...
- linux netcat命令使用技巧
netcat是网络工具中的瑞士军刀,它能通过TCP和UDP在网络中读写数据.通过与其他工具结合和重定向,你可以在脚本中以多种方式使用它.使用netcat命令所能完成的事情令人惊讶. netcat所做的 ...
随机推荐
- 从零开始配置vim(21)——会话管理
很多代码编辑器都有这么一个功能,重新进入编辑器之后能恢复上次打开的所有文件,窗口布局,有的甚至是上次设置的一些配置.那么vim是否也可以实现这样的功能呢?答案是肯定的.使用vim自带的会话管理和 vi ...
- C#使用Tamir.SharpSsh.jsch上传文件异常Algorithm negotiation fail
环境 服务器:centos6.5 客户端:Windows 前言 项目中有一个exe,安装在客户端,其中有一个功能是将本地产生的文件上传至服务器,这个功能是以服务的方式安装在客户端上.之前一切好使,文件 ...
- playwright 一些方法解决cloudflare防护页的问题
在尝试从一个使用Cloudflare Web应用程序防火墙(WAF)保护的网站获取数据时,我遇到了一些挑战.该网站的安全措施非常严格,以至于在正常浏览几个页面后,Cloudflare的检查页面就会出现 ...
- 【预定义】C语言预定义代码(宏、条件编译等)内容介绍【最全的保姆级别教程】
浅谈C语言预定义中的预定义符号,#define,以及符号#,##的相关运用 求个赞求个赞求个赞求个赞 谢谢 先赞后看好习惯 打字不容易,这都是很用心做的,希望得到支持你 大家的点赞和支持对于我来说是一 ...
- DBGRIDEH 底部多列 发现
1.设置底部行数 2.点击footers 单独对每一行进行设置 3.单独对这两行 进行设置 5.看下辅助 所以用的时候可以这样用:WeiTopTradeShow.FieldColumns['top_x ...
- JOISC 2019 记录
Day1 T1 Examination 三维数点板子题,直接 cdq分治+树状数组,时间复杂度 \(O(n\log^2n)\). Day1 T2 Meetings 对于一个大小为 \(n\) 的树,我 ...
- NC16742 [NOIP2002]字串变换
题目链接 题目 题目描述 已知有两个字串 A, B及一组字串变换的规则(至多6个规则): A1 -> B1 A2 -> B2 规则的含义为:在A中的子串 A1可以变换为 B1.A2可以变换 ...
- Java I/O 教程(二) 介绍OutputStream 和 InputStream
OutputStream vs InputStream 我们来看一下两者的工作图: OutputStream 输出流 Java应用程序使用输出流将数据写入到某个目的地,可以是一个文件,数组,外围设备或 ...
- MySQL Boolean类型的坑
MySQL中,Boolean只是 tinyint(1) 的别名,也就是说,MySQL中并没有真正的bool类型. 而SQLAlchemy生成SQL的时候并没有检测到 这一点,这就导致一个问题,当使用 ...
- ChainMap合并字典
在python中,我们有两个字典需要合并的时候,可以使用字典的update方法 a = {'a': 1, 'b': 2} b = {'x': 3, 'y': 4} a.update(b) print( ...