3

我正在使用 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 以外的东西吗?

4

2 回答 2

3

您需要与远程脚本进行交互。实际上,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()

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

于 2012-10-08T15:40:04.830 回答
0

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

于 2016-05-10T09:57:31.577 回答