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 5watch 是一个周期性执行命令的程序,-n 5 表示每隔 5 秒执行一次后面的命令。

  • date +%Y-%m-%d:%H:%M:%S.%3N:这是一个用来获取当前日期和时间的命令,格式为年-月-日:时-分-秒。毫秒。

  • nc -vz 192.168.1.1 8301 2>&1nc 是 Netcat 的简写,一个用于检查网络连接的工具。-vz 参数表示在建立连接时给出详细信息并在建立连接后立即关闭。192.168.1.1 是要检查的 IP 地址,8301 是要检查的端口号。2>&1 是将标准错误(2)重定向到标准输出(1),也就是说错误信息和正常信息都会被输出。

  • echo '':这是一个输出空行的命令,用于在每次执行结果之间添加空行,使得日志更易读。

  • tee -a /tmp/netcat-192.168.1.1-8301.logtee 命令用于将数据重定向到文件,同时还能输出到终端。-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)中。下面是详细的解析:

  1. nc -vz 192.168.1.1 8301:这是使用nc(netcat)命令测试网络连接的部分。其中,-v选项表示详细模式,命令执行时会显示详细信息;-z选项表示在发送任何数据之前先扫描开放的端口;192.168.1.18301分别是目标主机的 IP 地址和端口号。

  2. 2>&1:这个是 shell 中的重定向操作,表示将标准错误(2)的输出重定向到标准输出(1)。这样做的目的是将nc命令的所有输出(包括正常的输出和错误的输出)都能被后面的tee命令接收。

  3. | 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)解决办法

  1. 移除变量中的、$(),修改后为 watch -n 5 "date +%Y-%m-%d:%H:%M:%S.%3N"
  2. 将 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 &&的区别

它们都可以用于在后台运行进程,但是它们的工作方式和效果有所不同。

  1. nohup 命令:

nohup 是 "no hang up" 的缩写,用于在系统挂起或者用户退出系统后继续运行指定的命令。

例如,你可以这样使用 nohup 命令:

nohup command &

这条命令会把 command 运行在后台,并且即使你退出了系统,command 也会继续运行。

  1. & 命令:

& 是 Unix 或 Linux 系统中的一个 shell 操作符,用于把命令放到后台运行。

例如,你可以这样使用 & 命令:

command &

这条命令会把 command 运行在后台,但是如果你退出了系统,command 会被停止。

  1. nohup& 的区别:
  • nohup 命令可以保证在用户退出系统后命令继续运行。
  • & 命令只能把命令放到后台运行,如果用户退出系统,命令会被停止。

所以,如果你想在退出系统后命令能继续运行,你应该使用 nohup 命令。

netcat 命令介绍及使用示例的更多相关文章

  1. Linux ar命令介绍 和常用示例

    制作静态库要用到ar命令,命令格式: ar [-]{dmpqrtx}[abcfilNoPsSuvV] [membername] [count] archive files... {dmpqrtx}中的 ...

  2. 8 个实用的 Linux netcat 命令示例

    Netcat 或者叫 nc 是 Linux 下的一个用于调试和检查网络工具包.可用于创建 TCP/IP 连接,最大的用途就是用来处理 TCP/UDP 套接字. 这里我们将通过一些实例来学习 netca ...

  3. linux netcat 命令详解

    功能说明:强大的网络工具语 法:nc [-hlnruz][-g<网关...>][-G<指向器数目>][-i<延迟秒数>][-o<输出文件>][-p< ...

  4. Mongodb常用命令介绍

    查看命令的方式: 1.在shell中运行db.listCommands() 2.在浏览器中访问管理员接口:http://ipaddress:28017/_commands 下面介绍在Mongodb中最 ...

  5. netcat命令

    1 简介 netcat是网络工具中的瑞士军刀,它能通过TCP和UDP在网络中读写数据.通过与其他工具结合和重定向,你可以在脚本中以多种方式使用它.使用netcat命令所能完成的事情令人惊讶. netc ...

  6. Linux Netcat 命令——网络工具中的瑞士军刀

    原文:http://www.oschina.net/translate/linux-netcat-command netcat是网络工具中的瑞士军刀,它能通过TCP和UDP在网络中读写数据.通过与其他 ...

  7. linux netcat命令

    netcat是网络工具中的“瑞士军刀”,它能通过TCP和UDP在网络中读写数据.通过与其他工具结合和重定向,你可以在脚本中以多种方式使用它.使用netcat命令所能完成的事情令人惊讶. netcat所 ...

  8. maven常用命令介绍

    mvn 3.0.4 创建maven项目命令  mvn  archetype:generate   -DgroupId=damocles-autocredit -DartifactId=damocles ...

  9. 【Ansible 文档】【译文】Ad-Hoc 命令介绍

    Introduction To Ad-Hoc Commands Ad-Hoc命令介绍 下面的例子展示了如何使用 /usr/bin/ansible 来运行ad hoc任务. 什么是ad hoc命令? 一 ...

  10. linux netcat命令使用技巧

    netcat是网络工具中的瑞士军刀,它能通过TCP和UDP在网络中读写数据.通过与其他工具结合和重定向,你可以在脚本中以多种方式使用它.使用netcat命令所能完成的事情令人惊讶. netcat所做的 ...

随机推荐

  1. Spring WebSocket实现实时通信的详细教程

    简介 WebSocket 是基于TCP/IP协议,独立于HTTP协议的通信协议.WebSocket 连接允许客户端和服务器之间的全双工通信,以便任何一方都可以通过已建立的连接将数据推送到另一方. 我们 ...

  2. MySQL【四】---案例实战{拆分多表、外键创建等}

    1.准备数据 数据准备 create database jing_dong charset = utf8mb4; 创建一个商品goods数据表: create table goods( id int ...

  3. 2.5 Windows驱动开发:DRIVER_OBJECT对象结构

    在Windows内核中,每个设备驱动程序都需要一个DRIVER_OBJECT对象,该对象由系统创建并传递给驱动程序的DriverEntry函数.驱动程序使用此对象来注册与设备对象和其他系统对象的交互, ...

  4. Bootstrap Table 动态修改行的颜色

    Bootstrap Table 官网地址 https://bootstrap-table.com/百度搜了大量资料 还是找不 动态改变行的颜色,一般搜索到的都是 初始化的时候  使用 rowStyle ...

  5. ajax中的同步异步和跨域请求

    ajax中的同步异步和跨域请求 同步异步 demo.html <script> $.ajax({ type: "get", async: false, data: &q ...

  6. webrtc终极版(二)搭建自己的iceserver服务,并用到RTCMultiConnection的demo中

    webrtc终极版(二)搭建自己的iceserver服务,并用到RTCMultiConnection的demo中 目录 webrtc终极版(二)搭建自己的iceserver服务,并用到RTCMulti ...

  7. Kafka-生产者性能调优

    (一)参数调优 参数调优相关代码 在实际的kafka开发中,我们会发现,无论是生产者还是消费者,都需要构建一个Properties对象,里面设置了很多参数.在这段代码中有很多常用的参数配置,在线上使用 ...

  8. Flink-SQL数据去重

    Flink去重语句 您可以通过多种方式实现去重需求,例如FIRST_VALUE.LAST_VALUE和DISTINCT等.本文为您介绍如何使用TopN方法实现去重,以及使用过程中的注意事项. 去重的方 ...

  9. NC15532 Happy Running

    题目链接 题目 题目描述 Happy Running, an application for runners, is very popular in CHD. In order to lose wei ...

  10. MySQL8.0使用mysqlsh配置主从复制 InnoDB ReplicaSet

    InnoDB ReplicaSet InnoDB ReplicaSet 由一个主节点和多个从节点构成. 可以使用ReplicaSet对象和AdminAPI操作管理复制集, 例如检查InnoDB复制集的 ...