Python paramiko ssh

Ich bin neu auf Python. Ich habe ein Skript geschrieben, um eine Verbindung zu einem Host herzustellen und einen Befehl auszuführen

ssh = paramiko.SSHClient() ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) ssh.connect(host, username=user, password=pw) print 'running remote command' stdin, stdout, stderr = ssh.exec_command(command) stdin.close() for line in stdout.read().splitlines(): print '%s$: %s' % (host, line) if outfile != None: f_outfile.write("%s\n" %line) for line in stderr.read().splitlines(): print '%s$: %s' % (host, line + "\n") if outfile != None: f_outfile.write("%s\n" %line) ssh.close() if outfile != None: f_outfile.close() print 'connection to %s closed' %host except: e = sys.exc_info()[1] print '%s' %e 

Funktioniert gut, wenn dann Fernbedienung keine tty benötigt. Ich habe eine Einladung zum Beispiel " Nested SSH" mit Paramiko gefunden . Ich bin nicht glücklich mit dieser Lösung, denn wenn ein Server eine Aufforderung hat, die in meinem Skript nicht angegeben ist -> Endlosschleife oder eine angegebene Eingabeaufforderung im Skript ist ein String im Rückgabetext -> werden nicht alle Daten empfangen . Gibt es eine bessere Lösung, wo Stdout und Stderr wie in meinem Drehbuch zurückgeschickt werden?

  • Paramiko unter Windows installieren
  • Python: Wie kann Fernbedienung von meinem lokalen PC zu remoteA zu remoteb zu remote c mit Paramiko
  • Paramiko Protokoll Fehler: erwartete Paket SSH_MSG_USERAUTH_REQUEST, bekam SSH_MSG_SERVICE_REQUEST
  • Verbinden mit entfernter Postgresql-Datenbank über ssh-Tunnel mit Python
  • Paramiko schließt ssh-Verbindung auf einer Nicht-Paramiko-Ausnahme
  • Paramiko-Kanal steckt beim Lesen großer Ouput
  • Wie schreibe ich ein setup.py für ein Twistd / Twisted Plugin, das mit setuptools arbeitet, verteilen, etc?
  • Wie kann ich setuptools (oder verteilen) ein Paket aus dem lokalen Dateisystem installieren
  • Wie unterscheiden sich Setuptools, Distribution und Pip aufeinander?
  • Was ist der richtige Weg, um Pip, virtualenv zu installieren und für Python zu verteilen?
  • Verteilen / distutils spezifizieren Python-Version
  • Setuptools kann keinen Link von dependency_links verwenden
  • 2 Solutions collect form web for “Python paramiko ssh”

    Es gibt umfangreiche paramiko API-Dokumentation finden Sie unter: http://www.lag.net/paramiko/docs/

    Ich verwende die folgende Methode, um Befehle auf einem passwortgeschützten Client auszuführen:

     import paramiko import sys nbytes = 4096 hostname = 'hostname' port = 22 username = 'username' password = 'password' command = 'ls' client = paramiko.Transport((hostname, port)) client.connect(username=username, password=password) stdout_data = [] stderr_data = [] session = client.open_channel(kind='session') session.exec_command(command) while True: if session.recv_ready(): stdout_data.append(session.recv(nbytes)) if session.recv_stderr_ready(): stderr_data.append(session.recv_stderr(nbytes)) if session.exit_status_ready(): break print 'exit status: ', session.recv_exit_status() print ''.join(stdout_data) print ''.join(stderr_data) session.close() client.close() 

    Es ist etwas falsch mit der akzeptierten Antwort, es manchmal (zufällig) bringt eine abgeschnittene Antwort vom Server. Ich weiß nicht, warum, ich habe nicht die fehlerhafte Ursache der akzeptierten Antwort untersucht, weil dieser Code perfekt für mich gearbeitet hat:

     import paramiko ip='server ip' port=22 username='username' password='password' cmd='some useful command' ssh=paramiko.SSHClient() ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) ssh.connect(ip,port,username,password) stdin,stdout,stderr=ssh.exec_command(cmd) outlines=stdout.readlines() resp=''.join(outlines) print(resp) stdin,stdout,stderr=ssh.exec_command('some really useful command') outlines=stdout.readlines() resp=''.join(outlines) print(resp) 
    Python ist die beste Programmiersprache der Welt.