Python 等待paramiko exec_命令完成

Python 等待paramiko exec_命令完成,python,ssh,paramiko,Python,Ssh,Paramiko,我有一个python脚本,我正在尝试安装rpm软件包,但是当我发送安装命令时,它不会等到命令完成后再重新启动服务。我读过很多关于使用recv\u exit\u status()的论坛,但我认为我没有正确使用它 这就是我所拥有的: #!/usr/bin/python import paramiko, os from getpass import getpass # Setting Variables Hosts = [ '192.168.1.1', '192.168.1.2'] #IPs c

我有一个python脚本,我正在尝试安装rpm软件包,但是当我发送安装命令时,它不会等到命令完成后再重新启动服务。我读过很多关于使用
recv\u exit\u status()
的论坛,但我认为我没有正确使用它

这就是我所拥有的:

#!/usr/bin/python

import paramiko, os
from getpass import getpass

# Setting Variables 
Hosts = [ '192.168.1.1', '192.168.1.2'] #IPs changed for posting
username = 'root'
print 'Enter root password on remote computer:'
password = getpass()
port = 22
File = 'Nessus-6.11.2-es7.x86_64.rpm'

for host in Hosts:
    print 'Finished copying files. Now executing on remote computer'

    #Setting up SSH session to run commands
    remote_client = paramiko.SSHClient()
    remote_client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    remote_client.connect(host, username=username, password=password)

    InstallNessus = 'rpm -U --percent %s'%File
    stdin, stdout, stderr = remote_client.exec_command(InstallNessus)
    stdout.channel.recv_exit_status()
    lines = stdout.readlines()
    for line in lines:
        print line
    stdin, stdout, stderr = remote_client.exec_command('systemctl restart nessusd.service')

    remote_client.close()

我尝试过使用Fabric,但我似乎在某个地方弄乱了语法。

它是
channel.recv\u exit\u status()
,而不是
stdout.channel.recv\u exit\u status()

但是,由于您试图在许多服务器上运行相同的命令,因此类似的命令比paramiko(顺序和并行)更适合,速度也更快

执行此操作的代码也要简单得多,只是:

from pssh.pssh2_client import ParallelSSHClient

hosts = ['192.168.1.1', '192.168.1.2']
_file = 'Nessus-6.11.2-es7.x86_64.rpm'
cmd = 'rpm -U --percent %s' % _file

client = ParallelSSHClient(hosts, user='<user>', password='<password>')

output = client.run_command(cmd)
for host, host_output in output.items():
    for line in host_output.stdout:
        print "Host %s: %s" % (host, line)
    print "Host %s exit code %s" % (host, host_output.exit_code)

restart_out = client.run_command('systemctl restart nessusd.service')
# Just wait for completion
client.join(restart_out)
从pssh.pssh2\u客户端导入并行客户端
hosts=['192.168.1.1','192.168.1.2']
_文件='Nessus-6.11.2-es7.x86_64.rpm'
cmd='rpm-U--百分比%s%\U文件
客户端=ParallelSSHClient(主机,用户=“”,密码=“”)
输出=客户端。运行命令(cmd)
对于主机,主机输出在output.items()中:
对于host_output.stdout中的行:
打印“主机%s:%s”%(主机,行)
打印“主机%s退出代码%s%”(主机,主机输出。退出代码)
restart_out=client.run_命令('systemctl restart nessud.service'))
#只需等待完成
client.join(重新启动\u out)

有关更多信息,请参阅。

add get_pty=True这将等待命令执行完成。stdin,stdout,stderr=self.ssh.exec_command(command,get_pty=True)

使用您发布的内容,但它似乎也在这样做。脚本似乎没有等待rpm安装完成。我只得到“主机192.168.1.1退出代码0”的输出。不过我会继续查看文档。首先测试您的命令。如果没有输出,则命令可能没有执行或退出,而无需执行或退出,例如,如果RPM已经安装。我就是这样一个傻瓜。我刚刚意识到我没有把完整路径放在我的文件变量中。我想这是我所有脚本的问题。另请参阅。