我正在将 shell 命令序列复制并粘贴到终端模拟器中,但我对这种行为感到困惑。
- 当我粘贴单行时,
ssh user@remote "echo foo"; echo baz
计算机会按照我的预期进行操作。它运行 SSH 命令,然后在我完成 SSH 会话后回显一些内容。 - 然而,当我将相同的内容粘贴为多行命令时,这种情况不会发生。
ssh 用户@远程“echo foo” 回声巴兹
我仍然可以看到 SSH 会话,但echo baz
完全消失了。没有运行任何命令。 - 这似乎至少与 SSH 有关。因为用其他东西替换 SSH 会产生我真正期望的行为。当我粘贴此命令时,这两个命令都会运行,例如:
回声富 回声巴兹
那么到底发生了什么?粘贴的输入去哪里了?为什么echo命令没有被执行任何事物?这与 SSH 有什么关系?
(顺便说一句:我知道Ctrl+ X, Ctrl+E方法,但有时,特别是在 Windows 上使用终端模拟器时,这不能开箱即用。)
答案1
尝试粘贴这个:
ssh user@host 'read foo; echo ">>$foo<<"'
echo bar
您将看到服务器上的>>echo bar<<
输出。echo
这意味着它将ssh
吃掉其标准输入上粘贴的数据,就像您已经完成一样
echo 'echo bar' | ssh user@host 'read foo; echo ">>$foo<<"'
解决这个问题的方法是使用ssh -n
,它会重定向/dev/null
到ssh
:
ssh -n user@host 'echo foo'
echo bar
不幸的是我不知道粘贴的机制,所以我不能说任何聪明的事情为什么粘贴的数据最终出现在 的标准输入流上ssh
,但我猜测它与从交互式 shell(从标准输入读取命令)继承的流有关。
使用ssh -n
也是解决方案(或至少A的解决方案)的问题
while read something; do
ssh user@host 'somecommand'
done <inputfile
在这里,循环只会运行一次,因为ssh
会吃掉来自 的数据inputfile
。