30

使用在本地运行的 python 交互式 shell 和 openssh,我使用 paramiko 不断收到“无现有会话”异常。我的代码如下。

import paramiko
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect('localhost',username=name,password=pw)

结果是:

No handlers could be found for logger "paramiko.transport"
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/lib/python2.6/dist-packages/paramiko-1.7.7.1-py2.6.egg/paramiko/client.py", line 332, in connect
    self._auth(username, password, pkey, key_filenames, allow_agent, look_for_keys)
  File "/usr/local/lib/python2.6/dist-packages/paramiko-1.7.7.1-py2.6.egg/paramiko/client.py", line 493, in _auth
    raise saved_exception
paramiko.SSHException: No existing session

我以前能够连接,但一直在尝试调整它以允许基于密钥的授权。那失败了,从那以后我就无法在本地连接。我尝试重新启动 openssh,并成功连接到另一台服务器。在这里搜索后,我发现的只是提到授权异常,这里似乎不是这种情况。

4

6 回答 6

46

由于您已经有了密码,因此您无需与代理交谈或查找存储在您机器上的私钥。所以尝试传递额外的参数allow_agentlook_for_keys

ssh.connect('localhost',username=name,password=pw,allow_agent=False,look_for_keys=False)
于 2014-03-22T16:55:26.033 回答
12

我的 ssh-add 列表中有一个带有密钥密码短语的备用公钥。删除它后,我就能够正确执行基于 paramiko 的脚本。

列出:

ssh-add -l

全部删除:

ssh-add -D

要重新添加:

ssh-add /FULL/PATH/TO/id_rsa
于 2012-10-04T20:21:23.987 回答
3

https://bugs.launchpad.net/paramiko/+bug/912123

您使用的是哪个操作系统?也许你可以检查你的环境变量:SSH_AUTH_SOCK

对于“连接”,它将尝试使用 ssh 代理。在代理.py

 self.conn = None
 self.keys = ()
 if ('SSH_AUTH_SOCK' in os.environ) and (sys.platform != 'win32'):
     conn = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
     try:
         conn.connect(os.environ['SSH_AUTH_SOCK'])
     except:
     # probably a dangling env var: the ssh agent is gone
         return
         self.conn = conn
 elif sys.platform == 'win32':
     import win_pageant
     if win_pageant.can_talk_to_agent():
         self.conn = win_pageant.PageantConnection()
 else:
     return
于 2012-01-06T08:51:23.483 回答
2

刚刚得到了同样的错误ERROR:SSHException('No existing session',),但由于它在一个干净的 docker 容器中,所以没有 ssh-agent。

经过几个小时的调试,我找到了一个不同的解决方案:在密钥交换过程中超时时可能会发生这种情况!就我而言,ssh 服务器是一个通过 GSM 链路的路由器,速度非常慢。

您可以使用以下命令在 paramiko 上启用调试:

logging.getLogger("paramiko").setLevel(logging.DEBUG)

如果您看到 和 之间的异常ConnectedSwitch to new keys ...则表示超时是在密钥交换期间。在这种情况下,您必须将超时设置为更大的值!(文档说超时只针对TCP连接,但实际上也是针对auth之前的整个协商!)

于 2020-01-29T16:49:15.397 回答
0

就我而言,我尝试使用 allow_agent=False,look_for_keys=False,但不起作用。我 ssh 到 2G 设备,所以 timeout=10 没问题,timeout=3 得到“无法建立 SSH 连接:没有现有会话”。不超时除外。

所以尝试timeout=很长一段时间,如果连接到一个未建立的ssh。

try:
     ssh = paramiko.SSHClient()               
        ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
                             ssh.connect(ip,22,username,passwd,timeout=10,allow_agent=True,look_for_keys=True)                     
                print ('%s\tOK\n'%(ip) )
        except socket.timeout:
                print ("%s time out"%(ip))
        except paramiko.AuthenticationException:
                print("Authentication failed, please verify your credentials: %s"%(ip))
        except paramiko.SSHException as sshException:
                print("Unable to establish SSH connection: %s" %(sshException))
        except paramiko.BadHostKeyException as badHostKeyException:
                print("Unable to verify server's host key: %s" %(badHostKeyException))
        finally:
                ssh.close()
于 2020-12-03T10:31:40.430 回答
-6

将“localhost”替换为“127.0.0.1”。

于 2011-08-08T13:45:45.190 回答