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.


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.


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.


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

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.


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

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

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


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.