Otwórz plik za pomocą su / sudo wewnątrz Emacsa

174

Załóżmy, że chcę otworzyć plik w istniejącej sesji Emacsa przy użyciu sulub sudo, bez schodzenia do powłoki i wykonywania sudoeditlub sudo emacs. Jednym ze sposobów jest to

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

ale wymaga to kosztownej podróży w obie strony przez SSH . Czy jest bardziej bezpośredni sposób?

[EDYCJA] @JBB ma rację. Chcę mieć możliwość wywoływania su/ sudozapisywania oraz otwierania. Ponowna autoryzacja podczas zapisywania byłaby OK (ale nie idealna). Co szukam to odmiany find-filei save-bufferże może być „wyprowadzony” przez su/ sudo.

Chris Conway
źródło
5
Chciałem tylko zauważyć, że tramp jest instalowany domyślnie od emacs22, więc większość ludzi może bez problemu wykonać Cc Cf / sudo :: / path-to / file.
labirynt
1
Dzięki za sudoeditwzmiankę. Bardzo przydatne.
tshepang
6
Cc Cf powinno być Cx Cf?
James.Xu

Odpowiedzi:

64

Zaletą Tramp jest to, że płacisz za podróż w obie strony do SSH tylko wtedy, gdy otworzysz pierwszy plik. Sudo następnie buforuje twoje poświadczenia, a Emacs zapisuje uchwyt, dzięki czemu kolejne pliki otwierane sudo zajmują znacznie mniej czasu.

Nie znalazłem też dodatkowego czasu, jaki zajmuje oszczędzenie obciążenia. Jest wystarczająco szybki, IMO.

EfForEffort
źródło
3
Zaczekaj chwilę ... Jak często pamięć podręczna wygasa?
Chris Conway,
20
Tramp robi nie podróż w obie strony za pośrednictwem SSH, używa powłoki w tle .
Teddy
Chodziło mi o to, że płacisz koszt za pierwszy otwarty plik, a nie za pozostałe.
EfForEffort
18

Jeśli używasz helm, helm-find-filesobsługuje otwieranie pliku jako root z C-c r.

Qudit
źródło
To działa, ale wydaje się trwać w sesji, każdy plik jest następnie otwierany i zapisywany jako root. W dokumentacji nie ma nic, M-x helm-find-files C-c ?co mówi, jak powrócić do normalnego trybu otwierania jako użytkownik. Powtórzenie C-c rtego nie zatrzymuje.
Liam
@Liam Nadal mogę otwierać plik jako zwykły użytkownik, gdy używam tej funkcji.
Qudit
To bardzo dziwne - niektóre pliki są w porządku, inne próbuje otworzyć się jako root. Zabiłem hasło roota za pomocą poleceń emacsa, sudo -ka następnie pyta o hasło. Zrestartowałem Emacsa i to nie wyeliminowało problemu. Poszperałem .emacs.di znalazłem kilka odniesień do trampa, więc je usunąłem. Teraz wydaje się lepiej, ale nie jestem pewien, czy jestem od tego wolny.
Liam
15

Niezupełnie odpowiedź na pierwotne pytanie, ale oto funkcja pomocnicza, która nieco ułatwia wykonanie trasy tramp / sudo:

(defun sudo-find-file (nazwa-pliku)
  „Podobnie jak znajdź plik, ale otwiera plik jako root”.
  (interaktywne „FSudo Find File:”)
  (let ((nazwa-pliku-trampa (concat "/ sudo ::" (nazwa-pliku-rozszerzenia nazwa-pliku))))
    (znajdź plik tramp-nazwa-pliku)))
Burton Samograd
źródło
Myślę, że zestaw startowy Emacsa ma coś podobnego esk-sudo-edit.
mrmagooey
4

Twój przykład w ogóle nie uruchamia ssh, przynajmniej nie z moją wersją TRAMP („2.1.13-pre”). Zarówno znajdź plik, jak i zapisz bufor działają świetnie.

jfm3
źródło
Możesz mieć swoje poświadczenia w pamięci podręcznej. Kiedy TRAMP uruchamia się po raz pierwszy, przechodzi przez 10-15 sekund SSH. (Mam też 2.1.13-pre.)
Chris Conway,
Jesteś pewny? Chodzi mi o to, że powinien rozpoczynać podpowłokę, ale nie sesję SSH do lokalnego hosta. Uruchomienie całego automatycznego sniffowania TRAMP za pierwszym razem zajmuje około 5 sekund.
jfm3,
Cóż, nie, nie jestem pewien. Powinienem powiedzieć, że jest 10-15 sekund TRAMP (może SSH). Nie martwię się o SSH jako takie, ale o opóźnienie w uruchomieniu. Jak długo trwają te startowe rzeczy?
Chris Conway,
Za pierwszym razem powinno to zająć więcej niż sekundę. Oznacza to, że nawet jeśli zapiszesz / sudo :: file, usuniesz bufor i otworzysz / sudo :: file2, plik2 powinien zostać otwarty szybko. i utrzymuje otwartą muszlę i zapisuje w pamięci wyniki całego jej wąchania.
jfm3,
Ale czy referencje są buforowane: (1) dla tego procesu Emacsa czy (2) dla wszystkich procesów Emacsa? I czy wygasają: (a) po zamknięciu Emacsa, (b) po pewnym ustalonym okresie (godziny? Dni? Tygodnie?) Lub (c) po ponownym uruchomieniu systemu?
Chris Conway,
3

Zalecam używanie poleceń doradczych. Umieść tę funkcję w swoim ~ / .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
źródło
Aby zwrócić uwagę na oczywiste, wymaga to użycia ido-find-filedo wyszukiwania plików.
tripleee
1

(działa tylko lokalnie. Należy zaktualizować, aby działał poprawnie przez tramp)

Trochę rozszerzona odpowiedź Burtona:

(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
źródło
0

Fuj. Być może mógłbyś otworzyć powłokę w Emacsie i wykonać sudo emacs.

Problem polega na tym, że prawdopodobnie nie chcesz po prostu otworzyć pliku. Chcesz mieć możliwość późniejszego zapisania. Dlatego potrzebujesz praw roota, aby przetrwać, a nie tylko istnieć do otwierania pliku.

Wygląda na to, że chcesz, aby Emacs został Twoim menedżerem okien. Bez tego jest wystarczająco nadęty. :)

JBB
źródło
11
Ha ha, powiedziałeś wzdęcia. Emacs wydawał się ogromny. Teraz, w porównaniu do śladów Java, Ruby i prawdopodobnie stosu innych rzeczy, wygląda to dość oszczędnie. Niezależnie od tego, myślę, że pytanie Chrisa dotyczy całkowicie uzasadnionego użycia Emacsa.
jfm3,
1
Pokonałeś mnie. Konsekwentnie używam tego modelu. Podczas logowania uruchamiam jedną sesję Emacsa dla ogólnych rzeczy, jedną dla dostępu SU (jako root) i jedną lub więcej dla tworzenia oprogramowania (ogólnie dla każdego projektu, ale nie zawsze). Robię to od lat. Po prostu działa.
pajato0
czy możesz wyjaśnić, jak to zrobić: „otwórz powłokę w Emacsie i
wykonaj
1
@OpenLearner Poważnie, tak naprawdę nie chcesz tego robić.
tripleee