Відкрийте файл із su / sudo всередині Emacs


174

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

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

але для цього потрібна дорога поїздка через SSH . Чи є більш прямий шлях?

[EDIT] @JBB має рацію. Я хочу мати можливість викликати su/ sudoзберегти, а також відкрити. Було б добре (але не ідеально) повторно авторизуватися під час збереження. Те , що я дивлюся на це варіація find-fileі save-bufferякі можуть бути «конвеєр» через su/ sudo.


5
Я просто хотів зазначити, що Tramp встановлюється за замовчуванням з emacs22, тому більшість людей можуть просто робити Cc Cf / sudo :: / path-to / file без проблем.
лабіринт

1
Дякую за sudoeditзгадку. Дуже корисний.
thepang

6
Cc Cf має бути Cx Cf?
Джеймс.Xu

Відповіді:


64

Приємна річ у Трампі полягає в тому, що ви платите за ту зворотну поїздку до SSH, коли відкриєте перший файл. Тоді Sudo кешує ваші облікові дані, а Emacs зберігає обробку, щоб наступні відкриті sudo файли займали значно менше часу.

Я не знайшов додаткового часу, необхідного для економії навантаження. Це досить швидко, ІМО.


3
Зачекайте секунду ... Як часто закінчується кеш?
Кріс Конвей,

20
Трамп не об’їжджає через SSH, він використовує передплату .
Тедді

Моя думка справді полягала в тому, що ви платите за перший відкритий файл, а не за будь-який інший.
EfForEffort


18

Якщо ви використовуєте helm, helm-find-filesпідтримує відкриття файлу як root C-c r.


Це працює, але, здається, зберігається в сеансі, кожен файл згодом відкривається і зберігається як root. У документації немає нічого, M-x helm-find-files C-c ?що говорить про те, як повернутися до звичайного режиму відкриття як користувача. Робити C-c rзнову не зупинити.
Ліам

@Liam Я все ще можу відкрити файл як звичайний користувач, коли використовую цю функцію.
Кудит

Це дуже дивно - деякі файли чудово, деякі намагаються відкрити як root. Я вбив корінь паролем за допомогою команд emacs, sudo -kа потім він запросить пароль. Я перезапустив Emacs, і це не усунуло проблему. Я копався .emacs.dі знайшов посилання на бродягу, тому видалив їх. Зараз це здається кращим, але не впевнений, чи не вільний я від цього.
Ліам

15

Насправді не відповідь на початкове запитання, але ось допоміжна функція, щоб зробити маршрут трампа / судо трохи простіше:

(defun sudo-find-file (ім'я файлу)
  Msgstr "Як файл пошуку, але відкриває файл як корінь."
  (інтерактивний "FSudo Find File:")
  (нехай ((tramp-file-name (concat "/ sudo ::" (розгорнути-file-name file-name))))
    (find-file tramp-file-name)))

Я думаю, що в Emacs Starter Kit є щось подібне esk-sudo-edit.
mrmagooey


4

Ваш приклад взагалі не запускає ssh, принаймні, не з моєї версії TRAMP ("2.1.13-до"). І файл пошуку, і буфер збереження чудово працюють.


Можливо, ви кешували свої облікові дані. Коли TRAMP вперше запускається, він проходить через 10-15 секунд SSH. (У мене теж 2.1.13 до попереднього.)
Кріс Конвей,

Ти впевнений? Я маю на увазі, він повинен запускати підзаголовок, але не сеанс SSH для localhost. Займає близько 5 секунд, щоб уперше запустити всі автоматичні нюхи TRAMP.
jfm3

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

Це займе лише більше секунди, коли ви це зробите. Тобто, навіть якщо ви збережете / sudo :: файл, видаліть буфер, а відкрити / sudo :: file2, file2 має відкритись швидко. і він тримає оболонку відкритою та зберігає результати всіх її нюхань.
jfm3

Але чи кешировані облікові дані: (1) для цього процесу Emacs або (2) для всіх процесів Emacs? І чи закінчуються вони: (a) коли Emacs закривається, (b) через певний фіксований проміжок часу (години? Дні? Тижні?), Або (c) після перезавантаження системи?
Кріс Конвей

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))))

Для того, щоб вказати на очевидне, ido-find-fileдля пошуку файлів ви користуєтесь цим.
трійка

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))
      ))
    )
)

0

Тьфу. Можливо, ви могли б відкрити оболонку в Emacs та exec sudo emacs.

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

Здається, ви хочете, щоб Emacs став вашим менеджером вікон. Досить роздуто без цього. :)


11
Ха-ха, ти сказав, цвіте. Емаки здавалися величезними. Зараз, порівняно із слідами часу Java, Ruby та, ймовірно, купою інших речей, це виглядає досить худим. Незважаючи на це, я думаю, що питання Кріса отримує цілком легальне використання Emacs.
jfm3

1
Ти побив мене до цього. Цю модель я використовую послідовно. При вході я запускаю один сеанс Emacs для загальних матеріалів, один для доступу до SU (як root) і один або більше для розробки програмного забезпечення (як правило, за проектом, але не завжди). Робили це роками. Просто працює.
pajato0

Ви можете пояснити, як це зробити: "відкрийте оболонку в Emacs та exec sudo emacs"
johnbakers

1
@OpenLearner Серйозно, ви не дуже хочете цього робити.
трійчатка
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.