Bash脚本通过Netcat连接无法发送消息,如何实现多消息发送?
解决Bash脚本连接服务器后无法发送消息及批量发送带前缀可变内容的问题
老兄,你遇到的这个问题我之前也碰到过——多半是因为用了一次性的管道输入方式(比如直接echo "test" | telnet your_server your_port),管道里的内容发完,连接直接就断了,根本没机会持续发消息。要搞定固定前缀加可变数据的多条消息发送,核心就是得把会话连接稳住,别发一条就跑。下面给你几个实用的方案,按需选:
方案1:用Netcat(nc)配合Bash循环+重定向
Netcat比telnet更适合脚本场景,灵活性拉满。我们可以用子shell循环生成消息,再通过管道传给nc,让它保持连接直到所有消息发完(甚至一直保持)。
比如要发送prefix_+1到10的数字消息,脚本这么写:
#!/bin/bash SERVER="你的服务器IP" PORT="你的服务器端口" PREFIX="prefix_" # 子shell循环生成消息,通过管道传给nc保持连接 ( for i in {1..10}; do # 生成带前缀的可变消息,这里可以替换成你的自定义逻辑 echo "${PREFIX}${i}" # 可选:每条消息间加延迟,避免给服务器太大压力 sleep 0.5 done # 如果需要一直保持连接,去掉下面的注释就行 # sleep infinity ) | nc $SERVER $PORT
执行脚本后,nc会一直保持和服务器的连接,直到子shell的输出结束(或者你用sleep infinity让连接一直挂着,手动终止脚本才断开)。
方案2:用Expect处理交互式场景
如果你的服务器需要先交互(比如等欢迎信息、输入登录凭证)再发消息,Expect就是专门干这个的——它能自动识别服务器的响应,再触发后续操作,完全不用手动干预。
举个例子,先等服务器返回Welcome to server的欢迎信息,再循环发带前缀的消息:
#!/usr/bin/expect set SERVER "你的服务器IP" set PORT "你的服务器端口" set PREFIX "prefix_" # 启动telnet连接服务器 spawn telnet $SERVER $PORT # 等待服务器的欢迎信息,确认连接成功建立 expect "Welcome to server" # 循环发送10条带前缀的可变消息 for {set i 1} {$i <= 10} {incr i} { set message "${PREFIX}${i}" send "$message\r" # 记得加回车,很多服务器需要这个来识别消息结束 sleep 0.5 } # 要是需要退出连接,就解开下面的注释 # send "exit\r" expect eof
给脚本加执行权限:chmod +x send_messages.exp,直接运行就行,它会自动处理整个交互流程,绝不会提前断开连接。
方案3:纯Bash实现(无需额外工具)
如果你的环境没法装nc或Expect,纯Bash也能搞定。通过文件描述符的进程替换,把消息持续写入连接:
#!/bin/bash SERVER="你的服务器IP" PORT="你的服务器端口" PREFIX="prefix_" # 打开nc连接,把文件描述符3绑定到nc的输入 exec 3> >(nc $SERVER $PORT) # 循环发送带前缀的消息 for i in {1..10}; do echo "${PREFIX}${i}" >&3 sleep 0.5 done # 关闭文件描述符,结束连接 exec 3>&-
这种方式完全依赖Bash自身特性,不用装任何额外工具,适合环境受限的场景。
几个关键注意点
- 消息结束符:绝大多数服务器要求消息以换行符(
\n)或回车换行(\r\n)结尾,所以发送时要么用默认加\n的echo,要么手动加\r(比如echo -e "${message}\r")。 - 连接稳定性:绝对别用一次性管道,那样发完消息就直接断开了,一定要用能持续输入的方式(子shell、文件描述符、Expect)。
- 流量控制:批量发消息时记得加
sleep,短时间冲太多消息容易被服务器限流或拒绝。
内容的提问来源于stack exchange,提问作者OcK
相关产品推荐
相关产品推荐

