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

174

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

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

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

[РЕДАКТИРОВАТЬ] @JBB правильно. Я хочу иметь возможность вызывать su/ sudoсохранять, а также открывать. Было бы хорошо (но не идеально) повторно авторизоваться при сохранении. То , что я смотрю на это вариация find-fileи save-bufferкоторые могут быть «конвейер» через su/ sudo.

Крис Конвей
источник
5
Я просто хотел отметить, что tramp устанавливается по умолчанию начиная с emacs22, поэтому большинство людей могут без проблем сделать Cc Cf / sudo :: / path-to / file.
Лабиринт
1
Спасибо за sudoeditупоминание. Очень полезно.
Чепанг
6
Cc Cf должен быть Cx Cf?
James.Xu

Ответы:

64

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

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

EfForEffort
источник
3
Подождите секунду ... Как часто истекает срок действия кэша?
Крис Конвей
20
Бродяга не туда-обратно через SSH, он использует подоболочку .
Тедди
Я действительно хотел сказать, что вы платите за первый открытый файл, а не за остальные.
EfForEffort
18

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

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

На самом деле это не ответ на первоначальный вопрос, но вот вспомогательная функция, облегчающая выполнение маршрута tramp / sudo:

(defun sudo-find-file (имя-файла)
  Msgstr "Как найти файл, но открывает файл как root."
  (интерактивное "FSudo Find File:")
  (let ((tramp-file-name (concat "/ sudo ::" (раскрыть-file-name file-name))))
    (найти файл tramp-file-name)))
Бертон Самоград
источник
Я думаю, что в Emacs Starter Kit есть нечто похожее esk-sudo-edit.
mrmagooey
5

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

Франсуа Г
источник
4

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

jfm3
источник
Вы можете кэшировать свои учетные данные. Когда TRAMP запускается впервые, он проходит через 10-15 секунд SSH. (У меня тоже 2.1.13-pre.)
Крис Конвей
Ты уверен? Я имею в виду, что он должен запускать подоболочку, а не сессию SSH на localhost. Занимает около 5 секунд, чтобы в первый раз запустить весь автоматический анализ TRAMP.
jfm3
Ну нет, я не уверен. Я должен сказать, что есть 10-15 секунд материала TRAMP (возможно, SSH). Я не беспокоюсь о SSH как таковом, но о задержке запуска. Как долго этот стартап сохраняется?
Крис Конвей
Первый раз это займет больше секунды. То есть, даже если вы сохраните / sudo :: file, удалите буфер и откроете / sudo :: file2, file2 должен быстро открыться. и Он держит раковину открытой и кеширует результаты всего ее анализа.
jfm3
Но кэшируются ли учетные данные: (1) для этого процесса Emacs или (2) для всех процессов Emacs? И истекают ли они: (а) когда Emacs закрывается, (б) после некоторого фиксированного периода времени (часы? Дни? Недели?), Или (в) после перезагрузки системы?
Крис Конвей
3

Я рекомендую вам использовать советующие команды. Поместите эту функцию в ваш ~ / .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))))
anquegi
источник
Просто чтобы указать на очевидное, это требует, чтобы вы использовали ido-find-fileдля поиска файлов.
tripleee
1

(работает только локально. Нужно обновить для корректной работы через бродягу)

Немного расширил ответ Бертона:

(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))
      ))
    )
)
alex_1948511
источник
0

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

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

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

JBB
источник
11
Ха-ха, ты сказал, раздувать. Раньше Emacs казался огромным. Теперь, по сравнению с отпечатками времени выполнения Java, Ruby и, возможно, кучей других вещей, это выглядит довольно скудно. Несмотря на это, я думаю, что вопрос Криса касается совершенно законного использования Emacs.
jfm3
1
Ты подтолкнул меня на это. Я использую эту модель последовательно. При входе в систему я запускаю один сеанс Emacs для общих вещей, один для доступа SU (как root) и один или более для разработки программного обеспечения (обычно для каждого проекта, но не всегда). Делал это годами. Просто работает.
pajato0
не могли бы вы уточнить, как это сделать: «откройте оболочку в Emacs и exec sudo emacs»
johnbakers
1
@ OpenLearner Серьезно, ты не хочешь этого делать.
tripleee