43

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

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

我收到来自 Emacs 的消息

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

Emacs 挂起,之后没有响应任何操作

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

4

6 回答 6

69

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

以root身份登录,然后输入

PS1="> "

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

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

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

我的方法:

  1. 确保变量tramp-terminal-type设置为“哑”

M-x customize-variable RET tramp-terminal-type

  1. 在您的 .*shrc 中进行测试并提供正确的提示:
case "$TERM" in
"dumb")
    PS1="> "
    ;;
xterm*|rxvt*|eterm*|screen*)
    PS1="my fancy multi-line \n prompt > "
    ;;
*)
    PS1="> "
    ;;
esac
于 2011-12-02T22:32:29.900 回答
18

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

如果您使用的是 Cygwin,那么您需要使用 'sshx' 方法,并且您可能需要使用 ssh-agent 来处理身份验证。详细信息在这里: 使用 Tramp 与 EmacsW32 和 cygwin,可能吗?

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

如果您使用的是 PuTTY,那么您需要“plink”方法,正如 Alex Ott 指出的那样。如果 Wiki 不够用,在此处搜索可能会找到配置该方法的解决方案。

我可以建议的其他选择是:

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

  2. 在你的 Windows 机器上托管一个 Linux VM,并在其上运行 Emacs。这是一个相当大的障碍,但这是我在 Windows 中工作时使用 Tramp 的首选方式

于 2011-08-05T12:19:24.410 回答
4

嗯,这是流浪汉的缺陷。

.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.

于 2018-08-02T15:23:02.573 回答
3

你检查过Emacs wiki的解决方案吗?sshPATH?还建议plink在 MS Windows 上使用 - 请参阅 Tramp 文档中的“内联方法”部分

于 2011-08-05T10:16:12.737 回答
2

If the problem is your fancy custom prompt in the remote shell, an easy workaround is to add to your .bashrc or equivalent:

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

After you define your PS1.

Note: the credit goes to ChasingLogic as this is their suggestion in this thread.

于 2020-07-09T23:09:19.990 回答
0

顺便说一句——如果你需要tramp——sudo你实际上可以sudo 而不用流浪汉使用sudoedit.

目前我正在使用这个 bash 功能:

erf () { SUDO_EDITOR="emacsclient -a emacs" sudoedit $@; }
于 2012-10-01T14:07:59.893 回答