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.