Предположим, я хочу открыть файл в существующем сеансе Emacs, используя su или sudo, без перехода к оболочке и выполнения sudoedit или sudo emacs. Один из способов сделать это
C-x C-f /sudo::/path/to/file
но для этого требуется дорогой туда и обратно через SSH. Есть ли более прямой путь?
[РЕДАКТИРОВАТЬ] @JBB прав. Я хочу иметь возможность вызывать su / sudo как для сохранения, так и для открытия. Было бы хорошо (но не идеально) повторно авторизовать при сохранении. Я ищу варианты find-file и save-buffer, которые можно «пропустить» через su / sudo.
Спасибо за упоминание sudoedit. Очень полезный.
C-c C-f должно быть C-x C-f?





Фу. Возможно, вы могли бы открыть оболочку в Emacs и выполнить sudo emacs.
Проблема в том, что вы, вероятно, не просто хотите открыть файл. Вы хотите сохранить его позже. Таким образом, вам нужно, чтобы ваши root-права сохранялись, а не просто существовали для открытия файла.
Похоже, вы хотите, чтобы Emacs стал вашим оконным менеджером. Без этого он достаточно раздут. :)
Ха-ха, ты сказал раздувание. Emacs казался огромным. Теперь, по сравнению с следами времени выполнения Java, Ruby и, вероятно, кучей других вещей, он выглядит довольно скудным. Тем не менее, я думаю, что вопрос Криса касается совершенно законного использования Emacs.
Ты подтолкнул меня на это. Пользуюсь этой моделью постоянно. При входе в систему я запускаю один сеанс Emacs для общих вещей, один для доступа SU (как root) и один или несколько для разработки программного обеспечения (обычно для каждого проекта, но не всегда). Делал это годами. Просто работает.
не могли бы вы прояснить, как это сделать: "откройте оболочку в Emacs и выполните sudo emacs"
@OpenLearner Серьезно, ты действительно не хочешь этого делать.
Хорошая вещь в Tramp заключается в том, что вы платите только за этот возврат к SSH, когда открываете первый файл. Затем Sudo кэширует ваши учетные данные, а Emacs сохраняет дескриптор, так что последующие открываемые sudo файлы занимают гораздо меньше времени.
Я тоже не нашел дополнительного времени, чтобы избавиться от бремени. Это достаточно быстро, ИМО.
Подождите секунду ... Как часто истекает срок действия кеша?
Tramp выполняет нет туда и обратно через SSH, он использует подоболочка.
Я действительно хотел сказать, что вы платите за первый открытый файл, а не за все остальные.
Ваш пример вообще не запускает ssh, по крайней мере, не с моей версией TRAMP ("2.1.13-pre"). И find-file, и save-buffer отлично работают.
Ваши учетные данные могут быть кэшированы. Когда TRAMP впервые запускается, он проходит через 10-15 секунд SSH. (У меня тоже есть 2.1.13-pre.)
Уверены ли вы? Я имею в виду, что он должен запускать подоболочку, но не сеанс SSH с localhost. Для запуска автоматического обнюхивания TRAMP в первый раз требуется около 5 секунд.
Ну нет, я не уверен. Я должен сказать, что там 10-15 секунд материала TRAMP (возможно, SSH). Меня беспокоит не SSH как таковой, а задержка при запуске. Как долго сохраняется этот стартап?
В первый раз это займет больше секунды. То есть, даже если вы сохраните / sudo :: file, удалите буфер и откроете / sudo :: file2, файл file2 должен открыться быстро. и он держит оболочку открытой и кэширует результаты всех своих проверок.
Но кэшируются ли учетные данные: (1) для этого процесса Emacs или (2) для всех процессов Emacs? И они истекают: (а) при закрытии Emacs, (б) по истечении определенного периода времени (часы? Дни? Недели?) Или (в) после перезагрузки системы?
Вам всегда может понадобиться только один процесс Emacs. Это в первую очередь смысл использования TRAMP. Учетные данные для аутентификации «кэшируются» таким же образом, как и при запуске sudo или ssh (то есть вообще не кэшируются, либо в ssh-agent).
Более длительный запуск tramp / ssh может быть вызван тем, что на вашем компьютере отсутствует полное доменное имя iirc.
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.
Я рекомендую вам использовать подсказывающие команды. Поместите эту функцию в свой ~ / .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 для поиска файлов.
Если вы используете helm, helm-find-files поддерживает открытие файла как root с помощью C-c r.
Это работает, но кажется постоянным в сеансе, каждый файл впоследствии открывается и сохраняется как root. В документации M-x helm-find-files C-c ? нет ничего, что говорило бы, как вернуться в нормальный режим открытия в качестве пользователя. Повторное выполнение C-c r его не останавливает.
@Liam Я все еще могу открывать файл как обычный пользователь, когда использую эту функцию.
Это очень странно - некоторые файлы в порядке, некоторые пытается открыть как root. Я убил пароль root с помощью команд emacs и sudo -k, а затем он запрашивает пароль. Я перезапустил Emacs, и это не устранило проблему. Я покопался в .emacs.d и нашел несколько ссылок на tramp, поэтому удалил их. Теперь это кажется лучше, но не уверен, что я свободен от этого.
(работает только локально. Необходимо обновить для корректной работы через 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))
))
)
)
Я просто хотел отметить, что tramp устанавливается по умолчанию, начиная с emacs22, поэтому большинство людей могут без проблем выполнить C-c C-f / sudo :: / path-to / file.