这些工作,
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"'