由于某种原因,我有一个需要以下编码的主脚本:
vi test_run.sh
#!/bin/sh
ssh -tt 192.168.1.20
要执行我运行的命令:
cat test_run.sh | sh -
我能够连接到远程服务器,但无法在那里发出任何命令,例如ls
按Enter,导致屏幕挂起。
答案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 中一样)。