2013-01-14 144 views
5

我一直试图让这个工作,但不断得到相同的错误。我已经尝试了主机的fqdn和ip。我试图通过它凭证和没有。我查看了错误消息中指示的行。谷歌搜索,但想不通这是为什么不工作:SSH - 与paramiko问题的Python

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版本:OpenSSH_5.3p1,OpenSSL的1.0.0-FIPS 2010年03月29
  • 要注意:我试图创建多个远程服务器上运行的一系列命令的方式。我使用sys import argv来运行诸如python audit.py host1 host2 host3这样的脚本,然后该脚本将通过针对这些特定主机的审计。我已经创建了一个完成这个的bash脚本,但是我想通过Python来实现它。
+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.connect:
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())

然后,你需要做stdout.read(东西),如:

print stdout.read() 
+0

我已经有了。 – Kryten