我正在使用pyram和paramiko(包含在pysftp中),如果在ssh期间无法进行身份验证,则会出现长时间挂起的问题。我无法找到一种方法来设置连接的超时,我骑自行车通过许多机器,所以一台可ping的机器,但不是ssh'able(无法通过cmdline ssh到达)是悬挂一切。使用这个:
ssh -o ServerAliveInterval=1 -o ServerAliveCountMax=1 <host>
我至少可以在1秒后将错误输出,而无需等待paramiko中的认证很长时间就会消失并引发异常。但是,我无法弄清楚如何将这些ssh_config选项传递给paramiko(或者更好地将超时应用于连接)。我尝试使用SSHConfig模块并读入配置文件,但它似乎没有在任何地方应用数据,似乎更多地用于主机别名。
任何帮助将不胜感激,一直在寻找信息/帮助很长时间。
答案 0 :(得分: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