2013-01-14 18 views
5

私はこれを動作させようとしてきましたが、同じエラーが続いています。私はホストのfqdnとipを試しました。私は資格情報と一緒にそれを渡そうとしました。私はエラーメッセージに示されている行を見てきました。グーグルが検索されますが、これが機能しない理由を把握することはできません。SSH - Python with 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() 

エラー:

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') 
  • を私はssh経由で無問題でホストに接続することができています。
  • sshバージョン:OpenSSL 1.0.0-fips 29 2010年3月29日
  • 注:複数のリモートサーバーで一連のコマンドを実行する方法を作成しようとしています。私はpython audit.py host1 host2 host3のようなスクリプトを実行するためにsys import argvを使用しています。そしてスクリプトは特定のホストの監査を実行します。私はすでにこれを達成するためのbashスクリプトを作成しましたが、私はPython経由でより良い方法を望んでいました。あなたが必要とするssh.connect前
+1

これは 'password'キーワードがないためでしょうか? – Tshepang

答えて

6

あなたはパスワードのいずれかを提供しなければならないまたは秘密鍵(またはその両方)。そうしないと、SSHクライアントはログインデータの認証方法を認識しません。

参考のために私のコード例を示します。

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


ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())

次にあなたがstdout.readで何かを(行う必要がある)のような:

print stdout.read() 
+0

私はすでにそれを持っています。 – Kryten