Abrir archivo a través de SSH y Sudo con Emacs


114

Quiero abrir un archivo dentro de Emacs que se encuentra en un servidor remoto, con sudo en el servidor. Puedo abrir archivos locales con sudo a través de Tramp así:

C-x C-f /sudo::/home/user/file

Pero quiero usar sudo en el servidor:

C-x C-f /sudo::user@server/home/user/file

Pero esto me da poderes de sudo en mi máquina local, me pide mi contraseña de sudo en la máquina local. ¿Hay alguna forma de usar sudo en el servidor?

Por cierto: Emacs no está instalado en el servidor


¿No puedes mandar como root directamente en el servidor?
Chmouel Boudjnah

2
Tengo un usuario con privilegios de sudo, pero no la contraseña de root.
Fernando Briano

Respuestas:


186

A partir de Emacs 24.3, un análogo de la multi:sintaxis antigua se ha superpuesto al tramp-default-proxies-alistenfoque moderno , lo que significa que puede volver a realizar saltos múltiples sin ninguna configuración previa. Para obtener más detalles, consulte:

C-hig (tramp) Ad-hoc multi-hops RET

Con la nueva sintaxis, cada 'salto' está separado por |. El ejemplo del manual es:

C-xC-f /ssh:bird@bastion|ssh:you@remotehost:/path RET

Que se conecta en primer lugar como bird@bastion, y de ahí ayou@remotehost:/path

/ su: o / sudo: en hosts remotos

También puede usar esta sintaxis para sudo / su a root (o por supuesto a cualquier otro usuario) en un host remoto:

C-xC-f /ssh:you@remotehost|sudo:remotehost:/path/to/file RET

Importante : asegúrese de especificar el nombre de host explícitamente: en sudo:remotehost:lugar de sudo::(ver más abajo).

Como esto todavía usa el mecanismo de proxy debajo, tramp-default-proxies-alistahora debería incluir el valor("remotehost" "root" "/ssh:you@remotehost:")

Lo que significa que el proxy /ssh:you@remotehost:se utilizará siempre que solicite un archivo como root@remotehost.

root es el usuario predeterminado para estos métodos, pero, por supuesto, también puede cambiar a un usuario no root con:

C-xC-f /ssh:you@remotehost|sudo:them@remotehost:/path/to/file RET

Siempre especifique explícitamente el nombre de host remoto

Probablemente esté acostumbrado a usar sudo::u su::omitir el nombre de host. Si se queda en el host local, esto todavía está bien, pero si está saltando a un servidor remoto, debe especificar el nombre de host para cada salto, incluso si es el mismo que para el salto anterior. Utilice siempre sudo:hostname:o su:hostname:con hosts remotos.

La trampa es que sudo:: qué aparecen realmente a trabajar - sin embargo cuando se hace eso el anfitrión de la entrada dinámica de proxy será el nombre de host que originó a partir de en vez de que el anfitrión conectado. Esto no solo parecerá confuso (ya que se mostrará el host incorrecto en las rutas de archivo), sino que también significará que cualquier intento posterior de usarlo sudo::en su host local se enviará al servidor remoto. (y presumiblemente el proxy también se vería afectado si hiciera lo mismo en un segundo servidor, lo que provocaría más problemas).

En resumen, ¡no lo use ::cuando tenga varios saltos!


4
y ahora agregado a wikemacs también wikemacs.org/index.php/TRAMP . Gracias phils, funciona muy bien.
Ehvince

1
Acabo de encontrar esta respuesta y funciona muy bien ... excepto que tengo la abreviatura de nombre de host definida en un archivo .ssh / config. Cuando escribo /sudo:hostname:/etc/hosts, obtengo lo que cabría esperar, pero cuando /sudo:abbrev:/etc/hostsescribo, aparece el mensaje "La abreviatura del host parece un host remoto, sudo solo puede usar el host local". ¿Es esto reparable?
rogerl

2
rogerl: También tengo .ssh/configentradas y no tengo problemas /ssh:abbrev|sudo:abbrev:/etc/hostspara usar las abreviaturas de mi nombre de host. Parece que no estás saltando primero al anfitrión.
phils

@phils Quizás debería publicar esto como una nueva pregunta. Sin embargo: mi archivo de configuración se ve como Host r User rlipsett Hostname odlinux IdentityFile ~ / .ssh / id-rsa.pub y my tramp-default-proxies-alistparece ser correcto. Sin embargo, el comportamiento que describí anteriormente persiste. ¿Mi archivo de configuración es incorrecto de alguna manera?
rogerl

Todavía no me queda claro si en realidad está tratando de usar /sudo:abbrev:/etc/hostscomo puso en su comentario anterior (que es incorrecto, como se mencionó), o si está usando el correcto /ssh:abbrev|sudo:abbrev:/etc/hosts. Su archivo de configuración ssh probablemente está bien, ya que evidentemente puede usarlo de otra manera.
phils

21

Actualización : aunque esta respuesta resolvió el problema original, fue escrita para emacs 20 o 21. Para emacs 24, le recomiendo que use la respuesta de phils porque ofrece más explicaciones y está actualizada.


Creo que los nombres de archivo de varios saltos en tramp es lo que estás buscando.

El primer salto sería ssh y el segundo sudo.


Actualización: las versiones recientes de emacs admiten múltiples saltos usando proxies:

(add-to-list 'tramp-default-proxies-alist ("my-sudo-alias" nil "/ssh:user@ssh-host"))

Luego invoca abriendo:

/sudo:my-sudo-alias:file-on-ssh-host

Esta parece ser la solución, pero obtengo: "El método múltiple ya no es compatible" ¿Puede indicarme un manual actualizado?
Fernando Briano

Mx info, Cs tramp :) Es posible que deba definir un host falso como el objetivo de su sudo y agregarlo a tramp-default-proxy-alist.
Dave Bacher

2
No pude ejecutarlo en mi configuración (¿error 255?), Pero la siguiente línea en .emacs funciona: (set-default 'tramp-default-proxies-alist (quote (("my-sudo-alias" nil " / ssh: user @ ssh-host: "))))
ang mo

La respuesta actualizada no define "reciente", tiene elisp no válido y no funciona incluso cuando lo corrige. Estoy en una versión estable de emacs lanzada más de un año después de la respuesta actualizada.
Michael Wolf

1
La respuesta real a partir de 2014 / 24.3 es la siguiente respuesta, utilizando "saltos múltiples ad-hoc"
TomRoche

7

Tuve algunos problemas con la respuesta seleccionada. Sin embargo, funcionó cuando agregué esta línea a .emacs:

(add-to-list 'tramp-default-proxies-alist '(".*" "\\`root\\'" "/ssh:%h:"))

Y luego ejecutó lo siguiente:

/sudo:ssh-host:file-on-ssh-host

Fue un poco confuso porque en un momento se me pidió la contraseña de "root", pero al ingresar la contraseña de mi usuario, me concedió acceso. También funciona universalmente en todos los hosts de la red. Además, todavía puedo hacer esto para no ser root:

/ssh:ssh-host:file-on-ssh-host


3
Esto no funcionó para mí. Parece que en Ubuntu, al menos con la versión 23.2.1 de Emacs y la versión 2.1.18-23.2 de tramp, esto no funciona. Sin embargo, esto funciona: info.solomonson.com/content/…
gaizka

(set-default 'tramp-default-proxies-alist (quote ((". *" "\` root \\' "" / ssh:% h: "))))
gaizka

1
No puedo hacer que ninguna de las soluciones anteriores funcione (agregar a la lista o establecer el valor predeterminado). El primero hace que Emacs se bloquee al iniciarse y el segundo me da "Host abc.xyz.com' looks like a remote host, sudo 'sólo puede usar el host local" tan pronto como ingrese los segundos dos puntos en "/sudo:abc.xyz.com:". Ideas? Emacs 23.1.1 en Ubuntu 10.04 LTS.
SabreWolfy

3

Desde la página web de configuración de tramp multi-hops

 (add-to-list 'tramp-default-proxies-alist
                   '(nil "\\`root\\'" "/ssh:%h:"))
      (add-to-list 'tramp-default-proxies-alist
                   '((regexp-quote (system-name)) nil nil))

Entonces cualquiera

C-x C-f /sudo:remote-host:/file

abrirá el archivo usando sudo después de iniciar sesión con el mismo nombre de usuario del usuario que ejecuta emacs pero en la máquina remota.


-12

Primero debe ingresar al servidor mediante SSH, luego debe ejecutar emacs localmente.

O puede usar NFS con no_root_squash, o puede probar con el servidor / cliente emacs, aunque no tengo idea de lo que puede suceder (no use emacs yo mismo)


Lo intenté, pero no puedo acceder a los archivos como root con sshfs, al montarlo como usuario normal. Supongo que es un problema de configuración.
Dan Andreatta

Como señaló Hassan, no_root_squash debe usarse con cuidado.
Dan Andreatta

6
-1 por no responder la pregunta. -1 por sugerir NFS en lugar de SSH. -1 por sugerir no_root_squash. -1 por sugerir el cliente Emacs, que generalmente usa sockets de dominio Unix, para un problema de comunicación remota. -1 por hablar sobre Emacs sin usarlo.
partir del
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.