2017-11-10 1 views
0

Ich habe ein Python-Skript Ich versuche, ein RPM-Paket zu installieren, aber wenn ich den Befehl zur Installation sende, wartet nicht auf den Befehl zu beenden, bevor der Dienst neu gestartet wird. Ich habe viele Foren über die Verwendung von "recv_exit_status()" gelesen, aber ich glaube nicht, dass ich es richtig benutze. DieseWarte, bis paramiko exec_command fertig ist

ist, was ich habe:

#!/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() 
+0

Ich habe versucht, Fabric zu verwenden, aber ich scheine irgendwo meine Syntax zu vermasseln. –

Antwort

0

Es ist channel.recv_exit_status(), nicht stdout.channel.recv_exit_status().

Da Sie jedoch versuchen, den gleichen Befehl über viele Server auszuführen, ist etwas wie parallel-ssh besser geeignet und viel schneller als paramiko, sowohl sequentiell als auch parallel.

-Code, es zu tun ist auch viel einfacher, nur:

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) 

documentation für weitere Informationen.

+0

Verwenden Sie, was Sie geschrieben haben, aber es scheint das gleiche zu tun. Das Skript scheint nicht auf das Ende der rpm-Installation zu warten. Ich bekomme nur die Ausgabe von "Host 192.168.1.1 exit code 0". Ich werde aber weiterhin durch die Dokumentation schauen. –

+0

Testen Sie zuerst Ihren Befehl. Wenn es keine Ausgabe gibt, kann der Befehl nicht ausgeführt oder beendet worden sein, wenn nichts zu tun ist, z. B. wenn die RPM bereits installiert ist. – danny

+0

Ich bin so ein Noob. Ich habe gerade festgestellt, dass ich nicht den vollständigen Pfad in meine Dateivariable geschrieben habe. Ich denke, das war mein Thema in all meinen Skripten. –

Verwandte Themen