在我详细介绍之前,我已经尝试过this question的解决方案但没有成功。
我正在尝试使用pexpect中的pxssh模块来SSH到远程系统并收集正常运行时间数据。但是,每当我输入错误的密码时,脚本都会为openSSH生成GUI密码提示。
该脚本将查询大量系统并将输出写入日志,因此我希望只要SSH连接失败就在日志中写一个注释;我不希望它弹出一个窗口。
以下是该函数的当前代码:
def getUptime(ipAddr, passwd):
try:
os.unsetenv('SSH_ASKPASS')
ssh = px.pxssh.pxssh()
ssh.options={"NumberOfPasswordPrompts":"1"}
ssh.force_password=True
ssh.options = {'RequestTTY':'Force'}
ssh.login(ipAddr,"root",passwd,auto_prompt_reset=False)
ssh.sendline("uptime")
ssh.prompt()
uptime = ssh.before.split()
ssh.logout()
uptime = ' '.join(uptime[uptime.index('up'):]).split(',')[0].strip('up')
return(uptime)
except(px.pxssh.ExceptionPxssh):
return("SSH connection failed; double-check the password")
我很抱歉,如果该代码中存在拼写错误,我必须手动重新输入,因为Virtualbox不允许我从我的开发环境(SLES 11 x64,如果这很重要)进行复制和粘贴,即使启用了双向剪贴板也是如此
我尝试了以下步骤(其中一些在上面可见):
ssh.force_password=True
ssh.options = {'RequestTTY':'Force'}
(如果我了解openSSH文档,这应该相当于在SSH CLI参数中使用“-t”)auto_prompt_reset=False
os.unsetenv()
取消设置SSH_ASKPASS。收到错误密码时观察到的行为是,它会按预期打印“SSH连接失败...”,但它也会弹出openSSH密码窗口。
这些列出的步骤都没有对脚本的性能产生任何明显的影响,我在此问题上的大多数Google搜索都指向该链接的问题。如果有人知道我怎么可能100%压制密码窗口,我非常感谢你的帮助。
提前感谢大家的建议。
潜在解决方案 我发现我可以通过以下步骤阻止窗口弹出:
''
更改为"-o 'NumberOfPasswordPrompts=1'"
pexpect.EOF
以及pexpect.pxssh.ExceptionPxssh
以确定密码何时失败。我还没有接受这个答案,因为对我来说这似乎是一个非常糟糕的解决方案,特别是编辑pxssh.py。我试图在我的脚本中设置NumberOfPasswordPrompts选项,但它没有效果,所以我必须使用不正确的语法。
答案 0 :(得分:1)
您根本不需要更新pxssh.py.代替:
ssh = px.pxssh.pxssh()
ssh.force_password = True
ssh.SSH_OPTS = "-o 'NumberOfPasswordPrompts=1'"
答案 1 :(得分:0)
我很久以前遇到过这个问题,看看这是否有帮助。 Python PXSSH GUI spawn on login failure
如果没有,那么尝试在你的python库中打开pxsssh模块。如果我没记错的话,__init__
中解释了一个问题,你需要做的就是评论一行并取消注释一行。
在pexpect包中有pxssh.py文件,打开它并查看第115
行应该有你的修复。这是你寻找的东西
/usr/lib/python2.7/dist-packages/pexpect/pxssh.py
# Comment this line
self.SSH_OPTS = ("-o'RSAAuthentication=no'"
+ " -o 'PubkeyAuthentication=no'")
# Disabling host key checking, makes you vulnerable to MITM attacks.
# + " -o 'StrictHostKeyChecking=no'"
# + " -o 'UserKnownHostsFile /dev/null' ")
# Disabling X11 forwarding gets rid of the annoying SSH_ASKPASS from
# displaying a GUI password dialog. I have not figured out how to
# disable only SSH_ASKPASS without also disabling X11 forwarding.
# Unsetting SSH_ASKPASS on the remote side doesn't disable it! Annoying!
# UNCOMMENT THE LINE BELOW
#self.SSH_OPTS = "-x -o'RSAAuthentication=no' -o 'PubkeyAuthentication=no'"
self.force_password = False
self.auto_prompt_reset = True
我还没有在很长一段时间内使用过pxssh模块。但我认为你可以找到覆盖SSH_OPTS,这样你就不需要对模块进行物理修改。