交互式 ssh 连接不起作用

交互式 ssh 连接不起作用

由于某种原因,我有一个需要以下编码的主脚本:

vi test_run.sh    
#!/bin/sh
ssh -tt 192.168.1.20

要执行我运行的命令:

cat test_run.sh | sh -

我能够连接到远程服务器,但无法在那里发出任何命令,例如lsEnter,导致屏幕挂起。

答案1

ssh将继承执行它的 shell 的标准输入流。

执行的 shell 的标准输入ssh用于读取 shell 脚本(从 的管道cat),因此不可用于以交互方式向 发出命令ssh。这就是为什么你试图-tt使ssh会话具有交互性(ssh否则会抱怨,说伪终端不会被分配,因为 stdin 不是终端),但它不起作用,因为如上所述,所使用的流向它提供来自用户的命令,而 shell 正在使用该流来读取实际的脚本。

相反,像往常一样运行脚本:

sh test_run.sh

这将使标准输入流可供您以交互方式向远程 shell 会话发出命令,并且您的调用也根本ssh不需要。-tt

如果你的脚本有点长:

#!/bin/sh

ssh -tt 192.168.1.20
hostname
echo "DONE"

如果你运行它

cat test_run.sh | sh -

hostname你会注意到执行这两者的机器echo实际上是偏僻的机器。这是因为 shell 的标准输入(连接到从 读取的流cat,包含脚本)将被传递到ssh。这具有将脚本中的命令传递到远程系统上启动的 shell 的效果(就像将它们输入到远程 shell 中一样)。

相关内容