2010-07-14 63 views
7

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

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

作为一个emacs用户,我发现弹出窗口令人讨厌的想法;-)所以理想情况下,我希望在minibuffer中提供ssh密码。我如何调整我的设置以实现这一目标? (我更喜欢每次输入密码而不是将密钥对存储在〜/ .ssh /中)。

+0

您已经添加了赏金,但您从未回复过任何人第一次提出的建议。我们不知道你是否尝试过这些解决方案。 – phils 2011-06-12 21:43:36

+0

@phils:好点(虽然我曾对此做过评论)。你自己的回答是一个很好的暗示,但这不完全是我的问题的答案。我认为sanityinc的答案,你也很重视(谢谢),这是正确的方向。但这不是一个“解决方案”。 – Thomas 2011-06-18 13:14:43

回答

7

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

+0

原始海报更喜欢输入密码以使用基于密钥的身份验证。但我同意ssh-agent和密钥对是更好的解决方案。 – stsquad 2010-07-14 12:09:19

1

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

1

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

如果当从用户请求的密码(这是可能的)的VCS子系统检测,那么它可能是你可以为子过程未设置$ DISPLAY:

(setenv "DISPLAY" nil) 

这可能有其他负面的副作用,尽管如此,如果有任何可能的帮助,也请查看“man ssh-askpass”。

+0

您可以使用建议或挂钩将其应用于必需的代码。我看到'vc-before-checkin-hook'和'vc-checkin-hook'(之后)被定义了,但是我猜你需要这么做而不仅仅是提交?对于(完全)'Cx vv'的情况,下面的建议将涵盖: '(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)))' – phils 2010-07-19 09:27:45

+0

如果cvs运行的环境确实会影响到这一点,将会覆盖CVS命令。 'vc-cvs-command'硬编码“cvs”作为命令并将其传递给'vc-do-command',所以一种选择是为cvs编写一个包装脚本(Emacs之外)来执行真实命令在修改后的环境中。这可能会影响到非Emacs对cvs的调用,所以你可以命名包装器而不是“cvs”,并且在vc-do-command之前建立一些命令来改变它的'command' arg的值,使之与它匹配是“cvs”。 – phils 2010-07-19 10:10:03

+0

或者只是使用我的第一个评论'vc-do-command'而不是'vc-next-action'的建议方法? – phils 2010-07-19 10:12:51

1

你可以ssh来复通过现有连接的服务器,所有新的连接(声明我个人使用基于ssh的代理,我强烈建议的解决方案。)。这意味着只要你打开了一个ssh连接(比如说在一个shell中),新的连接到同一个远程主机就不会要求输入密码。我用

Host * 
    ControlPath ~/.ssh/master-%[email protected]%h:%p 
    ControlMaster auto 
    ServerAliveInterval 30 

in〜/ .ssh/config来设置它。

+0

很酷的技术,但不完全是我在这里找的。但还是很高兴知道! – Thomas 2011-06-14 17:48:07

1

尝试在你的环境中莫名其妙地设置这样的:

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

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

您可能还想考虑在您的~/.ssh/config中设置它。您可以分别为每个主机设置选项。 Here's a page that roughly shows how,虽然用于强制publickey认证。请注意,这将影响您的用户帐户的所有SSH使用,而不仅仅是CVS。这可能就是你正在寻找的东西,因为你似乎更喜欢避免使用publickey认证。下面是你在~/.ssh/config添加块的例子:

Host cvs 

    Hostname cvs.your.corp 
    User yourCVSusername 
    PreferredAuthentications password 

或者,你可以改变Host cvsHost cvs.your.corp如果您现有的访问本采用的是FQDN,而不是只是一个主机名的方式。

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

PreferredAuthentications password 

,这将使优先适用于所有的SSH连接到远程主机。

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

+0

谢谢,但我没有使用SVN。 – Thomas 2011-06-18 13:16:30

+0

同样的解决方案适用于CVS,只需设置'CVS_RSH'环境变量而不是'SVN_SSH'变量。我更新了答案以反映这一点。请注意,修改'〜/ .ssh/config'的第二种解决方案对于所有使用SSH的程序都适用,即使它们不支持'CVS_RSH'和'SVN_RSH'等环境变量。 – justis 2011-06-20 00:47:30

+0

我还为第二种方案。 – justis 2011-06-20 00:54:42