Python 2.6 pxssh密码GUI在登录失败时生成

时间:2015-02-23 23:10:43

标签: python linux ssh openssh suse

在我详细介绍之前,我已经尝试过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,如果这很重要)进行复制和粘贴,即使启用了双向剪贴板也是如此

我尝试了以下步骤(其中一些在上面可见):

  1. 设置ssh.force_password=True
  2. 设置ssh.options = {'RequestTTY':'Force'}(如果我了解openSSH文档,这应该相当于在SSH CLI参数中使用“-t”)
  3. 设置auto_prompt_reset=False
  4. 编辑pxssh.py以将“ssh_options”从''设置为'-t -x'(我分别尝试了每个选项,然后两者一起)。
  5. 在运行脚本之前,在shell中手动取消设置SSH_ASKPASS。
  6. 在脚本中调用pxssh之前,立即使用os.unsetenv()取消设置SSH_ASKPASS。
  7. 将“NumberOfPasswordPrompts”选项设置为“1”。
  8. 收到错误密码时观察到的行为是,它会按预期打印“SSH连接失败...”,但它也会弹出openSSH密码窗口。

    这些列出的步骤都没有对脚本的性能产生任何明显的影响,我在此问题上的大多数Google搜索都指向该链接的问题。如果有人知道我怎么可能100%压制密码窗口,我非常感谢你的帮助。

    提前感谢大家的建议。

    潜在解决方案 我发现我可以通过以下步骤阻止窗口弹出:

    1. 在pxssh.py中将ssh_options从''更改为"-o 'NumberOfPasswordPrompts=1'"
    2. 在我的脚本中,抓住pexpect.EOF以及pexpect.pxssh.ExceptionPxssh以确定密码何时失败。
    3. 我还没有接受这个答案,因为对我来说这似乎是一个非常糟糕的解决方案,特别是编辑pxssh.py。我试图在我的脚本中设置NumberOfPasswordPrompts选项,但它没有效果,所以我必须使用不正确的语法。

2 个答案:

答案 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,这样你就不需要对模块进行物理修改。