2

我正在使用带有 paramiko 的 python(包装在 pysftp 中),如果在 ssh 期间无法进行身份验证,它似乎会挂起很长时间。我想不出一种为连接设置超时的方法,而且我在很多机器上循环,所以一台可以ping通但不能ssh'able(也无法通过cmdline ssh访问)的机器正在挂起所有东西. 使用这个:

ssh -o ServerAliveInterval=1 -o ServerAliveCountMax=1 <host>

我至少可以让它在 1 秒后出错,而无需等待很长时间让 paramiko 中的身份验证消失并引发异常。但是,我不知道如何将这些 ssh_config 选项传递给 paramiko(或者最好对连接应用超时)。我尝试使用 SSHConfig 模块并读取配置文件,但它似乎没有将数据应用到任何地方,似乎更多地用于主机别名。

任何帮助将不胜感激,多年来一直在寻找信息/帮助。

4

1 回答 1

1

SSHClient.connect()使用指定的套接字超时建立初始连接,然后SFTPClient使用其传输创建一个。

连接成功

>>> import paramiko
>>> client = paramiko.SSHClient()
>>> client.load_system_host_keys()
>>> client.connect(hostname='localhost', port=22, username='user', password='****', timeout=5.0)
>>> sftp = paramiko.SFTPClient.from_transport(client.get_transport())
>>> dirlist = sftp.listdir('.')

连接超时

>>> import paramiko
>>> client = paramiko.SSHClient()
>>> client.load_system_host_keys()
>>> client.connect(hostname='slowhost', username='user', password='****', timeout=1.0)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python2.7/site-packages/paramiko/client.py", line 296, in connect
    sock.connect(addr)
  File "/usr/lib64/python2.7/socket.py", line 222, in meth
    return getattr(self._sock,name)(*args)
socket.timeout: timed out
于 2012-05-28T03:59:05.087 回答