在 Emacs 中打开一个包含 su/sudo 的文件

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

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

但这需要一个昂贵的 通过 SSH 的往返。有没有更直接的方法?

@ JBB 是对的。我希望能够调用 su/sudo保存以及打开。在保存时重新授权是可以的(但不是理想的)。我正在寻找的是变化的 find-filesave-buffer,可以“管道”通过 su/sudo

60352 次浏览

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

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

听起来你想让 Emacs 成为你的窗口管理器。没有它已经够臃肿的了。 :)

Tramp 的优点在于,只有在打开第一个文件时才需要支付到 SSH 的往返费用。然后,Sudo 缓存您的凭据,Emacs 保存一个句柄,这样后续 Sudo 打开的文件花费的时间就少得多。

我也没有找到节省负担所需要的额外时间。我觉得这已经足够快了。

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

Tramp 通过 SSH 实现 没有往返 sudo,它使用的是 子弹。参见说明书: https://www.gnu.org/software/tramp/#Inline-methods

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

至少为了省钱,Sudo-save 软件包就是为这种问题编写的。

这并不是最初问题的答案,但是这里有一个 helper 函数可以让 tramp/sudo 路由更容易一些:

(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)))

我建议你使用通知命令。把这个函数放到你的 ~/. 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))))

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

(仅在本地工作。需要更新,以便通过 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))
))
)
)

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