2013-01-14 14 views
5

Próbowałem uruchomić to zadanie, ale nadal otrzymuję te same błędy. Próbowałem fqdn i ip hosta. Próbowałem przekazać to poświadczeniami i bez. Przyjrzałem się linijkom wskazanym w komunikacie o błędzie. Szukano google, ale nie mogę zrozumieć, dlaczego to nie działa:SSH - Python z problemem 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() 

Error:

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') 
  • jestem w stanie połączyć się z hostem bez problemu poprzez ssh.
  • Wersja ssh: OpenSSH_5.3p1, OpenSSL 1.0.0-fips 29 Mar 2010
  • Uwaga: próbuję utworzyć sposób uruchamiania serii poleceń na kilku serwerach zdalnych. Używam sys import argv do uruchamiania skryptu, takiego jak python audit.py host1 host2 host3, a następnie skrypt przeprowadzi kontrolę dla tych konkretnych hostów. Stworzyłem już skrypt basha, który to osiąga, ale chciałem mieć lepszy sposób na wykonanie go za pomocą Pythona.
+1

Czy przyczyną może być brak słowa kluczowego "hasło"? – Tshepang

Odpowiedz

6

należy podać albo hasło lub klucz prywatny (lub oba), w przeciwnym razie klient SSH nie wie, jak uwierzytelnić się z danymi logowania.

Oto mój przykład kodu w celach informacyjnych.

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

przed ssh.connect trzeba:
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())

Następnie trzeba coś zrobić z stdout.read() jak:

print stdout.read() 
+0

Już to mam. – Kryten

Powiązane problemy