Create a gist now

Instantly share code, notes, and snippets.

Toggle between root and non-root users
(defun find-file-as-root ()
"Find a file as root."
(let* ((parsed (when (tramp-tramp-file-p default-directory)
(coerce (tramp-dissect-file-name default-directory)
(if parsed
(apply 'tramp-make-tramp-file-name
(append '("sudo" "root") (cddr parsed)))
(tramp-make-tramp-file-name "sudo" "root" "localhost"
(call-interactively 'find-file)))
(defun toggle-alternate-file-as-root (&optional filename)
"Toggle between the current file as the default user and as root."
(let* ((filename (or filename (buffer-file-name)))
(parsed (when (tramp-tramp-file-p filename)
(coerce (tramp-dissect-file-name filename)
(unless filename
(error "No file in this buffer."))
(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))))))

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


Excellent, thank you.

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