在Emacs中使用su / sudo打开一个文件

时间:2008-09-18 18:51:47

标签: emacs file-permissions sudo

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

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

但这需要昂贵的round-trip through SSH。有更直接的方式吗?

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

9 个答案:

答案 0 :(得分:62)

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

我还没有找到节省负担所需的额外时间。它足够快,IMO。

答案 1 :(得分:62)

Tramp通过SSH执行往返sudo,它使用子shell 。请参阅手册:https://www.gnu.org/software/tramp/#Inline-methods

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

答案 2 :(得分:16)

如果您使用helm,则helm-find-files支持以C-c r为根打开文件。

答案 3 :(得分:13)

不是原来问题的答案,但是这里有一个辅助函数可以让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)))

答案 4 :(得分:5)

至少在保存时,sudo-save package完全针对这类问题编写。

答案 5 :(得分:4)

你的例子根本没有启动ssh,至少不是我的TRAMP版本(“2.1.13-pre”)。 find-file和save-buffer都很好用。

答案 6 :(得分:2)

我建议你使用建议命令。将此功能放在〜/ .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))))

答案 7 :(得分:1)

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

答案 8 :(得分:0)

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

问题是你可能不只是想打开文件。您希望以后能够保存它。因此,您需要保留root权限,而不仅仅是存在打开文件。

听起来您希望Emacs成为您的窗口管理员。没有那个,它就足够了。 :)