我正在使用带有paramiko的python(包装在pysftp中),并且似乎存在一个问题,如果它在ssh期间无法进行身份验证,它将挂起很长时间。 我找不到设置连接超时的方法,并且我正在循环浏览许多机器,因此一台可ping但不可ssh的机器(也无法通过cmdline ssh访问)正在挂起所有内容。 使用这个:
ssh -o ServerAliveInterval=1 -o ServerAliveCountMax=1 <host>
我至少可以在 1 秒后让它出错,而无需等待很长时间让 paramiko 中的身份验证消失并引发异常。 但是,我不知道如何将这些ssh_config选项传递给 paramiko(或者更好的是将超时应用于连接)。 我尝试使用 SSHConfig 模块并在配置文件中读取,但它似乎没有将数据应用于任何地方,似乎更多地用于主机别名。
任何帮助将不胜感激,一直在四处寻找信息/帮助数小时。
使用具有指定套接字超时的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