emacs ssh sudo tramp

Abrir archivo vía SSH y Sudo con Emacs



tramp (5)

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

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


A partir de Emacs 24.3, un análogo de la vieja multi: sintaxis se ha superpuesto sobre el enfoque moderno tramp-default-proxies-alist , lo que significa que puede realizar múltiples saltos sin ninguna configuración previa. Para más detalles, ver:

Ch i g (tramp) Ad-hoc multi-hops RET

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

Cx Cf /ssh:bird@bastion|ssh:you@remotehost:/path RET

Que se conecta en primer lugar como bird@bastion , y desde allí a you@remotehost:/path

/ su: o / sudo: en hosts remotos

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

Cx Cf /ssh:you@remotehost|sudo:remotehost:/path/to/file RET

Importante : asegúrese de especificar el nombre de host explícitamente: sudo:remotehost: lugar de sudo:: (consulte a continuación).

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

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

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

Cx Cf /ssh:you@remotehost|sudo:them@remotehost:/path/to/file RET

Siempre especifique el nombre de host remoto explícitamente

Probablemente estés acostumbrado a usar sudo:: o su:: y omitir el nombre de host. Si te estás quedando en el servidor local, entonces esto todavía está bien, pero si estás saltando a un servidor remoto, entonces debes especificar el nombre de host para cada salto, incluso si es el mismo que para el salto anterior. Siempre use sudo:hostname: o su:hostname: con hosts remotos.

La trampa aquí es que sudo:: realmente parece funcionar; sin embargo, cuando lo haga, el HOST para la entrada del proxy dinámico será el nombre de host del que se originó en lugar del host al que se conectó. Esto no solo parecerá confuso (ya que el host incorrecto se mostrará en las rutas de archivos), sino que también significará que cualquier intento subsiguiente de utilizar sudo:: en su servidor local se enviará al servidor remoto. (y el proxy probablemente también sería superado si hiciera lo mismo en un segundo servidor, causando más problemas).

En resumen, no uses :: cuando multiples saltos!


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

(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 cualquier

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.


Primero tiene que ingresar al servidor, luego debe ejecutar emacs localmente.

O puede usar NFS con no_root_squash, o puede probar con el servidor / cliente de emacs, aunque no tengo idea de qué puede pasar (no use emacs)


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 me pidieron la contraseña "raíz", pero ingresar la contraseña de mi usuario me dio acceso. También funciona universalmente en todos los hosts de la red. Además, aún puedo hacer esto para no ser root:

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


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

Creo que los nombres de archivos de varios saltos en tramp son lo que estás buscando.

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

Actualización: las versiones recientes de emacs admiten varios saltos utilizando proxies:

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

Luego invoque abriendo:

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