Откройте файл с помощью su / sudo внутри Emacs - PullRequest
168 голосов
/ 18 сентября 2008

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

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

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

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

Ответы [ 9 ]

62 голосов
/ 15 января 2010

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

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

62 голосов
/ 19 сентября 2008

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

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

16 голосов
/ 27 июня 2015

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

13 голосов
/ 12 августа 2011

Не совсем ответ на первоначальный вопрос, но вот вспомогательная функция, упрощающая выполнение маршрута 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)))
5 голосов
/ 17 июня 2010

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

4 голосов
/ 19 сентября 2008

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

2 голосов
/ 25 марта 2015

Я рекомендую вам использовать советующие команды. Поместите эту функцию в ваш ~ / .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))))
1 голос
/ 12 апреля 2016

(работает только локально. Требуется обновление для корректной работы через 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))
      ))
    )
)
0 голосов
/ 18 сентября 2008

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

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

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

...