Откройте файл с помощью su / sudo внутри Emacs
-
01-07-2019 - |
Вопрос
Предположим, я хочу открыть файл в существующем сеансе Emacs, используя su
или sudo
, не опускаясь до оболочки и не выполняя sudoedit
или sudo emacs
.Одним из способов сделать это является
C-x C-f /sudo::/path/to/file
но для этого требуется дорогостоящий поездка туда и обратно через SSH.Есть ли более прямой способ?
[ПРАВИТЬ] @JBB прав.Я хочу иметь возможность вызывать su
/sudo
как сохранять, так и открывать.Было бы нормально (но не идеально) повторно авторизоваться при сохранении.То, что я ищу, - это вариации find-file
и save-buffer
это может быть "передано" по каналу su
/sudo
.
Решение
Самое приятное в Tramp то, что вы платите за этот переход туда и обратно по SSH только при открытии первого файла.Затем Sudo кэширует ваши учетные данные, а Emacs сохраняет дескриптор, так что последующие файлы, открытые sudo, занимают гораздо меньше времени.
Я также не нашел дополнительного времени, необходимого для того, чтобы избежать обременения.Это достаточно быстро, ИМО.
Другие советы
Бродяга делает нет sudo в оба конца через SSH, он использует подоболочка.Смотрите руководство пользователя: https://www.gnu.org/software/tramp/#Inline-methods
Поэтому я рекомендую вам придерживаться TRAMP.
Если вы используете helm
, helm-find-files
поддерживает открытие файла от имени root с помощью C-c r
.
На самом деле это не ответ на исходный вопрос, но вот вспомогательная функция, которая немного упрощает выполнение маршрута 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)))
По крайней мере, для экономии пакет sudo-save был написан именно для такого рода задач.
Ваш пример вообще не запускает ssh, по крайней мере, не с моей версией TRAMP ("2.1.13-pre").Как поиск файла, так и сохранение буфера работают отлично.
Я рекомендую вам использовать рекомендательные команды.Поместите эту функцию в свой ~/.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))))
(работает только локально.Необходимо обновить для корректной работы через 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))
))
)
)
Тьфу.Возможно, вы могли бы открыть оболочку в Emacs и выполнить sudo emacs.
Проблема в том, что вы, по-видимому, не просто хотите открыть файл.Вы хотите иметь возможность сохранить его позже.Таким образом, вам нужно, чтобы ваши привилегии root сохранялись, а не просто существовали для открытия файла.
Похоже, вы хотите, чтобы Emacs стал вашим оконным менеджером.Он и без того достаточно раздутый.:)