Datei über SSH und Sudo mit Emacs öffnen

114

Ich möchte eine Datei in Emacs öffnen, die sich auf einem Remote-Server befindet, mit Sudo-Funktionen auf dem Server. Ich kann lokale Dateien mit sudo über Tramp wie folgt öffnen:

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

Aber ich möchte sudo auf dem Server verwenden:

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

Dies gibt mir jedoch Sudo-Befugnisse auf meinem lokalen Computer. Es fragt nach meinem Sudo-Passwort auf dem lokalen Computer. Gibt es eine Möglichkeit, sudo auf dem Server zu verwenden?

Übrigens: Emacs ist nicht auf dem Server installiert

Fernando Briano
quelle
Kannst du nicht direkt auf dem Server als root befehlen?
Chmouel Boudjnah
2
Ich habe einen Benutzer mit Sudo-Berechtigungen, aber nicht das Root-Passwort.
Fernando Briano

Antworten:

185

Ab Emacs 24.3 wurde ein Analogon der alten multi:Syntax über den modernen tramp-default-proxies-alistAnsatz gelegt, sodass Sie ohne vorherige Konfiguration wieder Multi-Hops ausführen können. Einzelheiten finden Sie unter:

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

Bei der neuen Syntax wird jeder 'Hop' durch getrennt |. Das Beispiel im Handbuch lautet:

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

Welches verbindet sich erstens als bird@bastionund von dort nachyou@remotehost:/path

/ su: oder / sudo: auf Remote-Hosts

Sie können diese Syntax auch verwenden, um sudo / su zu rooten (oder natürlich jeden anderen Benutzer) auf einem Remote-Host:

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

Wichtig : Stellen Sie sicher, dass Sie den Hostnamen explizit angeben: sudo:remotehost:anstatt sudo::(siehe unten).

Da dies immer noch den darunter liegenden Proxy-Mechanismus verwendet, tramp-default-proxies-alistsollte jetzt der Wert enthalten sein("remotehost" "root" "/ssh:you@remotehost:")

Dies bedeutet, dass der Proxy /ssh:you@remotehost:immer dann verwendet wird, wenn Sie eine Datei als anfordern root@remotehost.

root ist der Standardbenutzer für diese Methoden, aber Sie können natürlich auch zu einem Nicht-Root-Benutzer wechseln mit:

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

Geben Sie den Remote-Hostnamen immer explizit an

Sie sind wahrscheinlich daran gewöhnt, den Hostnamen zu verwenden sudo::oder su::wegzulassen. Wenn Sie auf dem lokalen Host bleiben, ist dies immer noch in Ordnung. Wenn Sie jedoch zu einem Remote-Server springen, müssen Sie den Hostnamen für jeden Hop angeben - auch wenn er mit dem vorherigen Hop identisch ist. Verwenden Sie immer sudo:hostname:oder su:hostname:mit Remote-Hosts.

Die Falle hier ist, dass sudo:: sie tatsächlich zu funktionieren scheint. Wenn Sie dies jedoch tun, ist der Host für den dynamischen Proxy-Eintrag der Hostname, von dem Sie stammen, und nicht der Host, mit dem Sie verbunden sind. Dies sieht nicht nur verwirrend aus (da der falsche Host in den Dateipfaden angezeigt wird), sondern bedeutet auch, dass jeder nachfolgende Versuch, ihn sudo::auf Ihrem lokalen Host zu verwenden, stattdessen an den Remote-Server weitergeleitet wird! (und der Proxy wäre vermutlich auch überlastet, wenn Sie dasselbe auf einem zweiten Server tun würden, was weitere Probleme verursachen würde).

Kurz gesagt, nicht verwenden, ::wenn Sie Multi-Hop!

Phils
quelle
4
und jetzt auch zu wikemacs hinzugefügt wikemacs.org/index.php/TRAMP . Danke phils, es funktioniert super.
Ehvince
1
Ich habe diese Antwort gerade gefunden und sie funktioniert hervorragend ... außer dass ich die Kurzname des Hostnamens in einer .ssh / config-Datei definiert habe. Wenn ich tippe /sudo:hostname:/etc/hosts, erhalte ich das, was Sie erwarten würden, aber wenn ich tippe /sudo:abbrev:/etc/hosts, erhalte ich die Meldung "Host abbrev sieht aus wie ein Remote-Host, sudo kann nur den lokalen Host verwenden". Ist das reparabel?
Rogerl
2
rogerl: Ich habe auch .ssh/configEinträge und ich habe keine Probleme damit, /ssh:abbrev|sudo:abbrev:/etc/hostsmeine Hostnamen-Abkürzungen zu verwenden. Es sieht so aus, als würden Sie nicht zuerst zum Host springen.
Phils
@phils Vielleicht sollte ich dies als neue Frage posten. Allerdings: Meine Konfigurationsdatei sieht aus wie Host r Benutzer rlipsett Hostname odlinux IdentityFile ~ / .ssh / id-rsa.pub und meine tramp-default-proxies-alistscheint korrekt zu sein. Das oben beschriebene Verhalten bleibt jedoch bestehen. Ist meine Konfigurationsdatei irgendwie falsch?
Rogerl
Mir ist immer noch nicht klar, ob Sie tatsächlich versuchen, es zu verwenden, /sudo:abbrev:/etc/hostswie Sie es in Ihrem vorherigen Kommentar eingegeben haben (was, wie erwähnt, falsch ist), oder ob Sie das Richtige verwenden /ssh:abbrev|sudo:abbrev:/etc/hosts. Ihre ssh-Konfigurationsdatei ist vermutlich in Ordnung, da Sie sie offensichtlich anderweitig verwenden können.
Phils
21

Update : Obwohl diese Antwort das ursprüngliche Problem gelöst hat, wurde sie für Emacs 20 oder 21 geschrieben. Für Emacs 24 empfehle ich die Antwort von Phils, da sie mehr Erklärungen bietet und auf dem neuesten Stand ist.


Ich denke, Multi-Hop-Dateinamen in Tramp sind das, wonach Sie suchen.

Der erste Sprung wäre ssh und der zweite wäre sudo.


Update: Neuere Versionen von Emacs unterstützen mehrere Hops mithilfe von Proxys:

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

Rufen Sie dann durch Öffnen auf:

/sudo:my-sudo-alias:file-on-ssh-host
Dave Bacher
quelle
Dies scheint die Lösung zu sein, aber ich bekomme: "Multi-Methode wird nicht mehr unterstützt" Können Sie mich auf ein aktualisiertes Handbuch verweisen?
Fernando Briano
Mx info, Cs tramp :) Möglicherweise müssen Sie einen gefälschten Host als Ziel Ihres sudo definieren und ihn zu tramp-default-proxy-alist hinzufügen.
Dave Bacher
2
Ich konnte es in meiner Konfiguration nicht zum Laufen bringen (Fehler 255?), Aber die folgende Zeile in .emacs funktioniert: (set-default 'tramp-default-proxies-alist (quote (("my-sudo-alias" nil ")) / ssh: user @ ssh-host: "))))
ang mo
Die aktualisierte Antwort definiert nicht "aktuell", hat ein ungültiges Elisp und funktioniert auch dann nicht, wenn Sie es korrigieren. Ich bin auf einer stabilen Version von Emacs, die über ein Jahr nach der aktualisierten Antwort veröffentlicht wurde.
Michael Wolf
1
Die eigentliche Antwort ab 2014 / 24.3 ist die folgende Antwort unter Verwendung von "Ad-hoc-Multi-Hops"
TomRoche
7

Ich hatte einige Probleme mit der ausgewählten Antwort. Es hat jedoch funktioniert, als ich diese Zeile zu .emacs hinzugefügt habe:

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

Und dann folgendes ausgeführt:

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

Es war etwas verwirrend, weil ich irgendwann zur Eingabe des "root" -Kennworts aufgefordert wurde, aber die Eingabe des Kennworts meines Benutzers mir Zugriff gewährte. Es funktioniert auch universell auf allen Hosts im Netzwerk. Außerdem kann ich das immer noch tun, um nicht root zu sein:

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

Benutzer1
quelle
3
Das hat bei mir nicht funktioniert. Es sieht so aus, als ob dies in Ubuntu zumindest mit Version 23.2.1 von Emacs und Version 2.1.18-23.2 von tramp nicht funktioniert. Dies funktioniert jedoch: info.solomonson.com/content/…
gaizka
(set-default 'tramp-default-proxies-alist (quote ((". *" "\` root \\ "" / ssh:% h: ")))
gaizka
1
Ich bin nicht in der Lage, eine der oben genannten Lösungen zum Laufen zu bringen (Add-to-List oder Set-Default). Der erste führt dazu, dass Emacs beim Start erstickt, und der zweite gibt mir "Host abc.xyz.com' looks like a remote host, sudo 'kann nur den lokalen Host verwenden", sobald ich den zweiten Doppelpunkt in "/sudo:abc.xyz.com:" eingebe. Ideen? Emacs 23.1.1 unter Ubuntu 10.04 LTS.
SabreWolfy
3

Von der Tramp Multi-Hops-Konfigurationswebseite

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

Dann keine

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

öffnet die Datei mit sudo, nachdem sie mit demselben Benutzernamen des Benutzers angemeldet wurde, der emacs ausführt, jedoch auf dem Remotecomputer.

Vampolo
quelle
-12

Sie müssen zuerst ssh in den Server, dann müssen Sie Emacs lokal ausführen.

Oder Sie können NFS mit no_root_squash verwenden oder es mit emacs Server / Client versuchen, obwohl ich keine Ahnung habe, was passieren kann (verwenden Sie emacs nicht selbst).

Dan Andreatta
quelle
Ich habe es versucht, aber ich kann mit sshfs nicht auf Dateien als root zugreifen, wenn ich sie als regulären Benutzer einbinde. Ich denke, es ist ein Setup-Problem.
Dan Andreatta
Wie Hassan bemerkte, sollte no_root_squash mit Vorsicht verwendet werden.
Dan Andreatta
6
-1 für die Nichtbeantwortung der Frage. -1 für den Vorschlag von NFS anstelle von SSH. -1 für den Vorschlag von no_root_squash. -1 für den Vorschlag eines Emacs-Clients, der normalerweise Unix-Domänensockets verwendet, für ein Remotekommunikationsproblem. -1 für das Blethering über Emacs, ohne es zu benutzen.
Ceving