不幸的是,由于全屏模式,弹出窗口不会置于最前面,我无法输入密码。但它仍然以某种方式是模态的,因此我也无法返回emacs,比如退出全屏模式(或做其他任何事情,如C-g)。我基本上被困住了。
作为一个emacs用户,我发现弹出窗口的想法令人讨厌;-) 所以理想情况下,我希望在minibuffer中询问ssh密码。我该如何调整我的设置以使这种情况发生?(我更喜欢每次键入密码而不是存储一个密钥对在~/.ssh/中。)
在启动emacs
之前(或在另一个shell中),您可以使用ssh-agent
。
尝试在您的环境中以某种方式进行设置:
export CVS_RSH='ssh -o PreferredAuthentications="password"'
这样做可以停止尝试公钥身份验证,也会抑制图形ssh-askpass的显示。这是通过指定CVS将用于连接到远程服务器的SSH命令来实现的。请注意,这将适用于在设置环境变量的上下文中运行的所有CVS命令。
您还可以考虑在~/.ssh/config
中进行设置。您可以为每个主机单独设置选项。 这里有一个大致显示如何设置的页面, 尽管是强制使用公钥身份验证。请注意,这将影响您用户帐户的所有SSH使用,而不仅仅是CVS。这可能正是您要寻找的,因为您似乎更喜欢避免公钥身份验证。以下是您将添加到~/.ssh/config
中的示例块:
Host cvs
Hostname cvs.your.corp
User yourCVSusername
PreferredAuthentications password
或者,您可以将Host cvs
更改为Host cvs.your.corp
,如果您现有的访问方式使用FQDN而不仅仅是主机名。
最后,您可以通过这一行来设置您的~/.ssh/config
文件(或将其添加到现有文件的顶部):
PreferredAuthentications password
这将使偏好应用于所有连接到远程主机的SSH连接。
祝你好运。我希望这能让你摆脱模态对话框的困扰。
CVS_RSH
环境变量而不是SVN_SSH
变量即可。我更新了答案以反映这一点。请注意,第二个解决方案,修改~/.ssh/config
文件,将适用于所有使用SSH的程序,即使它们不支持像CVS_RSH
和SVN_RSH
这样的环境变量。 - justispublickey
是您们都最喜欢的方法。然后,它看到SSH_TTY没有值,而SSH_ASKPASS有值或默认值存在且可执行。因此,它会在X11环境中弹出一个窗口,而不是写入不存在的终端。 - justis~/.ssh/config
中设置PubkeyAuthentication no
也可以起作用。 - justis这可能是ssh-askpass程序触发的,我认为它会查看DISPLAY环境变量来决定如何请求密码。如果设置了,它会弹出一个图形窗口,如果没有,则会询问TTY。
如果vcs子系统检测到用户请求密码(很可能),那么您可以为子进程取消设置$DISPLAY:
(setenv "DISPLAY" nil)
这可能会有其他负面影响,因此请查看“man ssh-askpass”,以防那里有任何有用的东西。
(免责声明:我个人使用基于ssh-agent的解决方案,强烈推荐。)
vc-before-checkin-hook
和 vc-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)))
- philsvc-cvs-command
硬编码“cvs”作为命令并将其传递给vc-do-command
,因此一种选择是编写一个包装脚本来执行修改后的真实命令的操作(在Emacs之外)。但这可能会影响非Emacs调用cvs,因此您可以将包装器命名为“cvs”以外的其他名称,并针对vc-do-command
创建一些before advice将其command
参数的值更改为匹配时为“cvs”。 - philsDISPLAY
为 nil
可以防止弹出窗口。但是,现在我还需要一种方法将 ssh-askpass 请求密码重定向到 minibuffer。目前,它只会在 *vc*
缓冲区中打印“权限被拒绝”并中止。 - Thomas你可以让ssh通过现有连接复用所有新的连接到服务器。这意味着只要你已经打开了一个ssh连接(比如在shell中),对于同一远程主机的新连接将不会要求输入密码。我经常使用这种方法。
Host *
ControlPath ~/.ssh/master-%r@%h:%p
ControlMaster auto
ServerAliveInterval 30
在 ~/.ssh/config 中进行设置。
在研究我的主要答案时(如上所述),我发现了适用于emacs的psvn。有关更多详细信息,请参见此SO问题/答案:SVN for Emacs:如何设置作者名称并保存密码?
我认为您可能也会喜欢了解psvn,但我认为关于在SSH上设置PreferredAuthentications值的内容更直接适用于您最初提出的问题。
我在这里推测,因为我既不使用CVS也不使用Emacs中的vc,但是我认为Emacs正在调用适当的程序执行提交,并且密码提示是完全外部于Emacs的。因此,我怀疑您想要做的第一件事是找出从您的shell而不是Emacs进行无GUI提交所需的选项,然后修改vc-checkin-switches
(或定义vc-cvs-checkin-switches
)以匹配(请参见defun vc-switches
)。