【问题标题】:Open a file with su/sudo inside Emacs在 Emacs 中使用 su/sudo 打开一个文件
【发布时间】:2010-09-10 20:55:26
【问题描述】:

假设我想在现有的 Emacs 会话中使用 susudo 打开一个文件,而不是下拉到 shell 并执行 sudoeditsudo emacs。一种方法是

C-x C-f /sudo::/path/to/file

但这需要一个昂贵的round-trip through SSH。有没有更直接的方法?

[编辑] @JBB 是对的。我希望能够调用su/sudo 来保存和打开。保存时重新授权可以(但不理想)。我正在寻找的是find-filesave-buffer 的变体,它们可以通过su/sudo 进行“管道传输”。

【问题讨论】:

  • 我只想指出,自 emacs22 以来,tramp 是默认安装的,所以大多数人可以毫无问题地执行 C-c C-f /sudo::/path-to/file。
  • 感谢sudoedit 提及。非常有用。
  • C-c C-f 应该是 C-x C-f?
  • C-x C-f /sudo::/path/to/file 记录在哪里?
  • Tramp 记录在 Emacs 标准手册中。以C-h i 开始信息,然后以g (tramp)mTRAMP 转到Tramp 顶部信息。转到gQuickstart Start Guide: su, sudo and sg methods,这是 Tramp 手册中的第 3.3 节。

标签: emacs file-permissions sudo


【解决方案1】:

Tramp 的好处在于,您只需在打开第一个文件时为 SSH 往返付费。然后 Sudo 会缓存您的凭据,而 Emacs 会保存一个句柄,以便后续 sudo 打开的文件花费更少的时间。

我也没有发现节省负担所需的额外时间。够快了,IMO。

【讨论】:

  • 等一下...缓存多久过期一次?
  • Tramp 通过 SSH 往返,它使用 subshel​​l
  • 我的意思是,您需要为第一个打开的文件付费,而不是为其他任何文件付费。
【解决方案2】:

Tramp通过 SSH 往返 sudo,它使用 subshel​​l。见手册:https://www.gnu.org/software/tramp/#Inline-methods

因此,我建议你坚持使用 TRAMP。

【讨论】:

    【解决方案3】:

    如果您使用helmhelm-find-files 支持使用C-c r 以root 身份打开文件。

    【讨论】:

    • 这行得通,但它似乎在会话中是持久的,随后打开每个文件并保存为 root。文档M-x helm-find-files C-c ? 中没有任何内容说明如何返回以用户身份打开的正常模式。再次执行C-c r 并不能阻止它。
    • @Liam 当我使用该功能时,我仍然能够以普通用户身份打开文件。
    • 这很奇怪 - 有些文件很好,有些文件试图以 root 身份打开。我用emacs命令和sudo -k杀死了root密码,然后它提示输入密码。我重新启动了 Emacs,但这并没有消除问题。我在.emacs.d 中挖掘并发现了一些对流浪汉的引用,所以我删除了那些。现在似乎好多了,但不确定我是否摆脱了它。
    【解决方案4】:

    并不是对原始问题的真正回答,但这里有一个帮助函数,可以让执行 tramp/sudo 路线更容易一些:

    (defun sudo-find-file (文件名) “类似于查找文件,但以 root 身份打开文件。” (交互式“FSudo 查找文件:”) (let ((tramp-file-name (concat "/sudo::" (expand-file-name file-name)))) (查找文件流浪汉文件名)))

    【讨论】:

    【解决方案5】:

    您的示例根本没有启动 ssh,至少在我的 TRAMP 版本(“2.1.13-pre”)中没有。查找文件和保存缓冲区都很好用。

    【讨论】:

    • 您的凭据可能已被缓存。当 TRAMP 首次启动时,它会经历 10-15 秒的 SSH 内容。 (我也有 2.1.13-pre。)
    • 你确定吗?我的意思是,它应该启动一个子shell,而不是与 localhost 的 SSH 会话。第一次运行所有 TRAMP 自动嗅探大约需要 5 秒。
    • 嗯,不,我不确定。我应该说有 10-15 秒的 TRAMP(可能是 SSH)的东西。我不关心 SSH 本身,而是关心启动的延迟。这种启动的东西会持续多久?
    • 您应该只需要一个 Emacs 进程。这就是首先使用 TRAMP 的意义所在。身份验证凭据以与运行 sudossh 时相同的方式“缓存”(也就是说,根本没有,或者在 ssh-agent 中)。
    • 较长的 tramp / ssh 启动可能是由于您的机器缺少 FQDN iirc。
    【解决方案6】:

    至少为了保存,sudo-save package 就是专门针对这类问题编写的。

    【讨论】:

      【解决方案7】:

      我建议您使用建议命令。把这个函数放在你的 ~/.emacs 中

      (defadvice ido-find-file (after find-file-sudo activate)
        "Find file as root if necessary."
        (unless (and buffer-file-name
                     (file-writable-p buffer-file-name))
          (find-alternate-file (concat "/sudo:root@localhost:" buffer-file-name))))
      

      【讨论】:

      • 明确指出,这要求您使用ido-find-file 来查找文件。
      【解决方案8】:

      (仅在本地工作。需要通过tramp更新才能正常工作)

      稍微扩展一下伯顿的回答:

      (defun sudo-find-file (file-name)
      "Like find file, but opens the file as root."
      (interactive "FSudo Find File: ")
      (let ((tramp-file-name (concat "/sudo::" (expand-file-name file-name))))
      (find-file tramp-file-name)))
      
      
      (add-hook 'dired-mode-hook
          (lambda ()
            ;; open current file as sudo 
            (local-set-key (kbd "C-x <M-S-return>") (lambda()
              (interactive)
              (message "!!! SUDO opening %s" (dired-file-name-at-point))
              (sudo-find-file (dired-file-name-at-point))
            ))
          )
      )
      

      【讨论】:

        【解决方案9】:

        呃。也许你可以在 Emacs 中打开一个 shell 并执行 sudo emacs。

        问题在于您可能不只是想打开文件。您希望以后能够保存它。因此,您需要您的根权限才能持久化,而不仅仅是为了打开文件而存在。

        听起来您希望 Emacs 成为您的窗口管理器。没有那个就够臃肿了。 :)

        【讨论】:

        • 哈哈你说臃肿。 Emacs 曾经看起来很庞大。现在,与 Java、Ruby 以及可能一堆其他东西的运行时足迹相比,它看起来相当精简。无论如何,我认为 Chris 的问题完全符合 Emacs 的使用。
        • 你打败了我。我一直使用这个模型。登录时,我启动一个 Emacs 会话用于一般内容,一个用于 SU 访问(以 root 身份),一个或多个用于软件开发(通常是每个项目,但并非总是如此)。多年来一直这样做。只是工作。
        • 你能澄清一下如何做到这一点:“在 Emacs 中打开一个 shell 并执行 sudo emacs”
        • @OpenLearner 说真的,你真的不想那样做。
        • 这是一个糟糕的建议,当我们有 TRAMP 并且可以像使用 /sudo::/file 一样打开(或写入)文件时没有任何问题。不,它不会启动任何 SSH 会话,除非你告诉 Emacs 该文件应该在远程机器上打开。
        【解决方案10】:

        我发现sudo edit 函数对此非常有用。打开文件后,按s-e 获得 sudo 访问权限以编辑/保存文件。

        【讨论】:

          猜你喜欢
          • 2011-01-11
          • 2013-10-17
          • 1970-01-01
          • 2020-06-17
          • 1970-01-01
          • 1970-01-01
          • 2013-09-21
          • 2014-03-12
          相关资源
          最近更新 更多