Emacs:Tramp不起作用

时间:2011-08-05 09:52:54

标签: emacs ssh tramp

我尝试通过Tramp通过Emacs打开一个远程文件。

(require 'tramp)
(setq tramp-default-method "ssh")

我收到了来自Emacs的消息

  

Tramp:等待来自远程shell的提示

Emacs挂起并且在此之后没有回应任何动作

Emacs已安装在Windows上;远程文件在Linux机器上。

6 个答案:

答案 0 :(得分:63)

如果您要连接的帐户使用了一些奇怪的花哨shell提示符,那么很可能这就是让流浪汉旅行的原因。

以root用户身份登录,然后输入

PS1="> "

(这是一个普通的标准shell(ZSH,BASH,younameit)提示符,tramp会理解的提示符 然后切换到用户帐户,然后启动emacs -q(以确保您的.emacs不会造成这种混乱)并尝试C-x C-f /sudo:root@localhost:/etc/hosts并查看内容是什么。

您可以(不推荐)自定义定义tramp期望的正则表达式:

M-x customize-variable RET tramp-terminal-prompt-regexp

我的方法:

  1. 确保变量tramp-terminal-type设置为“dumb”
  2. M-x customize-variable RET tramp-terminal-type

    1. 在。* shrc中测试并提供正确的提示:
    2. case "$TERM" in
      "dumb")
          PS1="> "
          ;;
      xterm*|rxvt*|eterm*|screen*)
          PS1="my fancy multi-line \n prompt > "
          ;;
      *)
          PS1="> "
          ;;
      esac
      

答案 1 :(得分:18)

你的Windows ssh客户端是关键,而'ssh'Tramp方法几乎肯定是错误的。

如果你正在使用Cygwin,那么你需要使用'sshx'方法,你可能需要使用ssh-agent来处理身份验证。细节在这里: Using tramp with EmacsW32 and cygwin, possible?

我想这同样适用于任何独立的ssh客户端,它不需要完整的Cygwin安装,但 使用Cygwin DLL。 (我提到这个,因为我很确定我记得看过这样的事情。)

如果您正在使用PuTTY,那么您需要'plink'方法,正如Alex Ott指出的那样。如果Wiki不够,那么search可能会提供配置该方法的解决方案。

我建议的其他替代方案是:

  1. 使用Cygwin原生Emacs。这将比NTEmacs慢,但Tramp似乎与'ssh'方法配合得很好,密码提示也可以。

  2. 在Windows机器上托管Linux VM,然后在其上运行Emacs。这是一个相当大的跳跃,但在Windows中工作时使用Tramp是my preferred way

答案 2 :(得分:3)

您是否检查了Emacs wiki以寻求解决方案? ssh位于PATH?还建议在MS Windows上使用plink - 请参阅Tramp文档中的“内联方法”部分

答案 3 :(得分:1)

嗯,这是流浪汉的缺陷。

真正的解决方案是防止在使用.bashrc时加载tramp。 (因为现在是PS1,但它可能是PATH,或者您的.bashrc所做的任何其他事情都会使tramp变得不愉快。)

这可以通过要求ssh设置环境变量并在.bashrc中对其进行测试来完成:

将此添加到~/.emacs

(require 'tramp-sh nil t) (setf tramp-ssh-controlmaster-options (concat "-o SendEnv TRAMP=yes " tramp-ssh-controlmaster-options))

以及~/.bashrc开头的内容:

if [ ! -z ${TRAMP-x} ] ; then return fi

tramp的另一个默认值是它没有变量将随机参数传递给ssh命令,我们必须搭载tramp-ssh-controlmaster-options

答案 4 :(得分:0)

顺便说一下 - 如果您需要trampsudo - 您实际上可以sudo without tramp使用sudoedit

目前我正在使用此bash功能:

erf () { SUDO_EDITOR="emacsclient -a emacs" sudoedit $@; }

答案 5 :(得分:0)

如果问题是您在远程Shell中出现了自定义提示,那么一个简单的解决方法是将其添加到您的.bashrc或等效项中:

if [[ $TERM == "dumb" ]]; then
    export PS1="$ "
fi

定义PS1后。

注意:功劳归于ChasingLogic,因为这是他们在this thread中的建议。