【问题标题】:Read remote output and respond using paramiko (SSH.execute)读取远程输出并使用 paramiko (SSH.execute) 响应
【发布时间】:2016-05-10 17:57:31
【问题描述】:

我正在使用 python paramiko 模块在远程服务器上运行内置的 parmiko 函数 SSH.execute。我想在服务器上运行一个需要 4 个提示的脚本。我打算做一个更复杂的版本:

   ExpectedString = 'ExpectedOutput'
   Output = SSH.execute('./runScript')
   if Output == ExpectedString:
       SSH.execute('Enter this')
   else:
       raise SomeException

问题是没有返回输出,因为服务器正在等待输入数字并且脚本卡在这个 SSH.execute 命令。所以即使另一个SSH.execute 命令在它永远不会运行之后运行!我应该寻找使用 paramiko 以外的东西吗?

【问题讨论】:

    标签: python ssh paramiko


    【解决方案1】:

    您需要与远程脚本进行交互。实际上,SSH.execute 不存在,我假设您在谈论exec_command。它不只是返回输出,它实际上为您提供了标准输出、标准输入和标准错误流的包装器。您可以直接使用这些来与远程脚本进行通信。

    基本上,这就是您运行命令并通过标准输入传递数据(并使用标准输出接收输出)的方式:

    ssh.connect('127.0.0.1', username='foo', password='bar')
    
    stdin, stdout, stderr = ssh.exec_command("some_script")
    
    stdin.write('expected_input\n')
    stdin.flush()
    
    data = stdout.read.splitlines()
    

    当然,您应该检查提示,而不是依赖良好的时机。

    【讨论】:

    • 感谢您的回答!您介意解释一下使用 stdin.write、stdin.flush 和 data 的含义背后的过程吗?
    • 简而言之:您的应用程序使用stdin 接收数据并使用stdout 输出数据(和stderr 用于错误,通常,您不会注意到两者之间存在差异,因为shell 显示两者)。在 Python 中,您可以像使用文件对象(实际上也是流)一样使用它们,即readwriteflush...docs.python.org/library/io.html
    • 这个解决方案对我不起作用 - ssh.exec_command 的执行仍然像在等待输入之前一样挂起,因此没有输出返回到 python 脚本。
    【解决方案2】:

    @leoluk - 是的,我理解你的问题,这两种推荐的解决方案都不起作用。正如您所说,使用 exec_command 的问题是您只能在命令完成后读取输出。因此,如果您想远程运行命令rm -i *,您将无法读取要删除的文件,然后才能回复“是”或“否”。这里的关键是使用invoke_shell。请参阅此 youtube 链接 - https://www.youtube.com/watch?v=lLKdxIu3-A4 - 这对我很有帮助。

    【讨论】:

      猜你喜欢
      • 2013-06-12
      • 2016-07-18
      • 2021-12-28
      • 1970-01-01
      • 2020-06-08
      • 1970-01-01
      • 1970-01-01
      • 2020-01-17
      • 1970-01-01
      相关资源
      最近更新 更多