本地经跳板机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
相关产品推荐
相关产品推荐

