【问题标题】:Calling a a remote interactive python script from a bash script: Input request lag从 bash 脚本调用远程交互式 python 脚本:输入请求滞后
【发布时间】:2014-01-22 07:19:51
【问题描述】:

我编写了一个 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),该脚本调用另一个 bash 脚本,该脚本最终调用 python 脚本,提示用户输入。

即bash -> bash -> bash -> python

【问题讨论】:

  • 您需要使用 subprocess.Popen 或 ssh lib 来实现输入部分。
  • 与我的问题中的代码类似:stackoverflow.com/questions/20472288/…
  • 我知道,但是我的问题中的代码通过 SSH 处理脚本的输入/输出。请注意elif 'are you sure you want to continue connecting' in lower:,这是我将输入返回给远程提示的示例。我已经在需要用户某种形式的操作/输入的远程安装脚本上使用它。
  • 所以你是说我必须修改python脚本(提示的那个),而不是我的bash脚本?
  • 我可能混在一起了,我假设调用脚本是 Python,而远程脚本是 bash->bash->python。但你是说你的调用脚本是 bash?

标签: python linux bash ssh raw-input


【解决方案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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-07
    • 1970-01-01
    • 2022-11-30
    • 1970-01-01
    • 2020-11-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多