Skip to content

Instantly share code, notes, and snippets.

@ieure
Created January 19, 2011 02:45
  • Star 1 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
Star You must be signed in to star a gist
Save ieure/785600 to your computer and use it in GitHub Desktop.
Toggle between root and non-root users
(defun find-file-as-root ()
"Find a file as root."
(interactive)
(let* ((parsed (when (tramp-tramp-file-p default-directory)
(coerce (tramp-dissect-file-name default-directory)
'list)))
(default-directory
(if parsed
(apply 'tramp-make-tramp-file-name
(append '("sudo" "root") (cddr parsed)))
(tramp-make-tramp-file-name "sudo" "root" "localhost"
default-directory))))
(call-interactively 'find-file)))
(defun toggle-alternate-file-as-root (&optional filename)
"Toggle between the current file as the default user and as root."
(interactive)
(let* ((filename (or filename (buffer-file-name)))
(parsed (when (tramp-tramp-file-p filename)
(coerce (tramp-dissect-file-name filename)
'list))))
(unless filename
(error "No file in this buffer."))
(find-alternate-file
(if (equal '("sudo" "root") (butlast parsed 2))
;; As non-root
(if (or
(string= "localhost" (nth 2 parsed))
(string= (system-name) (nth 2 parsed)))
(car (last parsed))
(apply 'tramp-make-tramp-file-name
(append (list tramp-default-method nil) (cddr parsed))))
;; As root
(if parsed
(apply 'tramp-make-tramp-file-name
(append '("sudo" "root") (cddr parsed)))
(tramp-make-tramp-file-name "sudo" nil nil filename))))))
@haxney
Copy link

haxney commented Jan 26, 2011

I created a fork which makes a round-trip to and from root on "/etc/passwd" work, at leas for me on Emacs 24.0.50.1 on Ubuntu 10.10.

@ieure
Copy link
Author

ieure commented Jan 26, 2011

Excellent, thank you.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment