Откройте файл с 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))
))
)
)