如何让读取/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
相关产品推荐
相关产品推荐

