Вопрос

Предположим, я хочу открыть файл в существующем сеансе 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 стал вашим оконным менеджером.Он и без того достаточно раздутый.:)

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top