You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何通过Shell脚本/Unix命令将文件数据发送至指定服务器的TCP端口?已尝试两种方案但均失败

解决Shell脚本发送文件数据到指定TCP端口的问题

我来帮你排查下之前的问题,再给出几个靠谱的解决方案~

先分析你遇到的两个方案问题

方案1的问题

你用exec cat /home/data/load.txt > /dev/tcp/$host/$port时出现的错误,大概率是**$host变量没有正确赋值**,导致命令变成了/dev/tcp//$port,系统识别不了空的主机名,才会报错“Name or service not known”和“Invalid argument”。另外要注意,/dev/tcp是bash的特殊虚拟文件,只有bash支持,如果你的脚本用sh运行(比如脚本开头是#!/bin/sh),也会失效。

方案2的问题

用ncat时显示“Connected to xx.xx.xx.xx:4053”说明连接成功了,但“Connection reset by peer”是服务器主动断开了连接。可能的原因有:

  • 服务器端的服务虽然监听了4053端口,但没有正确处理接收的数据(比如服务逻辑有问题,或者期望特定格式的输入)
  • -w 2设置的超时时间太短,数据还没发完就被切断了
  • ncat的参数需要调整,比如没有明确告知发送完成后关闭连接

可行的解决办法

方法1:修复bash的/dev/tcp方法

首先确保$host$port变量正确赋值,脚本用bash运行:

#!/bin/bash
# 先设置正确的主机和端口
host="你的服务器IP或域名"
port="4053"
# 直接发送文件内容,不需要exec也可以
cat /home/data/load.txt > /dev/tcp/$host/$port

可以加个简单的错误处理,方便排查:

#!/bin/bash
host="你的服务器IP或域名"
port="4053"

if ! cat /home/data/load.txt > /dev/tcp/$host/$port; then
    echo "发送数据失败,请检查主机/端口是否正确,或者服务器是否可达" >&2
    exit 1
fi

方法2:改进ncat命令

先测试服务器端口是否真的能正常连接:

ncat -zv $host $port

如果连接正常,调整ncat参数试试:

# 去掉超时限制,加上--send-only发送完就关闭连接
ncat -v --send-only $host $port < /home/data/test.txt

如果服务器需要特定的结束符(比如换行符),可以给文件内容补个换行:

echo -e "$(cat /home/data/test.txt)\n" | ncat -v --send-only $host $port

方法3:用其他工具替代

如果上述方法都不行,可以试试这些工具:

  • 传统netcat(nc):大部分Unix系统都预装了,用法简单:
    nc $host $port < /home/data/load.txt
    
  • socat:功能更强大的网络工具,能处理更多复杂场景(比如重试、超时、协议转换),安装后使用:
    socat TCP:$host:$port OPEN:/home/data/load.txt
    

额外排查建议

  1. 先确认服务器的4053端口是否对外开放,用telnet $host $port测试连通性
  2. 检查服务器端的服务是否正常运行,是否有日志记录连接失败的原因
  3. 如果是在脚本中使用,确保变量没有被意外覆盖,比如host变量不要和系统命令重名

内容的提问来源于stack exchange,提问作者Sivakumar Palanisamy

火山引擎 最新活动