Öffnen Sie eine Datei mit su / sudo in Emacs

174

Angenommen, ich möchte eine Datei in einer vorhandenen Emacs-Sitzung mit suoder öffnen sudo, ohne in eine Shell zu wechseln und sudoeditoder auszuführen sudo emacs. Ein Weg, dies zu tun, ist

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

Dies erfordert jedoch eine teure Hin- und Rückfahrt durch SSH . Gibt es einen direkteren Weg?

[EDIT] @JBB ist richtig. Ich möchte in der Lage sein, sowohl aufzurufen su/ sudozu speichern als auch zu öffnen. Es wäre in Ordnung (aber nicht ideal), beim Speichern erneut zu autorisieren. Was ich suche, sind Variationen von find-fileund save-bufferdas kann durch su/ "geleitet" werden sudo.

Chris Conway
quelle
5
Ich wollte nur beachten, dass tramp seit emacs22 standardmäßig installiert ist, sodass die meisten Leute die Cc Cf / sudo :: / path-to / file problemlos ausführen können.
Labyrinth
1
Danke für die sudoeditErwähnung. Sehr hilfreich.
Tshepang
6
Cc Cf sollte Cx Cf sein?
James.Xu

Antworten:

64

Das Schöne an Tramp ist, dass Sie diese Hin- und Rückfahrt zu SSH nur bezahlen, wenn Sie die erste Datei öffnen. Sudo speichert dann Ihre Anmeldeinformationen zwischen und Emacs speichert ein Handle, sodass nachfolgende, von Sudo geöffnete Dateien viel weniger Zeit in Anspruch nehmen.

Ich habe auch nicht die zusätzliche Zeit gefunden, die benötigt wird, um Belastungen zu sparen. Es ist schnell genug, IMO.

EfForEffort
quelle
3
Warten Sie eine Sekunde ... Wie oft läuft der Cache ab?
Chris Conway
20
Tramp fährt nicht über SSH, sondern verwendet eine Unterschale .
Teddy
Mein Punkt war wirklich, dass Sie die Kosten für die erste geöffnete Datei bezahlen und nicht für eine der anderen.
EfForEffort
18

Wenn Sie verwenden helm, helm-find-filesunterstützt das Öffnen einer Datei als root mit C-c r.

Qudit
quelle
Dies funktioniert, scheint jedoch in einer Sitzung dauerhaft zu sein. Anschließend wird jede Datei geöffnet und als Root gespeichert. Die Dokumentation enthält M-x helm-find-files C-c ?keine Informationen darüber, wie Sie als Benutzer zum normalen Öffnungsmodus zurückkehren können. Wiederholen C-c rhört nicht auf.
Liam
@Liam Ich kann die Datei immer noch als normaler Benutzer öffnen, wenn ich diese Funktion verwende.
Qudit
Es ist sehr seltsam - einige Dateien sind in Ordnung, andere versuchen, sie als root zu öffnen. Ich habe das Root-Passwort mit emacs-Befehlen gelöscht sudo -kund dann zur Eingabe des Passworts aufgefordert. Ich habe Emacs neu gestartet und das Problem wurde dadurch nicht behoben. Ich habe mich umgesehen .emacs.dund einige Hinweise auf Tramp gefunden, also habe ich diese gelöscht. Jetzt scheint es besser, aber nicht sicher, ob ich davon frei bin.
Liam
15

Nicht wirklich eine Antwort auf die ursprüngliche Frage, aber hier ist eine Hilfsfunktion, um die Tramp / Sudo-Route ein bisschen einfacher zu machen:

(defun sudo-find-file (Dateiname)
  "Wie Datei suchen, öffnet aber die Datei als root."
  (interaktive "FSudo Find File:")
  (let ((tramp-Dateiname (concat "/ sudo ::" (erweiterungsdateiname Dateiname)))
    (find-file tramp-file-name)))
Burton Samograd
quelle
Ich denke, das Emacs Starter Kit hat etwas Ähnliches esk-sudo-edit.
Mrmagooey
5

Zumindest zum Speichern wurde ein sudo-save-Paket genau für diese Art von Problem geschrieben.

Francois G.
quelle
4

Ihr Beispiel startet ssh überhaupt nicht, zumindest nicht mit meiner Version von TRAMP ("2.1.13-pre"). Sowohl Find-File als auch Save-Buffer funktionieren hervorragend.

jfm3
quelle
Möglicherweise werden Ihre Anmeldeinformationen zwischengespeichert. Wenn TRAMP zum ersten Mal gestartet wird, durchläuft es 10-15 Sekunden SSH-Material. (Ich habe auch 2.1.13-pre.)
Chris Conway
Bist du sicher? Ich meine, es sollte eine Subshell starten, aber keine SSH-Sitzung für localhost. Es dauert ungefähr 5 Sekunden, bis das gesamte TRAMP-Auto-Sniffage beim ersten Mal ausgeführt wird.
jfm3
Nein, ich bin mir nicht sicher. Ich sollte sagen, es gibt 10-15 Sekunden TRAMP (vielleicht SSH) Zeug. Ich mache mir keine Sorgen um SSH an sich, sondern um die Verzögerung beim Start. Wie lange bleibt dieses Startup-Zeug bestehen?
Chris Conway
Es sollte beim ersten Mal nur mehr als eine Sekunde dauern. Das heißt, selbst wenn Sie / sudo :: file speichern, den Puffer löschen und / sudo :: file2 öffnen, sollte file2 schnell geöffnet werden. und es hält die Shell offen und speichert die Ergebnisse all seines Schnüffelns zwischen.
jfm3
Aber werden die Anmeldeinformationen zwischengespeichert: (1) für diesen Emacs-Prozess oder (2) für alle Emacs-Prozesse? Und verfallen sie: (a) wenn Emacs geschlossen wird, (b) nach einem festgelegten Zeitraum (Stunden? Tage? Wochen?) Oder (c) nach einem Systemneustart?
Chris Conway
3

Ich empfehle Ihnen, Beratungsbefehle zu verwenden. Fügen Sie diese Funktion in Ihre ~ / .emacs ein

(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
quelle
Um auf das Offensichtliche hinzuweisen, müssen Sie ido-find-fileDateien suchen.
Tripleee
1

(funktioniert nur lokal. Muss aktualisiert werden, um über Tramp korrekt zu funktionieren)

Ein bisschen erweitert Burtons Antwort:

(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
quelle
0

Pfui. Vielleicht könnten Sie eine Shell in Emacs und Exec Sudo Emacs öffnen.

Das Problem ist, dass Sie vermutlich nicht nur die Datei öffnen möchten. Sie möchten es später speichern können. Daher müssen Ihre Root-Rechte bestehen bleiben und nicht nur zum Öffnen der Datei vorhanden sein.

Klingt so, als ob Sie möchten, dass Emacs Ihr Fenstermanager wird. Ohne das ist es aufgebläht genug. :) :)

JBB
quelle
11
Ha ha du hast aufgebläht gesagt. Emacs schienen früher riesig zu sein. Im Vergleich zu Laufzeit-Footprints von Java, Ruby und wahrscheinlich einem Haufen anderer Dinge sieht es jetzt ziemlich schlank aus. Unabhängig davon denke ich, dass Chris 'Frage zu einer absolut legitimen Verwendung von Emacs führt.
jfm3
1
Du warst schneller als ich. Ich benutze dieses Modell konsequent. Beim Anmelden starte ich eine Emacs-Sitzung für allgemeine Dinge, eine für den SU-Zugriff (als Root) und eine oder mehrere für die Softwareentwicklung (im Allgemeinen pro Projekt, aber nicht immer). Ich mache es schon seit Jahren. Funktioniert einfach.
pajato0
Können
1
@OpenLearner Im Ernst, das willst du eigentlich nicht.
Tripleee