Otwórz plik przez SSH i Sudo z Emacsem

114

Chcę otworzyć plik wewnątrz Emacsa, który znajduje się na zdalnym serwerze, z uprawnieniami sudo na serwerze. Mogę otwierać pliki lokalne za pomocą sudo przez Tramp w ten sposób:

C-x C-f /sudo::/home/user/file

Ale chcę użyć sudo na serwerze:

C-x C-f /sudo::user@server/home/user/file

Ale to daje mi uprawnienia sudo na moim komputerze lokalnym, prosi o moje hasło sudo na komputerze lokalnym. Czy jest sposób na użycie sudo na serwerze?

BTW: Emacs nie jest zainstalowany na serwerze

Fernando Briano
źródło
nie możesz wydawać poleceń jako root bezpośrednio na serwerze?
Chmouel Boudjnah
2
Mam użytkownika z uprawnieniami sudo, ale nie mam hasła roota.
Fernando Briano

Odpowiedzi:

186

Począwszy od Emacsa 24.3, analoga starej multi:składni została nałożona na nowoczesne tramp-default-proxies-alistpodejście, co oznacza, że ​​możesz ponownie wykonywać wiele przeskoków bez wcześniejszej konfiguracji. Aby uzyskać szczegółowe informacje, zobacz:

C-hig (tramp) Ad-hoc multi-hops RET

W nowej składni każdy „przeskok” jest oddzielony |. Przykład w instrukcji:

C-xC-f /ssh:bird@bastion|ssh:you@remotehost:/path RET

Który łączy się najpierw jako bird@bastion, a stamtąd doyou@remotehost:/path

/ su: lub / sudo: na zdalnych hostach

Możesz również użyć tej składni, aby sudo / su do roota (lub oczywiście dowolnego innego użytkownika) na zdalnym hoście:

C-xC-f /ssh:you@remotehost|sudo:remotehost:/path/to/file RET

Ważne : pamiętaj o jawnym podaniu nazwy hosta: sudo:remotehost:zamiast sudo::(patrz poniżej).

Ponieważ nadal używa mechanizmu proxy poniżej, tramp-default-proxies-alistpowinno teraz zawierać wartość("remotehost" "root" "/ssh:you@remotehost:")

Oznacza to, że serwer proxy /ssh:you@remotehost:będzie używany za każdym razem, gdy zażądasz pliku jako root@remotehost.

root jest domyślnym użytkownikiem dla tych metod, ale możesz oczywiście zmienić na użytkownika innego niż root za pomocą:

C-xC-f /ssh:you@remotehost|sudo:them@remotehost:/path/to/file RET

Zawsze jawnie określ nazwę zdalnego hosta

Prawdopodobnie jesteś przyzwyczajony do używania sudo::lub su::pomijania nazwy hosta. Jeśli przebywasz na hoście lokalnym, to nadal jest w porządku, ale jeśli przeskakujesz do zdalnego serwera, musisz określić nazwę hosta dla każdego przeskoku - nawet jeśli jest taka sama jak dla poprzedniego przeskoku. Zawsze używaj sudo:hostname:lub su:hostname:ze zdalnymi hostami.

Pułapka polega na tym, sudo:: że faktycznie wydaje się działać - jednak gdy to zrobisz, HOST dla wpisu dynamicznego serwera proxy będzie nazwą hosta, z którego pochodzisz, a nie hostem, z którym się łączyłeś. Nie tylko będzie to wyglądało na zagmatwane (ponieważ niewłaściwy host będzie wyświetlany w ścieżkach plików), ale będzie również oznaczać, że każda kolejna próba użycia sudo::na twoim lokalnym hoście będzie zamiast tego przekazywana do zdalnego serwera! (a serwer proxy prawdopodobnie również zostałby zablokowany, gdybyś zrobił to samo na drugim serwerze, powodując dalsze problemy).

Krótko mówiąc, nie używaj ::podczas wykonywania wielu przeskoków!

phils
źródło
4
a teraz dodany również do wikemacs, jak również wikemacs.org/index.php/TRAMP . Dzięki phils, działa świetnie.
Ehvince,
1
Właśnie znalazłem tę odpowiedź i działa świetnie ... poza tym, że mam skróconą nazwę hosta zdefiniowaną w pliku .ssh / config. Kiedy piszę /sudo:hostname:/etc/hosts, otrzymuję to, czego można się spodziewać, ale kiedy piszę /sudo:abbrev:/etc/hosts, otrzymuję komunikat „Skrót hosta wygląda jak host zdalny, sudo może używać tylko hosta lokalnego”. Czy można to naprawić?
rogerl
2
rogerl: Ja też mam .ssh/configwpisy i nie mam żadnych problemów z używaniem /ssh:abbrev|sudo:abbrev:/etc/hostsskrótów moich nazw hostów. Wygląda na to, że nie wskakujesz najpierw do hosta.
phils
@phils Może powinienem opublikować to jako nowe pytanie. Jednak: mój plik konfiguracyjny wygląda jak Host r User rlipsett Hostname odlinux IdentityFile ~ / .ssh / id-rsa.pub i mój tramp-default-proxies-alistwydaje się być poprawny. Jednak zachowanie, które opisałem powyżej, utrzymuje się. Czy mój plik konfiguracyjny jest w jakiś sposób nieprawidłowy?
rogerl
Nadal nie jest dla mnie jasne, czy faktycznie próbujesz użyć tego, /sudo:abbrev:/etc/hostsco umieściłeś w poprzednim komentarzu (co jest błędne, jak wspomniano), czy też używasz poprawnego /ssh:abbrev|sudo:abbrev:/etc/hosts. Twój plik konfiguracyjny ssh jest prawdopodobnie w porządku, ponieważ możesz go użyć w inny sposób.
phils
21

Aktualizacja : Chociaż ta odpowiedź rozwiązała pierwotny problem, została napisana dla emacsa 20 lub 21. W przypadku emacsa 24, polecam użyć odpowiedzi phils, ponieważ oferuje więcej wyjaśnień i jest aktualna.


Myślę, że nazwy plików z wieloma przeskokami w trampie są tym, czego szukasz.

Pierwszy przeskok to ssh, a drugi sudo.


Aktualizacja: Najnowsze wersje emacsa obsługują wiele przeskoków przy użyciu serwerów proxy:

(add-to-list 'tramp-default-proxies-alist ("my-sudo-alias" nil "/ssh:user@ssh-host"))

Następnie wywołaj, otwierając:

/sudo:my-sudo-alias:file-on-ssh-host
Dave Bacher
źródło
Wydaje się, że jest to rozwiązanie, ale otrzymuję: „metoda wielu nie jest już obsługiwana” Czy możesz wskazać zaktualizowaną instrukcję?
Fernando Briano
Mx info, Cs tramp :) Być może będziesz musiał zdefiniować fałszywego hosta jako cel twojego sudo i dodać go do tramp-default-proxy-alist.
Dave Bacher
2
Nie mogłem go uruchomić w mojej konfiguracji (błąd 255?), Ale działa następujący wiersz w .emacs: (set-default 'tramp-default-proxies-alist (quote (("my-sudo-alias" nil " / ssh: user @ ssh-host: "))))
ang. pon
Zaktualizowana odpowiedź nie definiuje „najnowszej”, ma nieprawidłowy elisp i nie działa nawet po poprawieniu. Jestem na stabilnej wersji emacsa wydanej ponad rok po zaktualizowanej odpowiedzi.
Michael Wolf
1
Prawdziwa odpowiedź od roku 2014 / 24,3 jest następująca odpowiedź, używając „doraźne multi-chmiel”
TomRoche
7

Z wybraną odpowiedzią miałem trochę problemów. Jednak zadziałało, gdy dodałem tę linię do .emacs:

(add-to-list 'tramp-default-proxies-alist '(".*" "\\`root\\'" "/ssh:%h:"))

Następnie wykonałem następujące czynności:

/sudo:ssh-host:file-on-ssh-host

Było to trochę zagmatwane, ponieważ w pewnym momencie zostałem poproszony o podanie hasła „root”, ale wprowadzenie hasła mojego użytkownika zapewniło mi dostęp. Działa również powszechnie na wszystkich hostach w sieci. Ponadto nadal mogę to zrobić, aby nie być rootem:

/ssh:ssh-host:file-on-ssh-host

Użytkownik1
źródło
3
To nie działało dla mnie. Wygląda na to, że w Ubuntu, przynajmniej z wersją 23.2.1 Emacsa i wersją 2.1.18-23.2 trampa to nie działa. To jednak działa: info.solomonson.com/content/…
gaizka
(set-default 'tramp-default-proxies-alist (quote ((". *" "\` root \\' "" / ssh:% h: "))))
gaizka
1
Nie mogę uruchomić żadnego z powyższych rozwiązań (dodaj do listy lub ustaw jako domyślne). Pierwsza powoduje, że Emacs dławi się przy starcie, a druga daje mi informację „Host abc.xyz.com' looks like a remote host, sudo” może używać tylko lokalnego hosta, jak tylko wpiszę drugi dwukropek w „/sudo:abc.xyz.com:”. Pomysły? Emacs 23.1.1 na Ubuntu 10.04 LTS.
SabreWolfy,
3

Ze strony internetowej konfiguracji wielu przeskoków trampa

 (add-to-list 'tramp-default-proxies-alist
                   '(nil "\\`root\\'" "/ssh:%h:"))
      (add-to-list 'tramp-default-proxies-alist
                   '((regexp-quote (system-name)) nil nil))

Wtedy dowolny

C-x C-f /sudo:remote-host:/file

otworzy plik za pomocą sudo po zalogowaniu się na tę samą nazwę użytkownika, co użytkownik z emacsem, ale na zdalnym komputerze.

vampolo
źródło
-12

Najpierw musisz ssh na serwer, a potem musisz lokalnie uruchomić emacsa.

Lub możesz użyć NFS z no_root_squash lub możesz spróbować z serwerem / klientem emacsa, chociaż nie mam pojęcia, co może się stać (nie używaj emacsa sam)

Dan Andreatta
źródło
Próbowałem, ale nie mogę uzyskać dostępu do plików jako root z sshfs podczas montowania go jako zwykły użytkownik. Myślę, że to problem z konfiguracją.
Dan Andreatta
Jak zauważył Hassan, no_root_squash należy używać ostrożnie.
Dan Andreatta
6
-1 za brak odpowiedzi na pytanie. -1 za sugerowanie NFS zamiast SSH. -1 za sugerowanie no_root_squash. -1 za zasugerowanie klienta Emacsa, który używa zwykle gniazd domeny Unix, do problemu z komunikacją zdalną. -1 za gadanie o Emacsie bez jego używania.
ceving