我编写了一个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;蟒
答案 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。