Откройте файл с помощью su / sudo внутри Emacs

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

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

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

[РЕДАКТИРОВАТЬ] @JBB прав. Я хочу иметь возможность вызывать _6 _ / _ 7_ как для сохранения, так и для открытия. Было бы хорошо (но не идеально) повторно авторизовать при сохранении. Я ищу варианты find-file и save-buffer, которые могут быть "пропущены" через _10 _ / _ 11_.


person Chris Conway    schedule 18.09.2008    source источник
comment
Я просто хотел отметить, что tramp устанавливается по умолчанию, начиная с emacs22, поэтому большинство людей могут без проблем выполнить C-c C-f / sudo :: / path-to / file.   -  person labyrinth    schedule 29.05.2012
comment
Спасибо за sudoedit упоминание. Очень полезный.   -  person tshepang    schedule 23.07.2013
comment
C-c C-f должно быть C-x C-f?   -  person James.Xu    schedule 26.08.2013
comment
Где C-x C-f /sudo::/path/to/file задокументировано?   -  person young_souvlaki    schedule 19.04.2021


Ответы (9)


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

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

person EfForEffort    schedule 19.09.2008
comment
Подождите секунду ... Как часто истекает срок действия кеша? - person Chris Conway; 19.09.2008
comment
Tramp не выполняет двусторонний обмен через SSH, он использует подоболочку. - person Teddy; 09.02.2010
comment
Я действительно хотел сказать, что вы платите за первый открытый файл, а не за все остальные. - person EfForEffort; 13.06.2013

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

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

person Teddy    schedule 15.01.2010

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

person Qudit    schedule 27.06.2015
comment
Это работает, но кажется постоянным в сеансе, каждый файл впоследствии открывается и сохраняется как root. В документации M-x helm-find-files C-c ? нет ничего, что говорило бы, как вернуться в нормальный режим открытия в качестве пользователя. Повторное выполнение C-c r его не останавливает. - person Liam; 11.05.2020
comment
@Liam Я все еще могу открывать файл как обычный пользователь, когда использую эту функцию. - person Qudit; 12.05.2020
comment
Это очень странно - некоторые файлы в порядке, некоторые пытается открыть как root. Я убил пароль root с помощью команд emacs и sudo -k, а затем он запрашивает пароль. Я перезапустил Emacs, и это не устранило проблему. Я покопался в .emacs.d и нашел несколько ссылок на tramp, поэтому удалил их. Теперь это кажется лучше, но я не уверен, что я свободен от этого. - person Liam; 13.05.2020

Не совсем ответ на исходный вопрос, но вот вспомогательная функция, которая немного упрощает выполнение маршрута 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)))
person Burton Samograd    schedule 12.08.2011
comment
Я думаю, что в Emacs Starter Kit есть нечто подобное в esk-sudo-edit. - person mrmagooey; 29.12.2011

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

person Francois G    schedule 17.06.2010

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

person jfm3    schedule 19.09.2008
comment
Ваши учетные данные могут быть кэшированы. Когда TRAMP впервые запускается, он проходит через 10-15 секунд SSH. (У меня тоже есть 2.1.13-pre.) - person Chris Conway; 19.09.2008
comment
Вы уверены? Я имею в виду, что он должен запускать подоболочку, но не сеанс SSH с localhost. Для запуска автоматического обнюхивания TRAMP в первый раз требуется около 5 секунд. - person jfm3; 20.09.2008
comment
Нет, я не уверен. Я должен сказать, что там 10-15 секунд материала TRAMP (возможно, SSH). Меня беспокоит не SSH как таковой, а задержка при запуске. Как долго сохраняется этот стартап? - person Chris Conway; 20.09.2008
comment
В первый раз это займет больше секунды. То есть, даже если вы сохраните / sudo :: file, удалите буфер и откроете / sudo :: file2, файл file2 должен открыться быстро. и он держит оболочку открытой и кэширует результаты всех своих проверок. - person jfm3; 20.09.2008
comment
Но кэшируются ли учетные данные: (1) для этого процесса Emacs или (2) для всех процессов Emacs? И истекают ли они: (а) при закрытии Emacs, (б) через некоторый фиксированный период времени (часы? Дни? Недели?) Или (в) после перезагрузки системы? - person Chris Conway; 21.09.2008
comment
Вам всегда может понадобиться только один процесс Emacs. Это в первую очередь смысл использования TRAMP. Учетные данные для аутентификации кэшируются таким же образом, как и при запуске sudo или ssh (то есть не совсем или в ssh-agent). - person jfm3; 23.09.2008
comment
Более длительный запуск tramp / ssh может быть вызван тем, что на вашем компьютере отсутствует полное доменное имя iirc. - person sjas; 25.01.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))))
person anquegi    schedule 25.03.2015
comment
Чтобы указать на очевидное, для этого требуется, чтобы вы использовали ido-find-file для поиска файлов. - person tripleee; 26.06.2017

(работает только локально. Необходимо обновить для корректной работы через 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))
      ))
    )
)
person alex_1948511    schedule 12.04.2016

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

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

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

person JBB    schedule 18.09.2008
comment
Ха-ха, ты сказал раздувание. Раньше Emacs казался огромным. Теперь, по сравнению с следами времени выполнения Java, Ruby и, вероятно, кучей других вещей, он выглядит довольно скудным. Тем не менее, я думаю, что вопрос Криса касается совершенно законного использования Emacs. - person jfm3; 20.09.2008
comment
Ты подтолкнул меня на это. Пользуюсь этой моделью постоянно. При входе в систему я запускаю один сеанс Emacs для общих вещей, один для доступа к SU (как root) и один или несколько для разработки программного обеспечения (обычно для каждого проекта, но не всегда). Делал это годами. Просто работает. - person pajato0; 15.01.2010
comment
не могли бы вы прояснить, как это сделать: откройте оболочку в Emacs и выполните sudo emacs - person johnbakers; 29.11.2013
comment
@OpenLearner Серьезно, ты действительно не хочешь этого делать. - person tripleee; 22.05.2015