【问题标题】:Emacs: Tramp doesn't workEmacs:流浪汉不起作用
【发布时间】:2011-10-20 17:37:31
【问题描述】:

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

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

我从 Emacs 收到一条消息

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

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

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

【问题讨论】:

  • 您在 Windows 机器上使用的是哪个 ssh 客户端?
  • 如果您确实完成了这项工作,请务必发布您的解决方案。作为 Windows 上的长期 Emacs 用户,即使按照各种 wiki 说明进行操作,我也无法让 tramp 可靠地工作。
  • C-g 确实有助于停止挂起的 Emacs。

标签: emacs ssh tramp


【解决方案1】:

如果问题是您在远程 shell 中的自定义提示,一个简单的解决方法是添加到您的 .bashrc 或等效项:

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

在你定义你的PS1之后。

注意:感谢 ChasingLogic,因为这是他们在 this thread 中的建议。

【讨论】:

【解决方案2】:

嗯,这是流浪汉的缺陷。

真正的解决方案是防止在使用tramp 时加载.bashrc。 (因为现在它是 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

【讨论】:

  • 我喜欢这里的解释,但这种方法与最受好评的答案中的方法不相似,除了您发送自定义环境变量而不加载 bash(似乎合理)而答案有shell检查TERM环境变量并在Tramp的情况下加载一个简单的提示(也合理)?只是在尝试一种方法之前检查我的理解。
【解决方案3】:

如果您要连接的帐户使用了一些奇怪的花哨的 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 设置为“哑”

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

【讨论】:

  • 谢谢!这一定是很多人问题的根源,他们只是没有意识到。修复了我认为失败的 Tramp 错误。
  • 值得注意的是,您可以自定义tramp期望的提示(Mx customize-variable "tramp-login-prompt-regexp" 但我的建议是让您的提示tramp兼容(@ 987654321@) 而不是相反
  • 我希望这一切都是自动化的。应为远程主机自动检测提示模式。我们如何实现这一目标?
  • 这对我有用,但使用 C-x C-f /sudo:root@localhost:/etc/hosts 的测试不起作用并返回了关于 sudo can only use the local host 的不同错误(我必须配置多跳或其他东西)。如果您更改了 PS1 变量,我建议直接尝试“我的方法”部分,并将 sudo 配置保存到另一天。
  • 没有人提到我的拦截器:如果 shell 不是交互式的,~/.bashrc 文件会立即返回(默认情况下在 Gentoo 中)。应该删除“return”命令。
【解决方案4】:

顺便说一句——如果你需要trampsudo——你实际上可以使用sudoeditsudo without tramp

目前我正在使用这个 bash 函数:

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

【讨论】:

  • Tramp 的主要用途不是 sudo。
  • 是的——我应该把它作为一个评论,而不是一个答案——但我年轻而愚蠢。
  • @Adobe 您的名字是软件公司名称。只是说
【解决方案5】:

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

如果您使用的是 Cygwin,那么您需要使用 'sshx' 方法,并且您可能需要使用 ssh-agent 来处理身份验证。详情在这里: Using tramp with EmacsW32 and cygwin, possible?

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

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

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

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

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

【讨论】:

    【解决方案6】:

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

    【讨论】:

    • Alex:谢谢,但不幸的是,文档中没有示例。这里是: C-x C-f /plink:user@host:/path/to/file
    猜你喜欢
    • 2016-05-09
    • 1970-01-01
    • 2023-04-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-22
    • 2015-08-25
    • 1970-01-01
    • 2015-12-13
    相关资源
    最近更新 更多