2016-06-24 3 views
2

Ich erstelle einen SSH Channel zu einem Remote-Host mit paramiko. Wenn ich jedoch versuche, einen Befehl mit der ssh_object.exec_command auszuführen, scheint der Befehl nicht ausgeführt werden.Python2.7: ssh.exec_command führt keinen Befehl aus

Diese Funktion erzeugt mein ssh Handler:

def ssh_connect(ip,user,pwd): 
    ''' 
    This function will make an ssh connection to the ip using the credentials passed and return the handler 
    Args: 
     ip: IP Address of the box into which ssh has to be done 
     user: User name of the box to which ssh has to be done 
     pass: password of the box to which ssh has to be done 
    Returns: 
     An ssh handler 
    ''' 
    ssh = paramiko.SSHClient() 
    ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) 
    ssh.connect(ip, username=user, password=pwd) 
    return ssh 

Und das ist, wo ich den Handler bin mit:

ssh_obj = ssh_connect(ip, username, password) 
folder = "/var/xyz/images/" + build_number 
command = "mkdir " + folder 
ssh_stdin, ssh_stdout, ssh_stderr = ssh_obj.exec_command(command) 

Wenn ich auf den entfernten Rechner gehen, hat der Ordner nicht erstellt habe . In ähnlicher Weise habe ich versucht, auch die Ausgabe eines Befehls ls zu lesen. Keine Antwort kommt, wenn ich ssh_stdout.read() mache.

Wohin gehe ich falsch?

+0

Können Sie bitte überprüfen, ob es eine Anmeldung gibt ssh_stderr? –

+0

@AlekhyaVemavarapu, wie überprüfe ich das? –

+0

Try Befehl = "mkdir -p" + Ordner – skynyrd

Antwort

1

Ich stieß auf CentOS 7-Servern mit paramiko 2.0.2 auf das gleiche Problem. Das Beispiel aus der paramiko Github Homepage zunächst nicht für mich arbeiten: https://github.com/paramiko/paramiko#demo

import paramiko 
client = paramiko.SSHClient() 
client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) 
client.connect(hostname=self.server['host'], username=self.server['username'], password=self.server['password']) 
stdin, stdout, stderr = client.exec_command('ls') 
for line in stdout: 
    print '... ' + line.strip('\n') 
client.close() 

Nachdem ich das Remote-System des obigen Beispiel gestartet aktualisiert zu arbeiten. Aber nicht der Code, den ich geschrieben habe (ähnlich dem Code von OP). Das hat eine Idee, dass ich den Puffer für die Standardausgabe direkt nach der Ausführung lesen muss. Also habe ich den Code geändert, um es zu tun und es hat funktioniert. Basierend auf OPs Code könnte es aussehen

ssh_obj = ssh_connect(ip, username, password) 
folder = "/var/xyz/images/" + build_number 
command = "mkdir " + folder 
ssh_stdin, ssh_stdout, ssh_stderr = ssh_obj.exec_command(command) 
# Read the buffer right after the execution: 
ssh_stdout.read() 

Was interessant ist, ist, dass der Puffer zu lesen später (nachdem Sie den Client schließen) gibt Ihnen nichts.