使用python交互式shell和本地运行的openssh,我不断使用paramiko获得“No existing session”异常。我的代码如下。
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,并成功连接到另一台服务器。在这里搜索之后,我发现的所有内容都是授权例外情况,这里似乎并非如此。
答案 0 :(得分:29)
由于您已有密码,因此无需与代理商交谈或查找存储在您计算机上的私钥。因此,请尝试传递额外参数allow_agent
,look_for_keys
:
ssh.connect('localhost',username=name,password=pw,allow_agent=False,look_for_keys=False)
答案 1 :(得分:10)
我的ssh-add列表中有一个带有密钥密码的备用公钥。一旦我删除它,我就能够正确执行我的基于paramiko的脚本。
列出:
ssh-add -l
删除全部:
ssh-add -D
重新添加:
ssh-add /FULL/PATH/TO/id_rsa
答案 2 :(得分:2)
https://bugs.launchpad.net/paramiko/+bug/912123
您使用的是哪种操作系统? 也许你可以查看你的env变量: SSH_AUTH_SOCK
对于“connect”,它将尝试使用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
答案 3 :(得分:2)
只是出现了相同的错误ERROR:SSHException('No existing session',)
,但由于它位于干净的Docker容器中,所以没有ssh-agent。
经过几个小时的调试,我发现了一个不同的解决方案:当密钥交换期间超时时,可能会发生这种情况!就我而言,ssh服务器是通过GSM链路的路由器,速度非常慢。
您可以使用以下命令在paramiko上启用调试:
logging.getLogger("paramiko").setLevel(logging.DEBUG)
如果您看到Connected
和Switch to new keys ...
之间的异常,则表示超时是在密钥交换期间。在这种情况下,您必须将 timeout 设置为更大的值! (文档说 timeout 仅用于TCP连接,但实际上,它也用于auth之前的整个协商!)
答案 4 :(得分:0)
在我的情况下,我尝试使用allow_agent = False,look_for_keys = False,但不起作用。 我ssh到2G设备,所以timeout = 10可以,timeout = 3得到“无法建立SSH连接:没有现有的会话”。除了没有超时。
因此,如果连接到未建立的ssh,请尝试timeout =很长时间。
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()
答案 5 :(得分:-2)
将'localhost'替换为'127.0.0.1'。