我尝试通过Tramp通过Emacs打开一个远程文件。
(require 'tramp)
(setq tramp-default-method "ssh")
我收到了来自Emacs的消息
Tramp:等待来自远程shell的提示
Emacs挂起并且在此之后没有回应任何动作
Emacs已安装在Windows上;远程文件在Linux机器上。
答案 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
我的方法:
tramp-terminal-type
设置为“dumb” M-x customize-variable RET tramp-terminal-type
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可能会提供配置该方法的解决方案。
我建议的其他替代方案是:
使用Cygwin原生Emacs。这将比NTEmacs慢,但Tramp似乎与'ssh'方法配合得很好,密码提示也可以。
在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)
顺便说一下 - 如果您需要tramp
到sudo
- 您实际上可以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中的建议。