【问题标题】:paramiko no existing session exceptionparamiko 没有现有的会话异常
【发布时间】:2011-10-13 12:27:53
【问题描述】:

使用在本地运行的 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,并成功连接到另一台服务器。在这里搜索后,我发现的只是提到授权异常,这似乎不是这里的情况。

【问题讨论】:

    标签: python ssh paramiko


    【解决方案1】:

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

    ssh.connect('localhost',username=name,password=pw,allow_agent=False,look_for_keys=False)
    

    【讨论】:

    • 这解决了我使用 Paramiko 2.1.2 和 Python 3.5.2 连接到 Cisco ASA 5515X 的问题。
    • 我已经将这些设置为 false,但这并不能解决我的问题。 Traceback (most recent call last): File "main.py", line 190, in try_creds_and_get_stdout look_for_keys=False, allow_agent=False, auth_timeout=30
    【解决方案2】:

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

    要列出:

    ssh-add -l
    

    全部删除:

    ssh-add -D
    

    重新添加:

    ssh-add /FULL/PATH/TO/id_rsa
    

    【讨论】:

    • ^ 这行得通。不知道为什么这还没有被标记为解决方案。
    【解决方案3】:

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

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

    对于“连接”,它将尝试使用 ssh 代理。 在agent.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
    

    【讨论】:

      【解决方案4】:

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

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

      您可以通过以下方式在 paramiko 上启用调试:

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

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

      【讨论】:

        【解决方案5】:

        在我的情况下,我尝试使用 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()
        

        【讨论】:

          【解决方案6】:

          将“localhost”替换为“127.0.0.1”。

          【讨论】:

          • 我反复尝试了 localhost 和 127.0.0.1 都没有成功
          猜你喜欢
          • 2021-12-12
          • 2021-09-13
          • 2015-10-07
          • 2013-07-13
          • 1970-01-01
          • 2015-02-13
          • 2013-08-17
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多