Abra un archivo con su / sudo dentro de Emacs


174

Supongamos que quiero abrir un archivo en una sesión de Emacs existente usando suo sudo, sin desplegarme a un shell y haciendo sudoedito sudo emacs. Una forma de hacer esto es

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

pero esto requiere un costoso viaje de ida y vuelta a través de SSH . ¿Hay una forma más directa?

[EDITAR] @JBB tiene razón. Quiero poder invocar su/ sudoguardar, así como abrir. Estaría bien (pero no es ideal) volver a autorizar al guardar. Lo que estoy buscando es variaciones de find-filey save-bufferque se pueden "canalizar" a través de su/ sudo.


55
Solo quería señalar que tramp viene instalado de forma predeterminada desde emacs22, por lo que la mayoría de las personas pueden hacer el archivo Cc Cf / sudo :: / path-to / file sin problema.
laberinto

1
Gracias por la sudoeditmención Muy útil.
tshepang

66
Cc Cf debería ser Cx Cf?
James.Xu

Respuestas:


64

Lo bueno de Tramp es que solo paga ese viaje de ida y vuelta a SSH cuando abre el primer archivo. Luego, Sudo almacena en caché sus credenciales, y Emacs guarda un identificador, de modo que los archivos subsiguientes abiertos con sudo tardan mucho menos tiempo.

Tampoco he encontrado el tiempo extra que lleva ahorrar cargas. Es lo suficientemente rápido, en mi opinión.


3
Espera un segundo ... ¿Con qué frecuencia caduca el caché?
Chris Conway

20
Vagabundo hace no de ida y vuelta a través de SSH, utiliza un subnivel .
Teddy

Mi punto fue realmente que pagas el costo por el primer archivo abierto, y no por ninguno de los otros.
EfForEffort


18

Si lo usa helm, helm-find-filesadmite abrir un archivo como root con C-c r.


Esto funciona, pero parece ser persistente en una sesión, cada archivo posteriormente se abre y se guarda como root. No hay nada en la documentación M-x helm-find-files C-c ?que indique cómo volver al modo normal de apertura como usuario. Hacerlo de C-c rnuevo no lo detiene.
Liam

@Liam Todavía puedo abrir el archivo como usuario normal cuando uso esa función.
Qudit

Es muy extraño: algunos archivos están bien, algunos intentan abrirse como root. Eliminé la contraseña de root con los comandos de emacs sudo -ky luego me pide la contraseña. Reinicié Emacs y eso no eliminó el problema. Busqué .emacs.dy encontré algunas referencias a vagabundo, así que las eliminé. Ahora parece mejor pero no estoy seguro si estoy libre de eso.
Liam

15

Realmente no es una respuesta a la pregunta original, pero aquí hay una función auxiliar para hacer que la ruta de vagabundo / sudo sea un poco más fácil:

(defun sudo-find-file (nombre-archivo)
  "Como buscar archivo, pero abre el archivo como root".
  (interactivo "FSudo Find File:")
  (let ((nombre-archivo-vagabundo (concat "/ sudo ::" (nombre-archivo-nombre-expandido))))
    (buscar-archivo-nombre-archivo-vagabundo)))

Creo que el Emacs Starter Kit tiene algo similar esk-sudo-edit.
mrmagooey


4

Su ejemplo no comienza ssh en absoluto, al menos no con mi versión de TRAMP ("2.1.13-pre"). Tanto find-file como save-buffer funcionan muy bien.


Puede tener sus credenciales en caché. Cuando TRAMP se inicia por primera vez, pasa por 10-15 segundos de material SSH. (Tengo 2.1.13-pre también.)
Chris Conway

¿Estás seguro? Quiero decir, debería estar iniciando una subshell, pero no una sesión SSH para localhost. Tarda unos 5 segundos en ejecutar todo el auto-sniffing TRAMP la primera vez.
jfm3

Bueno, no, no estoy seguro. Debo decir que hay 10-15 segundos de cosas TRAMP (quizás SSH). No me preocupa SSH per se, sino el retraso en la puesta en marcha. ¿Cuánto tiempo duran estas cosas de inicio?
Chris Conway

Solo debería tomar más de un segundo la primera vez que lo haga. Es decir, incluso si guarda / sudo :: file, elimina el búfer y abre / sudo :: file2, el archivo2 debería abrirse rápidamente. Mantiene el caparazón abierto y almacena en caché los resultados de todos sus olfateo.
jfm3

Pero, ¿se almacenan en caché las credenciales: (1) para ese proceso de Emacs o (2) para todos los procesos de Emacs? ¿Y caducan: (a) cuando Emacs cierra, (b) después de un período de tiempo fijo (horas? Días? Semanas?), O (c) después de un reinicio del sistema?
Chris Conway

3

Te recomiendo que uses comandos de asesoramiento. Pon esta función en tu ~ / .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 para señalar lo obvio, esto requiere que esté utilizando ido-find-filepara buscar archivos.
tripleee

1

(funciona solo localmente. Debe actualizarse para que funcione correctamente mediante vagabundo)

Un poco más extendido la respuesta de 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 Quizás podría abrir un shell en Emacs y exec sudo emacs.

El problema es que presumiblemente no solo desea abrir el archivo. Desea poder guardarlo más tarde. Por lo tanto, necesita que sus privilegios raíz persistan, no solo existan para abrir el archivo.

Parece que quieres que Emacs se convierta en tu administrador de ventanas. Está lo suficientemente hinchado sin eso. :)


11
Ja, ja, dijiste hinchazón. Emacs solía parecer enorme. Ahora, en comparación con las huellas en tiempo de ejecución de Java, Ruby y probablemente un montón de otras cosas, parece bastante delgado. De todos modos, creo que la pregunta de Chris tiene un uso perfectamente legítimo de Emacs.
jfm3

1
Me ganaste a eso. Yo uso este modelo constantemente. Al iniciar sesión, comienzo una sesión de Emacs para cosas generales, una para acceso a SU (como root) y una o más para desarrollo de software (generalmente por proyecto pero no siempre). Lo he estado haciendo por años. Solo funciona
pajato0

¿puede aclarar cómo hacer esto: "abrir un shell en Emacs y exec sudo emacs"
johnbakers

1
@OpenLearner En serio, realmente no quieres hacer eso.
tripleee
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.