You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让读取/dev/tcp/$server/ssh时的timeout命令生效?

解决bash中timeout对/dev/tcp连接超时不生效的问题

问题的核心原因:bash会先于timeout命令尝试建立/dev/tcp的TCP连接,系统默认的TCP连接超时时间(通常约60秒)会覆盖你设置的20秒timeout。timeout只能监控后续启动的cat命令,无法管控bash本身发起连接的过程,因此实际耗时是系统默认的连接超时时长。

以下是两种可行的解决方法:

方案1:用子shell包裹整个连接操作

将/dev/tcp的连接逻辑放到bash子进程中,让timeout监控整个子进程的运行,这样bash的连接尝试也会被20秒限制:

server="X.Y.Z.T"
timeout 20s bash -c 'cat < /dev/tcp/'$server'/ssh'
if [ $? -eq 124 ]; then
    echo "WARNING: Could not connect to $server on ssh."
fi

原理

timeout启动bash子进程后,子进程内部执行/dev/tcp连接操作,整个子进程的运行时间被严格限制在20秒内,超时后会被终止,退出码为124。

方案2:使用netcat(nc)替代/dev/tcp

nc是专门的网络测试工具,本身支持超时参数,比/dev/tcp更可控,无需依赖timeout命令:

server="X.Y.Z.T"
if ! nc -w 20 -z $server 22; then
    echo "WARNING: Could not connect to $server on ssh."
fi

参数说明

  • -z:仅扫描端口状态,不发送数据
  • -w 20:直接设置连接超时时间为20秒

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 02:48:21