2013-01-14 28 views
5

Tôi đã cố gắng để có được điều này để làm việc nhưng tiếp tục nhận được các lỗi tương tự. Tôi đã thử fqdn và ip của máy chủ. Tôi đã cố gắng để vượt qua nó với các thông tin và không có. Tôi đã xem xét các dòng được chỉ ra trong thông báo lỗi. Tìm kiếm google, nhưng không thể tìm ra lý do tại sao điều này không làm việc:SSH - Python với vấn đề 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() 

Lỗi:

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') 
  • Tôi có thể kết nối đến máy chủ mà không có vấn đề thông qua ssh.
  • phiên bản ssh: OpenSSH_5.3p1, OpenSSL 1.0.0-fips 29 Mar 2010
  • Lưu ý: Tôi đang cố gắng tạo một cách để chạy một loạt lệnh trên một số máy chủ từ xa. Tôi đang sử dụng sys import argv để chạy tập lệnh như python audit.py host1 host2 host3 và sau đó tập lệnh sẽ chạy qua kiểm tra cho các máy chủ cụ thể đó. Tôi đã tạo ra một tập lệnh bash hoàn thành điều này nhưng tôi muốn có một cách tốt hơn để thực hiện nó thông qua Python.
+1

Điều này có thể do thiếu từ khóa 'mật khẩu' không? – Tshepang

Trả lời

6

Bạn nên cung cấp hoặc là một mật khẩu hoặc khóa riêng (hoặc cả hai), nếu không ứng dụng khách SSH không biết cách xác thực bằng dữ liệu đăng nhập.

Đây là ví dụ về mã của tôi để bạn tham khảo.

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

trước ssh.connect bạn cần:
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())

Sau đó, bạn cần phải làm điều gì đó với stdout.read() như:

print stdout.read() 
+0

Tôi đã có. – Kryten