Reputation: 55979
Suppose I want to open a file in an existing Emacs session using su
or sudo
, without dropping down to a shell and doing sudoedit
or sudo emacs
. One way to do this is
C-x C-f /sudo::/path/to/file
but this requires an expensive round-trip through SSH. Is there a more direct way?
[EDIT] @JBB is right. I want to be able to invoke su
/sudo
to save as well as open. It would be OK (but not ideal) to re-authorize when saving. What I'm looking for is variations of find-file
and save-buffer
that can be "piped" through su
/sudo
.
Upvotes: 192
Views: 70943
Reputation: 3638
Not really an answer to the original question, but here's a helper function to make doing the tramp/sudo route a bit easier:
(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)))
Upvotes: 18
Reputation: 3829
In this blog post Bozhidar Batsov explains three easy methods for opening files with escalated permissions. I think the most elegant one is the following. I just did a minor modification to make it more compatible with Emacs default ecosystem so that it can automatically Vertico and other completion platforms:
(defun er-sudo-edit (&optional arg)
"Edit currently visited file as root.
With a prefix ARG prompt for a file to visit.
Will also prompt for a file to visit if current
buffer is not visiting a file."
(interactive "P")
(if (or arg (not buffer-file-name))
(find-file (concat "/sudo:root@localhost:"
(read-file-name "Find file(as root): ")))
(find-alternate-file (concat "/sudo:root@localhost:" buffer-file-name))))
Upvotes: 0
Reputation: 161
I find sudo edit
function very useful for that. After opening a file, press s-e
to have sudo access to edit/save the file.
Upvotes: 0
Reputation: 7299
(works only locally. Need to be updated to work correctly via tramp)
A little bit extended Burton's answer:
(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))
))
)
)
Upvotes: 1
Reputation: 467
If you use helm
, helm-find-files
supports opening a file as root with C-c r
.
Upvotes: 19
Reputation: 11522
I recommend you to use advising commands. Put this function in your ~/.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))))
Upvotes: 3
Reputation: 6163
Tramp does not round-trip sudo via SSH, it uses a subshell. See the manual: https://www.gnu.org/software/tramp/#Inline-methods
Therefore, I recommend that you stick with TRAMP.
Upvotes: 71
Reputation: 55858
The nice thing about Tramp is that you only pay for that round-trip to SSH when you open the first file. Sudo then caches your credentials, and Emacs saves a handle, so that subsequent sudo-opened files take much less time.
I haven't found the extra time it takes to save burdening, either. It's fast enough, IMO.
Upvotes: 70
Reputation: 11985
At least for saving, a sudo-save package was written exactly for that kind of problem.
Upvotes: 5
Reputation: 37774
Your example doesn't start ssh at all, at least not with my version of TRAMP ("2.1.13-pre"). Both find-file and save-buffer work great.
Upvotes: 5
Reputation: 4841
Ugh. Perhaps you could open a shell in Emacs and exec sudo emacs.
The problem is that you presumably don't just want to open the file. You want to be able to save it later. Thus you need your root privs to persist, not just exist for opening the file.
Sounds like you want Emacs to become your window manager. It's bloated enough without that. :)
Upvotes: 0