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

Предположим, я хочу открыть файл в существующем сеансе 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 устанавливается по умолчанию, начиная с emacs22, поэтому большинство людей могут без проблем выполнить C-c C-f / sudo :: / path-to / file.

labyrinth 29.05.2012 04:37

Спасибо за упоминание sudoedit. Очень полезный.

tshepang 23.07.2013 22:56

C-c C-f должно быть C-x C-f?

James.Xu 26.08.2013 10:49
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
179
3
54 221
9
Перейти к ответу Данный вопрос помечен как решенный

Ответы 9

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

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

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

Ха-ха, ты сказал раздувание. Emacs казался огромным. Теперь, по сравнению с следами времени выполнения Java, Ruby и, вероятно, кучей других вещей, он выглядит довольно скудным. Тем не менее, я думаю, что вопрос Криса касается совершенно законного использования Emacs.

jfm3 20.09.2008 20:52

Ты подтолкнул меня на это. Пользуюсь этой моделью постоянно. При входе в систему я запускаю один сеанс Emacs для общих вещей, один для доступа SU (как root) и один или несколько для разработки программного обеспечения (обычно для каждого проекта, но не всегда). Делал это годами. Просто работает.

pajato0 15.01.2010 21:31

не могли бы вы прояснить, как это сделать: "откройте оболочку в Emacs и выполните sudo emacs"

johnbakers 29.11.2013 12:18

@OpenLearner Серьезно, ты действительно не хочешь этого делать.

tripleee 22.05.2015 21:08
Ответ принят как подходящий

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

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

Подождите секунду ... Как часто истекает срок действия кеша?

Chris Conway 19.09.2008 07:52

Tramp выполняет нет туда и обратно через SSH, он использует подоболочка.

Teddy 09.02.2010 12:19

Я действительно хотел сказать, что вы платите за первый открытый файл, а не за все остальные.

EfForEffort 13.06.2013 19:02

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

Ваши учетные данные могут быть кэшированы. Когда TRAMP впервые запускается, он проходит через 10-15 секунд SSH. (У меня тоже есть 2.1.13-pre.)

Chris Conway 19.09.2008 07:53

Уверены ли вы? Я имею в виду, что он должен запускать подоболочку, но не сеанс SSH с localhost. Для запуска автоматического обнюхивания TRAMP в первый раз требуется около 5 секунд.

jfm3 20.09.2008 02:01

Ну нет, я не уверен. Я должен сказать, что там 10-15 секунд материала TRAMP (возможно, SSH). Меня беспокоит не SSH как таковой, а задержка при запуске. Как долго сохраняется этот стартап?

Chris Conway 20.09.2008 19:28

В первый раз это займет больше секунды. То есть, даже если вы сохраните / sudo :: file, удалите буфер и откроете / sudo :: file2, файл file2 должен открыться быстро. и он держит оболочку открытой и кэширует результаты всех своих проверок.

jfm3 20.09.2008 20:49

Но кэшируются ли учетные данные: (1) для этого процесса Emacs или (2) для всех процессов Emacs? И они истекают: (а) при закрытии Emacs, (б) по истечении определенного периода времени (часы? Дни? Недели?) Или (в) после перезагрузки системы?

Chris Conway 21.09.2008 00:55

Вам всегда может понадобиться только один процесс Emacs. Это в первую очередь смысл использования TRAMP. Учетные данные для аутентификации «кэшируются» таким же образом, как и при запуске sudo или ssh (то есть вообще не кэшируются, либо в ssh-agent).

jfm3 23.09.2008 23:08

Более длительный запуск tramp / ssh может быть вызван тем, что на вашем компьютере отсутствует полное доменное имя iirc.

sjas 25.01.2015 14:22

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

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

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

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

Я думаю, что у Стартовый комплект Emacs есть нечто подобное в esk-sudo-edit.

mrmagooey 29.12.2011 04:48

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

Чтобы указать на очевидное, для этого требуется, чтобы вы использовали ido-find-file для поиска файлов.

tripleee 26.06.2017 10:40

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

Это работает, но кажется постоянным в сеансе, каждый файл впоследствии открывается и сохраняется как root. В документации M-x helm-find-files C-c ? нет ничего, что говорило бы, как вернуться в нормальный режим открытия в качестве пользователя. Повторное выполнение C-c r его не останавливает.

Liam 11.05.2020 16:16

@Liam Я все еще могу открывать файл как обычный пользователь, когда использую эту функцию.

Qudit 12.05.2020 20:56

Это очень странно - некоторые файлы в порядке, некоторые пытается открыть как root. Я убил пароль root с помощью команд emacs и sudo -k, а затем он запрашивает пароль. Я перезапустил Emacs, и это не устранило проблему. Я покопался в .emacs.d и нашел несколько ссылок на tramp, поэтому удалил их. Теперь это кажется лучше, но не уверен, что я свободен от этого.

Liam 13.05.2020 06:18

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

Другие вопросы по теме