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

本地经跳板机host1连接host2执行文件读取命令报错的原因及正确命令咨询

本地经跳板机host1连接host2执行文件读取命令报错的原因及正确命令咨询

这个问题其实是shell对特殊符号的解析时机搞的鬼,我来给你拆解清楚:

报错原因

当你在本地执行这条命令时:

ssh -t host1 ssh host2 "cat < /tmp/test.txt"

你的本地shell会优先解析命令里的重定向符号<,它会尝试在你的本地机器上寻找/tmp/test.txt文件,但这个文件只存在于host2上,本地根本没有,所以直接抛出了“文件不存在”的错误——重定向逻辑根本没机会传到host2那边执行!

而你在host1上直接执行ssh host2 "cat < /tmp/test.txt"时,host1的shell会把双引号里的整个字符串作为参数传给ssh,完整发送到host2后,host2的shell才会解析<符号,去读取自己机器上的/tmp/test.txt,所以就能正常工作。

正确的本地命令

这里给你几种靠谱的解决方法:

  • 方法一:用单引号包裹host1上要执行的整个命令
    单引号会让本地shell完全不处理里面的特殊符号,直接把内容完整传给host1的shell,后续解析逻辑就和你在host1上直接执行一样了:
ssh -t host1 'ssh host2 "cat < /tmp/test.txt"'
  • 方法二:转义重定向符号
    通过反斜杠\转义<,让本地shell忽略它的特殊含义,把它当作普通字符传递下去:
ssh -t host1 ssh host2 "cat \< /tmp/test.txt"

不过这种方式在多层shell解析场景下偶尔会出问题,不如单引号的方式稳妥。

  • 方法三:用ProxyJump简化跳板机连接(推荐)
    如果你的OpenSSH版本在7.3及以上,可以直接用-J参数指定跳板机,写法更简洁直观:
ssh -J host1 host2 'cat < /tmp/test.txt'

同样用单引号包裹执行的命令,避免本地shell解析重定向符号。

备注:内容来源于stack exchange,提问作者Daniel YC Lin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.16 12:23:08