ssh 交互式与命令的重定向行为不一致

ssh 交互式与命令的重定向行为不一致

这些工作,

ssh remote 'echo hi > hi.txt'
echo hi | ssh remote 'cat > hi.txt'

但这不起作用

ssh remote sh -c 'echo hi > hi.txt'

我希望在远程生成一个名为 hi.txt 的文件,其中包含“hi”。相反,我得到了空的文件名为 hi.txt。

以下给出了从交互式 ssh 会话执行时的预期行为。

sh -c 'echo hi > hi.txt'

我对 ssh 和重定向有什么误解?

答案1

我认为您的本地 shell 正在剥离您的报价。你可以尝试

ssh remote sh -c '"echo hi > hi.txt"'

当您使用 ssh 发送远程命令时,有两个 shell 参与读取发送的每一行。您的本地 shell 和远程 shell。

对此的一个很好的解释可以在远程 shell 的 Unix/Linux Shell 引用

答案2

这可能是使用 ssh 时最令人困惑和烦人的事情(至少在我看来)。

出现此行为的原因是 ssh 在执行远程命令时不保留参数。它接受您的所有参数,并将它们连接在一起,并用空格分隔。

所以当你跑步时

ssh remote sh -c 'echo hi > hi.txt'

实际上,您正在运行的是:

ssh remote 'sh -c echo hi > hi.txt'

这会运行sh -c echo,传递 shell (不是echo) 的参数hi(未使用),并将输出重定向到hi.txt.

 

chhonous(嵌套引用)提供的解决方案是解决此问题的一种方法。让我们看一下:

ssh remote sh -c '"echo hi > hi.txt"'

这里发生的事情是 ssh 连接所有参数,所以你实际上最终得到:

ssh remote 'sh -c "echo hi > hi.txt"'

相关内容