请注意 emacs wiki 上与 cygwin 相关的信息:http://www.emacswiki.org/emacs/TrampMode http://www.emacswiki.org/emacs/TrampMode
我不使用 EmacsW32,但我确实通过 Cygwin 和 NT Emacs 成功使用了 TRAMP over ssh。
我从来没有让 TRAMP 在没有 ssh 代理的情况下工作(即提示输入凭据)——正如您所注意到的,它只是挂起——但它在一个 ssh 代理上工作得很好,所以我没有花时间尝试解决这个问题。假设您也很乐意使用代理(并且您已经生成了密钥并根据需要添加了authorized_keys文件),那么对我有用的方法是:
- 从 cygwin 运行 ssh-agent。
- 通过 cygwin 启动 NT Emacs(以便它继承 ssh-agent 环境变量)。
- 使用“sshx”作为 TRAMP 方法(您可以在每个文件路径中手动指定它,但我建议将其设为默认值,使用
(setq tramp-default-method "sshx")
).
这些要点都在 Wiki 中有所介绍,但您也可以在某种程度上实现自动化:
对于第 1 步,如果 ssh 代理尚未运行,我的 bash 配置文件会自动启动该代理;如果我的身份已过期,则提示我输入密码。 (参见下面的代码。)
对于步骤 2,启动 emacs 的 Windows 快捷方式的目标如下所示:
C:\cygwin\bin\bash.exe --login -c "env HOME=\"`cygpath '%APPDATA%'`\" /cygdrive/c/emacs/emacs-23.1/bin/runemacs.exe"
The --login
参数意味着我的 bash 配置文件已执行,这确保在启动 emacs 之前始终执行第 1 步。
(环境HOME
对于 TRAMP 来说不是必需的,但是%APPDATA%
是 NT Emacs 下的默认设置,这会阻止 Cygwin 主目录优先,因此无论您是否使用此快捷方式运行它,都保持 emacs 配置一致。)
最后,这是我的 cygwin .bash_profile 中管理我的 ssh 代理的代码。这有点老套,但对我有用。
请注意,我的身份会在 4 小时(14400 秒)后过期。发生这种情况后,TRAMP 可能会挂起(如前所述,我从未得到它提示我输入凭据的信息),因此请注意这个问题。类型C-g
阻止它尝试连接。要恢复连接,通常只需启动另一个 cygwin shell,重新输入密码,然后 TRAMP 就会再次正常工作。有时它仍然没有响应,但杀死 *tramp* 缓冲区可以解决这个问题。当然,如果可以接受的话,不使您的身份过期应该可以避免这个问题。
SSH_ENV="${HOME}/.ssh/environment"
# Run ssh-agent, if one is not already running
function start_agent {
echo "Initialising new SSH agent..."
/usr/bin/ssh-agent -t 14400 | sed 's/^echo/#echo/' > "${SSH_ENV}"
echo succeeded
chmod 600 "${SSH_ENV}"
. "${SSH_ENV}" >/dev/null
/usr/bin/ssh-add;
}
# Source SSH settings, if applicable
if [ -f "${SSH_ENV}" ]; then
. "${SSH_ENV}" >/dev/null
#ps ${SSH_AGENT_PID} doesn't work under cywgin
ps -ef | grep ${SSH_AGENT_PID} | grep ssh-agent$ >/dev/null || {
start_agent;
}
#if our ssh-added identity has expired (see -t option to ssh-agent)
#then we need to re-add it
if ! /usr/bin/ssh-add -l >/dev/null; then
/usr/bin/ssh-add;
fi
else
#no ssh-agent running at the moment
start_agent;
fi