首页 > 其他分享 >netcat 命令介绍及使用示例

netcat 命令介绍及使用示例

时间:2024-03-08 21:22:57浏览次数:34  
标签:tmp 1.1 示例 nc 192.168 命令 8301 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 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 命令。

标签:tmp,1.1,示例,nc,192.168,命令,8301,netcat
From: https://www.cnblogs.com/zengzuo613/p/18061888

相关文章

  • 常用命令
    ssh创建ssh密钥对ssh-keygen-ted25519-f~/.ssh/id_ed25519-Npassswd-Ccommentorssh-keygen-trsa-b2048-f~/.ssh/id_rsa-Npassswd-Ccomment-t:可选[dsa|ecdsa|ecdsa-sk|ed25519|ed25519-sk|rsa]-b:密钥位数-f:密钥存储路径-N:密钥的密码......
  • [AIAgent]白菜GPT支撑AutoGen开发示例
    AutoGen示例说明AIAgnet仅限GPT4支持,请完成一次请求Token不可预估,请留意费用消耗。免费会员GPT4配额,很可能不足以支撑完成DEMO演示,建议付费会员测试体验。部分示例代码参考AutoGen官方文档,重点验证白菜GPT对AutoGen的支撑能力,详细代码说明,请参考官方文档。所有示例代码均在......
  • 在Docker中,容器退出后,通过docker ps命令查看不到,数据会丢失么?
    在Docker中,当一个容器退出(stoppedorexited)后,它将不再处于运行状态,因此,通过dockerps命令默认情况下将无法看到已退出的容器。然而,这并不意味着容器内的数据会丢失。容器退出时,其存储层中的数据通常是保留的,除非你明确地删除了容器。这意味着即便容器停止运行,只要你没有使用d......
  • JAVA基础--命令行传参
    命令行传参有时希望运行一个程序时再传递给它消息,这需要靠传递命令行参数给main()函数来实现编写以下代码publicclassDemo02{publicstaticvoidmain(String[]args){//args.length数组长度for(inti=0;i<args.length;i++){......
  • docker 常用命令
    docker常用命令1.dockersearch[OPTIONS]NAME#搜索DockerHub上的镜像。-q:只显示仓库名。--filter:设置过滤条件,比如搜索官方镜像可以使用--filter="is-official=true"。limit:设置搜索结果的最大条数。--no-trunc:显示完整的镜像描述,而不是截断的描述。例子......
  • NPM 常用命令
    本文为joshua317原创文章,转载请注明:转载自joshua317博客 https://www.joshua317.com/article/319NPM提供了很多命令,例如install和publish,使用npmhelp可查看所有命令。NPM提供了很多命令,例如install和publish,使用npmhelp可查看所有命令。$npmhelpnpm<command>Usage:......
  • Spring boot常用命令总结
    1.打包jar包mvnpackageclean-Dmaven.test.skip=truemvnpackage-Dmaven.test.skip=true2.结束当前运行的程序ps-aux|grepjavakill-9$(ps-ef|grep/usr/bin/chromedriver|grep-vgrep|awk'{print$2}')kill-9$(ps-ef|grep/opt/google/chrome/chrome|grep......
  • 如何通过docker容器查看run命令
    1.当你需要迁移docker的时候,忘记的run的命令可以使用一下方法blossom-backend是你的容器名字或者容器IDdockerinspect--format'dockerrun\--name{{printf"%q".Name}}\{{-with.HostConfig}}{{-if.Privileged}}--privileged\{{-en......
  • 网站服务器问题排查常用命令
       访问最频繁的url awk'{print$7}'/www/wwwlogs/pap.log|sort|uniq-c|sort-rn|head-n20 指定时间段访问最频繁的ipawk'{print$7}'/www/wwwlogs/p.log|sort|uniq-c|sort-rn|head-n20cat/www/wwwlogs/p.cn.log |awk'$4>......
  • Java 日期和时间 API:实用技巧与示例 - 轻松处理日期和时间
    Java用户输入(Scanner)简介Scanner类用于获取用户输入,它位于java.util包中。使用Scanner类要使用Scanner类,请执行以下步骤:导入java.util.Scanner包。创建一个Scanner对象,并将其初始化为System.in。使用Scanner对象的方法读取用户输入。示例importjava.ut......