我正在尝试通过host1cat < /tmp/test.txt
在远程主机host2上运行。该文件存在于host2上。我尝试:/tmp/test.txt
# locally
ssh -t host1 ssh host2 "cat < /tmp/test.txt"
上述命令的结果是:
bash: /tmp/test.txt: No such file or directory
如果我直接在host1上运行类似的命令,它会起作用。有效的命令是:
# on host1
ssh host2 "cat < /tmp/test.txt"
为什么我会得到No such file or directory
?正确的本地命令是什么?
通常,
ssh
它能够从它获取的许多参数构建命令。这给人一种印象,参数作为数组传递到远程端。但事实并非如此;远程命令始终是要由远程 shell 解释的单个字符串。您的命令:
相当于这样:
它们都会导致相同的命令被传递到host1上的 shell 。该命令是:
上述命令使host1上的 shell尝试重定向此 的 stdin
ssh
。No such file or directory
来自host1上的此重定向尝试。如果重定向成功,则传递给host2上的 shell 的字符串将是cat
。您在host1上想要的命令是:
它不涉及host1上的任何重定向并且传递给host2
cat < /tmp/test.txt
上的 shell 。本地命令有多种形式,可以准确传递到host2
cat < /tmp/test.txt
上的 shell 。这是我要使用的:外引号(本例中为单引号)用于本地 shell。内引号(本例中为双引号)用于host1上的 shell。在host1上运行的命令正是您想要的命令。
这里有更多见解:如何通过 ssh 执行复杂的命令行?
注意在host1
ssh -t host1 …
上分配一个 tty ,如果host1要求输入密码,这将很有用(我怀疑这是您使用 的原因),但它可能会扭曲 的内容。换句话说,如果您在本地将输出重定向到常规文件,则该文件可能与原始 不相同。您无法通过这种方式可靠地传输任意数据(请参阅使用单独的 stdin、stdout、stderr 和 tty)。ssh host2 …
ssh -t
/tmp/test.txt
/tmp/test.txt
ssh