2013-01-14 20 views
5

Ho cercato di farlo funzionare ma continuo a ottenere gli stessi errori. Ho provato il fqdn e l'ip dell'host. Ho provato a passarlo con credenziali e senza. Ho esaminato le linee indicate nel messaggio di errore. Ricerca Google, ma non riesco a capire il motivo per cui questo non sta funzionando:SSH - Python con problema paramiko

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() 

Errore:

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') 
  • io sono in grado di connettersi all'host senza alcun problema tramite ssh.
  • versione ssh: OpenSSH_5.3p1, OpenSSL 1.0.0-fips 29 mar 2010
  • Nota: sto cercando di creare un modo per eseguire una serie di comandi su diversi server remoti. Sto usando sys import argv per eseguire lo script come python audit.py host1 host2 host3, e quindi lo script verrà eseguito attraverso l'audit per quei particolari host. Ho già creato uno script bash che lo realizza ma volevo un modo migliore di farlo tramite Python.
+1

Potrebbe essere dovuto alla mancata parola chiave 'password'? – Tshepang

risposta

6

È necessario fornire sia una password oppure una chiave privata (o entrambi), altrimenti il ​​client SSH non sa come eseguire l'autenticazione con i dati di accesso.

Ecco il mio esempio di codice come riferimento.

#!/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

prima ssh.connect è necessario:
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())

allora avete bisogno di fare qualcosa con stdout.read() come:

print stdout.read() 
+0

L'ho già. – Kryten

Problemi correlati