0

我有以下有效的调用(实际上引发了 a paramiko.AuthenticationException,这很好):

import paramiko
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect('example.com',username='root', password="aaa", look_for_keys=False, timeout=5)

我想将参数转换为字典:

params = {
    'hostname': 'example.com',
    'port': 22,
    'username': 'root',
    'look_for_keys': False,
    'timeout': 5
    }
ssh.connect(params)

这引发了一个TypeError: getaddrinfo() argument 1 must be string or None. 我检查了参数ssh.connect

>>> inspect.getargspec(ssh.connect)
ArgSpec(args=['self', 'hostname', 'port', 'username', 'password', 'pkey', 'key_filename', 'timeout', 'allow_agent', 'look_for_keys', 'compress', 'sock'], varargs=None, keywords=None, defaults=(22, None, None, None, None, None, True, True, False, None))

我的听写对我来说看起来不错。

尽管如此,由于第一次调用很好并且错误与套接字有关,我尝试过

ssh.connect('example.com', 22, params)

这引起了paramiko.SSHException: No authentication methods available. 我将此解释为connect没有任何密码或密钥可供测试。

我应该怎么做才能ssh.connect接受 dict 作为参数(或者实际上 - dict 与我的相比应该有多大不同)?

还是有另一种传递参数的pythonic方法,没有“手动”构建参数字符串(通过连接字符串,这对我来说看起来很糟糕)?

4

1 回答 1

0

字典可以被“解包”并被使用,就好像关键字参数已通过**在函数调用中显式声明一样,例如:

ssh.connect('example.com', 22, **params)

您只需要注意位置参数在 中得到满足而不是重复dict,例如:普通函数调用的规则......

于 2013-10-31T12:51:16.090 回答