Apri un file con su / sudo all'interno di Emacs


174

Supponiamo che io voglia aprire un file in una sessione Emacs esistente usando suo sudo, senza cadere in una shell e facendo sudoedito sudo emacs. Un modo per farlo è

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

ma questo richiede un costoso andata e ritorno attraverso SSH . C'è un modo più diretto?

[EDIT] @JBB ha ragione. Voglio essere in grado di invocare su/ sudosalvare e aprire. Sarebbe OK (ma non ideale) autorizzare nuovamente durante il salvataggio. Quello che sto cercando sono variazioni di find-filee save-bufferche possono essere "convogliate" tramite su/ sudo.


5
Volevo solo notare che il vagabondo viene installato di default da emacs22, quindi la maggior parte delle persone può semplicemente fare il file Cc Cf / sudo :: / path-to / senza problemi.
labirinto

1
Grazie per la sudoeditmenzione. Molto utile.
Tshepang,

6
Cc Cf dovrebbe essere Cx Cf?
James.Xu,

Risposte:


64

La cosa bella di Tramp è che paghi solo per quel viaggio di andata e ritorno a SSH quando apri il primo file. Sudo quindi memorizza nella cache le tue credenziali ed Emacs salva un handle, in modo che i successivi file aperti sudo richiedano molto meno tempo.

Non ho trovato neanche il tempo extra necessario per risparmiare il carico. È abbastanza veloce, IMO.


3
Aspetta un secondo ... Quanto spesso scade la cache?
Chris Conway,

20
Tramp fa Non di andata e ritorno tramite SSH, utilizza una subshell .
Teddy

Il mio punto era davvero che tu pagassi il costo per il primo file aperto e non per nessuno degli altri.
EfForEffort,


18

Se lo usi helm, helm-find-filessupporta l'apertura di un file come root con C-c r.


Funziona, ma sembra essere persistente in una sessione, ogni file successivamente viene aperto e salvato come root. Non c'è nulla nella documentazione M-x helm-find-files C-c ?che indichi come tornare alla normale modalità di apertura come utente. Fare di C-c rnuovo non lo ferma.
Liam,

@Liam Sono ancora in grado di aprire il file come utente normale quando utilizzo quella funzione.
Qudit,

È molto strano - alcuni file vanno bene, altri cerca di aprirsi come root. Ho ucciso la password di root con i comandi di emacs sudo -ke quindi viene richiesta la password. Ho riavviato Emacs e questo non ha eliminato il problema. Ho cercato .emacs.de trovato alcuni riferimenti a vagabondo, quindi li ho cancellati. Ora sembra meglio ma non sono sicuro di esserne libero.
Liam,

15

In realtà non è una risposta alla domanda originale, ma ecco una funzione di aiuto per rendere un po 'più facile fare il percorso del vagabondo / sudo:

(defun sudo-find-file (nome-file)
  "Come trovare il file, ma apre il file come root."
  (interattivo "Trova file di FSudo:")
  (let ((nome-file-tramp (concat "/ sudo ::" (nome-file-nome-file-espanso))))
    (find-file tramp-file-name)))

Penso che l' Emacs Starter Kit abbia qualcosa di simile in esk-sudo-edit.
mrmagooey,


4

Il tuo esempio non avvia affatto ssh, almeno non con la mia versione di TRAMP ("2.1.13-pre"). Sia find-file che save-buffer funzionano alla grande.


È possibile che le credenziali vengano memorizzate nella cache. Quando TRAMP si avvia per la prima volta, passa attraverso 10-15 secondi di roba SSH. (Ho anche 2.1.13-pre.)
Chris Conway,

Sei sicuro? Voglio dire, dovrebbe iniziare una subshell, ma non una sessione SSH su localhost. Impiega circa 5 secondi per eseguire per la prima volta lo sniffaggio automatico di TRAMP.
jfm3,

Bene, no, non ne sono sicuro. Dovrei dire che ci sono 10-15 secondi di roba TRAMP (forse SSH). Non sono preoccupato per SSH di per sé, ma per il ritardo nell'avvio. Quanto dura questa roba di avvio?
Chris Conway,

Dovresti impiegare più di un secondo la prima volta che lo fai. Cioè, anche se si salva / sudo :: file, si elimina il buffer e si apre / sudo :: file2, il file2 dovrebbe aprirsi rapidamente. e mantiene aperto il guscio e memorizza nella cache i risultati di tutto il suo fiuto.
jfm3,

Ma le credenziali sono memorizzate nella cache: (1) per quel processo Emacs o (2) per tutti i processi Emacs? E scadono: (a) alla chiusura di Emacs, (b) dopo un determinato periodo di tempo (ore? Giorni? Settimane?) O (c) dopo il riavvio del sistema?
Chris Conway,

3

Ti consiglio di usare i comandi di consulenza. Inserisci questa funzione nel tuo ~ / .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))))

Solo per sottolineare l'ovvio, questo richiede che tu stia usando ido-find-fileper trovare i file.
Tripleee,

1

(funziona solo localmente. Deve essere aggiornato per funzionare correttamente tramite vagabondo)

Un po 'ampliato la risposta di Burton:

(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

Ugh. Forse potresti aprire una shell in Emacs ed eseguire sudo emacs.

Il problema è che presumibilmente non vuoi solo aprire il file. Vuoi essere in grado di salvarlo in seguito. Pertanto, è necessario che i privilegi di root persistano, non solo per l'apertura del file.

Sembra che tu voglia che Emacs diventi il ​​tuo gestore di finestre. È abbastanza gonfio senza quello. :)


11
Ah ah hai detto gonfio. Emacs sembrava enorme. Ora, rispetto alle impronte di runtime di Java, Ruby e probabilmente un mucchio di altre cose, sembra piuttosto snello. Indipendentemente da ciò, penso che la domanda di Chris arrivi a un uso perfettamente legittimo di Emacs.
jfm3,

1
Mi hai battuto sul tempo. Uso costantemente questo modello. All'accesso avvio una sessione Emacs per roba generale, una per l'accesso SU (come root) e una o più per lo sviluppo software (generalmente per progetto ma non sempre). L'ho fatto per anni. Funziona e basta.
pajato0,

puoi chiarire come fare: "apri una shell in Emacs ed esegui sudo emacs"
johnbakers,

1
@OpenLearner Seriamente, non vuoi davvero farlo.
triplo
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.