【问题标题】:Emacs / CVS / OpenSSH: preventing password popupEmacs / CVS / OpenSSH:防止密码弹出
【发布时间】:2011-03-15 19:29:36
【问题描述】:

我在我的 Ubuntu 上网本上以全屏模式使用 GNU Emacs。当我编辑受版本控制的文件并点击 C-x v v 以提交最新更改时,将打开一个 OpenSSH 弹出窗口并询问我的存储库所在服务器的密码。

不幸的是,由于全屏模式,弹出窗口不会出现在前面,我无法输入密码。但它仍然是模态的,所以我也不能回到 emacs,比如说,离开全屏模式(或者做任何其他事情,比如 C-g)。我基本上被困住了。

作为一个 emacs 用户,无论如何我觉得弹出窗口的想法很恶心 ;-) 所以理想情况下,我希望被要求在 minibuffer 中输入 ssh 密码。如何调整我的设置以实现这一目标? (我更喜欢每次都输入密码,而不是将密钥对存储在 ~/.ssh/ 中)。

【问题讨论】:

  • 您添加了赏金,但您从未回应人们第一次提出的任何建议。我们不知道您是否尝试过这些解决方案。
  • @phils:好点(不过我确实评论了一个)。您自己的答案是一个很好的提示,但它并不完全是我问题的答案。我认为 sanityinc 的答案,你也大力评论(谢谢),正朝着正确的方向发展。不过,这不是一个“解决方案”。

标签: emacs popup cvs openssh


【解决方案1】:

您可以在启动emacs(或在另一个shell 中)之前使用ssh-agent

【讨论】:

  • 原始发布者更喜欢输入密码而不是使用基于密钥的身份验证。但是我同意 ssh-agent 和密钥对是更好的解决方案。
【解决方案2】:

我在这里推测,因为我在 Emacs 中既没有使用 CVS 也没有使用 vc,但是我认为 Emacs 正在向适当的程序执行提交,并且密码提示完全是 Emacs 外部的东西。所以我怀疑你想要做的是首先找出在没有 Emacs 的情况下从你的 shell 进行无 GUI 提交需要哪些选项,然后在 Emacs 中修改vc-checkin-switches(或定义vc-cvs-checkin-switches)以匹配(见@987654323 @)。

【讨论】:

    【解决方案3】:

    可能是 ssh-askpass 程序启动了,我认为它会查看 DISPLAY 环境变量来决定如何请求密码。如果设置,它会弹出一个图形窗口,如果没有,它会询问 TTY。

    如果 vcs 子系统检测到何时向用户请求密码(很可能),那么您可以取消设置子进程的 $DISPLAY:

    (setenv "DISPLAY" nil)
    

    不过,这可能会产生其他负面影响,因此请查看“man ssh-askpass”以防万一。

    (免责声明:我个人使用基于 ssh-agent 的解决方案,强烈推荐。)

    【讨论】:

    • 您可以使用建议或挂钩将其仅应用于必要的代码。我看到 vc-before-checkin-hookvc-checkin-hook (之后)已定义,但我猜你需要做的不仅仅是提交?对于(仅)C-x v v 的情况,以下建议将涵盖它:(defadvice vc-next-action (around my-ssh-prompt-fix-for-vc-next-action activate) (let ((backup (getenv "DISPLAY"))) (setenv "DISPLAY" nil) ad-do-it (setenv "DISPLAY" backup)))
    • 如果 cvs 运行的环境确实影响了这一点,那么另一个选择是覆盖 cvs 命令。 vc-cvs-command 将“cvs”硬编码为命令并将其传递给vc-do-command,因此一种选择是为 cvs(在 Emacs 之外)编写一个包装脚本,以在修改后的环境中执行真正的命令。不过,这可能会影响对 cvs 的非 Emacs 调用,因此您可以将包装器命名为“cvs”以外的名称,并为 vc-do-command 创建一些之前的建议,以更改其 command arg 的值以匹配“cvs” .
    • 或者也许只是使用我对vc-do-command 的第一条评论而不是vc-next-action 的建议方法?
    • DISPLAY 全局设置为nil 确实会阻止弹出窗口。但是,现在我还需要一种方法来将 ssh-askpass' 请求密码重定向到 minibuffer。目前,它只是将“Permission denied”打印到*vc* 缓冲区并中止。
    【解决方案4】:

    您可以让 ssh 通过现有连接多路复用到服务器的所有新连接。这意味着只要您打开了一个 ssh 连接(比如在 shell 中),到同一个远程主机的新连接就不会要求输入密码。我用

    Host *
        ControlPath ~/.ssh/master-%r@%h:%p
        ControlMaster auto
        ServerAliveInterval 30
    

    在 ~/.ssh/config 中进行设置。

    【讨论】:

    • 很酷的技术,但不是我在这里寻找的。但还是很高兴知道!
    【解决方案5】:

    在研究我的主要答案(上图)时,我遇到了 psvn 用于 emacs。有关详细信息,请参阅此 SO 问题/答案:SVN for Emacs: how do you set author name and save password?

    我认为您可能也会喜欢了解 psvn,但我认为关于在 SSH 上设置 PreferredAuthentications 值的方法更直接适用于您最初提出的问题。

    【讨论】:

      【解决方案6】:

      尝试以某种方式在您的环境中进行设置:

      export CVS_RSH='ssh -o PreferredAuthentications="password"'
      

      这应该让它停止尝试公钥身份验证,这也将抑制图形 ssh-askpass 的显示。这通过指定 CVS 将用于连接到远程服务器的 SSH 命令来工作。请注意,这将适用于从您设置环境变量的上下文中运行的所有 CVS 命令。

      您可能还想在您的~/.ssh/config 中进行设置。您可以分别为每个主机设置选项。 Here's a page that roughly shows how,尽管用于强制公钥身份验证。请注意,这将影响您用户帐户的所有 SSH 使用,而不仅仅是 CVS。这很可能是您正在寻找的东西,因为您似乎更喜欢避免公钥身份验证。这是您要在~/.ssh/config 中添加的块的示例:

      Host cvs
      
        Hostname cvs.your.corp
        User yourCVSusername
        PreferredAuthentications password
      

      或者,如果您现有的访问方式使用 FQDN 而不仅仅是主机名,您可以将 Host cvs 更改为 Host cvs.your.corp

      最后,您可以仅通过这一行(或将其添加到现有行的顶部)获得您的 ~/.ssh/config 文件:

      PreferredAuthentications password
      

      这将使首选项适用于与远程主机的所有 SSH 连接。

      祝你好运。我希望这能让你摆脱模态对话框的陷阱。

      【讨论】:

      • 谢谢,但我没有使用 SVN。
      • 同样的解决方案适用于 CVS,只需设置 CVS_RSH 环境变量而不是 SVN_SSH 变量。我更新了答案以反映这一点。请注意,修改~/.ssh/config 的第二种解决方案适用于所有使用SSH 的程序,即使它们不支持CVS_RSHSVN_RSH 等环境变量
      • 我还为第二种解决方案添加了示例。
      • @justis:非常感谢您的更新!但是这些解决方案真的对你有用吗?对我来说,第一个解决方案(设置 CVS_RSH)给了我cvs [commit aborted]: cannot exec ssh -o PreferredAuthentications="password": No such file or directory,而第二个解决方案(编辑 ~/.ssh/config)没有效果,弹出窗口仍然出现。
      • 弹出窗口之所以出现是因为您的客户端和远程主机已经确定publickey是你们最喜欢的方法。然后,它发现 SSH_TTY 没有值,而 SSH_ASKPASS 有值,或者默认值存在且可执行。所以,它会在 X11 环境中弹出一个窗口来代替写入一个不存在的终端。
      猜你喜欢
      • 2014-02-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-13
      • 2022-08-24
      • 1970-01-01
      相关资源
      最近更新 更多