Ö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.


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.


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.


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

Ich denke, das Emacs Starter Kit hat etwas Ähnliches esk-sudo-edit.
Mrmagooey


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.


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

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

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


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


1
@OpenLearner Im Ernst, das willst du eigentlich nicht.
Tripleee
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.