从bash脚本调用远程交互式python脚本:输入请求滞后

时间:2014-01-22 07:19:52

标签: python linux bash ssh raw-input

我编写了一个bash脚本,它一度可以自动在远程主机上安装某些软件,如下所示:

ssh user@remotehost "<path>/install-script"

其中install-script是bash脚本。该bash脚本在某个时刻调用另一个bash脚本,该脚本在某些时候调用交互式python脚本,然后使用python的raw_input()函数来收集用户输入。

当我正常运行安装脚本(来自bash shell)时,它会提示并完全接受输入。但是,当我脚本中的上述代码运行时,在输入输入之后我才会收到提示。

我真正掌控的唯一脚本是我的自动化脚本。

我读过这个问题:“Python - how can I read stdin from shell, and send stdout to shell and file。”但是,我在正常的bash shell中运行没有问题,只能通过ssh上的远程命令运行。

可以从我的脚本中修复此问题(如果是,如何?),还是我必须修改python脚本?

更新

为了澄清,我所指的输入提示是来自python脚本的提示。我没有为ssh输入密码(远程主机在我的authorized_keys文件中有我的公钥。)

更新

为了进一步说明,我的脚本(bash)正在调用安装脚本(bash),该脚本调用另一个最终调用python脚本的bash脚本,该脚本会提示用户输入。

即。 bash - &gt; bash - &gt; bash - &gt;蟒

1 个答案:

答案 0 :(得分:1)

ssh user@remotehost "<path>/install-script"

当您运行ssh并指定要在远程系统上调用的命令时,默认情况下,ssh不会为远程会话分配PTY(伪TTY)。这意味着您将通过一组pipes而不是TTY与远程流程进行通信。

写入管道时,unix程序通常会缓冲其写入操作。在写入管道的进程刷新其缓冲区或退出时,您将看不到写入管道的输出 - 因为缓冲输出通常在退出时刷新。除此之外,进程可以检测它是写入文件,管道还是tty,并且可以调整其行为。例如,类似bash的shell在从管道读取命令时不会打印命令提示符。

您可以使用ssh选项强制-t为会话请求TTY:

ssh -tt user@remotehost "<path>/install-script"

有关详细信息,请参阅ssh man page