Откройте файл с su/sudo внутри Emacs

Предположим, я хочу открыть файл в существующем сеансе Emacs, используя su или sudo, не отбрасывая его в оболочку и делая sudoedit или sudo emacs. Один из способов сделать это -

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

но для этого требуется дорогостоящий round-trip через SSH. Есть ли более прямой способ?

[EDIT] @JBB прав. Я хочу иметь возможность запускать su/sudo для сохранения, а также для открытия. Было бы нормально (но не идеально) повторить авторизацию при сохранении. Я ищу варианты find-file и save-buffer, которые могут быть "проложены" через su/sudo.

Ответ 1

Хорошая вещь о Tramp заключается в том, что вы платите только за ту же поездку в SSH, когда открываете первый файл. Затем Sudo кэширует ваши учетные данные, а Emacs сохраняет дескриптор, так что последующие файлы, открытые с sudo, занимают гораздо меньше времени.

Я не нашел дополнительного времени, необходимого для сохранения отягощения. Это достаточно быстро, ИМО.

Ответ 2

Tramp делает не round-trip sudo через SSH, он использует подоболочку. См. Руководство: https://www.gnu.org/software/tramp/#Inline-methods

Поэтому я рекомендую вам придерживаться TRAMP.

Ответ 3

Не совсем ответ на исходный вопрос, но вот вспомогательная функция, которая упрощает выполнение маршрута 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

Если вы используете helm, helm-find-files поддерживает открытие файла с правами root с помощью C-c r.

Ответ 5

Как минимум для сохранения, sudo-save package был написан именно для этой проблемы.

Ответ 6

Ваш пример не запускает ssh вообще, по крайней мере, не с моей версией TRAMP ( "2.1.13-pre" ). Оба файла find-file и save-buffer отлично работают.

Ответ 7

Я рекомендую вам использовать рекомендации. Поместите эту функцию в ~/.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:[email protected]:" buffer-file-name))))

Ответ 8

Тьфу. Возможно, вы можете открыть оболочку в Emacs и exec sudo emacs.

Проблема заключается в том, что вы, по-видимому, не просто хотите открыть файл. Вы хотите сохранить его позже. Таким образом, вам нужны ваши корневые привилегии для сохранения, а не просто для открытия файла.

Похоже, вы хотите, чтобы Emacs стал вашим оконным менеджером. Без этого он раздувался.:)

Ответ 9

(работает только локально. Необходимо обновить, чтобы корректно работать с помощью 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))
      ))
    )
)