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?

  • Wie bekommst du den SSH-Returncode mit Paramiko?
  • Wie man einen Sudo-Befehl mit Paramiko macht
  • Paramiko - Ausführen von Befehlen im "Hintergrund"
  • Python-Paramiko-Modul mit mehreren Befehlen
  • Wie benutzt man paramiko.RSAKey.from_private_key ()?
  • Wie man einen Prozess auf einem entfernten Server mit python paramiko tötet
  • Wie schreibe ich ein setup.py für ein Twistd / Twisted Plugin, das mit setuptools arbeitet, verteilen, etc?
  • Wie kann man Paketdaten mit setuptools / distribute einbinden?
  • Migration von verteilen auf setuptools
  • Setuptools kann keinen Link von dependency_links verwenden
  • Verteilen / distutils spezifizieren Python-Version
  • Was ist der richtige Weg, um Pip, virtualenv zu installieren und für Python zu verteilen?
  • 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.