我粘贴的输入去哪里了?

我粘贴的输入去哪里了?

我正在将 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/nullssh

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

相关内容