2013-01-14 18 views
5

Ich habe versucht, dies zum Laufen zu bringen, aber immer die gleichen Fehler zu bekommen. Ich habe versucht, die FQDN und IP des Hosts. Ich habe versucht, es mit Anmeldeinformationen und ohne zu übergeben. Ich habe mir die Zeilen in der Fehlermeldung angesehen. Google gesucht, aber kann nicht herausfinden, warum dies nicht funktioniert:SSH - Python mit paramiko Ausgabe

import paramiko 
ssh = paramiko.SSHClient() 
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) 
ssh.connect('host', username='loginname') 
stdin, stdout, stderr = ssh.exec_command("pwd") 
stdout.readlines() 

Fehler:

Traceback (most recent call last): 
    File "audit.py", line 7, in <module> 
    ssh.connect('host', username='loginname') 
    File "/usr/lib/python2.6/site-packages/paramiko/client.py", line 338, in connect 
    self._auth(username, password, pkey, key_filenames, allow_agent, look_for_keys) 
    File "/usr/lib/python2.6/site-packages/paramiko/client.py", line 520, in _auth 
    raise SSHException('No authentication methods available') 
  • Ich bin in der Lage an den Host ohne Problem über ssh zu verbinden.
  • ssh-Version: OpenSSH_5.3p1, OpenSSL 1.0.0-fips 29 Mar 2010
  • Zu beachten: Ich versuche, eine Möglichkeit zum Ausführen einer Reihe von Befehlen auf mehreren Remote-Servern zu erstellen. Ich verwende sys import argv, um das Skript wie python audit.py host1 host2 host3 auszuführen, und dann wird das Skript die Überprüfung für diese bestimmten Hosts ausführen. Ich habe bereits ein Bash-Skript erstellt, das dies ermöglicht, aber ich wollte einen besseren Weg, es über Python zu machen.
+1

Könnte dies auf das fehlende Schlüsselwort 'password' zurückzuführen sein? – Tshepang

Antwort

6

Sie sollten entweder eine Passwort oder ein privater Schlüssel (oder beides), sonst weiß der SSH-Client nicht, wie er sich mit den Login-Daten authentifizieren soll.

Hier ist mein Codebeispiel für Ihre Referenz.

#!/usr/bin/python 

from StringIO import StringIO 
import paramiko 

class SshClient: 
    "A wrapper of paramiko.SSHClient" 
    TIMEOUT = 4 

    def __init__(self, host, port, username, password, key=None, passphrase=None): 
     self.username = username 
     self.password = password 
     self.client = paramiko.SSHClient() 
     self.client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) 
     if key is not None: 
      key = paramiko.RSAKey.from_private_key(StringIO(key), password=passphrase) 
     self.client.connect(host, port, username=username, password=password, pkey=key, timeout=self.TIMEOUT) 

    def close(self): 
     if self.client is not None: 
      self.client.close() 
      self.client = None 

    def execute(self, command, sudo=False): 
     feed_password = False 
     if sudo and self.username != "root": 
      command = "sudo -S -p '' %s" % command 
      feed_password = self.password is not None and len(self.password) > 0 
     stdin, stdout, stderr = self.client.exec_command(command) 
     if feed_password: 
      stdin.write(self.password + "\n") 
      stdin.flush() 
     return {'out': stdout.readlines(), 
       'err': stderr.readlines(), 
       'retval': stdout.channel.recv_exit_status()} 

if __name__ == "__main__": 
    client = SshClient(host='host', port=22, username='username', password='password') 
    try: 
     ret = client.execute('dmesg', sudo=True) 
     print " ".join(ret["out"]), " E ".join(ret["err"]), ret["retval"] 
    finally: 
     client.close() 
-2

vor ssh.connect Sie brauchen:
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())

Dann müssen Sie etwas mit stdout.read() tun wie:

print stdout.read() 
+0

Ich habe das schon. – Kryten

Verwandte Themen