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?

  • Problem Ursprung SSH Tunnel aus Python
  • Paramiko und python ssh
  • Wie kann ich wissen, ob ein paramiko SSH-Kanal getrennt ist?
  • Python paramiko wartet, um den Befehl auszuführen
  • Wie zu sehen (log) Datei Transfer Fortschritt mit paramiko?
  • Automatisieren Sie ssh-Verbindung und Ausführung des Programms mit Pythons Paramiko
  • Wie kann man Paketdaten mit setuptools / distribute einbinden?
  • Verteilen / distutils spezifizieren Python-Version
  • Wie kann ich setuptools (oder verteilen) ein Paket aus dem lokalen Dateisystem installieren
  • Migration von verteilen auf setuptools
  • Was ist der richtige Weg, um Pip, virtualenv zu installieren und für Python zu verteilen?
  • 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.