emacs remote-access tmux collaboration emacsclient

Usar el servidor Emacs y emacsclient en otras máquinas como otros usuarios



remote-access tmux (4)

Aaron Gallagher implementó una solución: http://blog.habnab.it/blog/2013/06/25/emacsclient-and-tramp/

Funciona (AFAIU) como:

  • El servidor emacs se inicia con tcp
  • Abre una conexión a un sistema remoto con vagabundo, abriendo un puerto de reenvío ("canal de retorno")
  • Se recomienda a tramp-sh que copie un archivo extendido de cookies de autenticación en el sistema remoto
  • En el sistema remoto, él llama a un script de shell especial de emacsclient.sh que emula emacsclient pero prefija los nombres de los archivos con el prefijo de vagabundo correspondiente que se encuentra en la cookie de autenticación extendida.

He agregado un comentario a su publicación de blog proponiendo esta idea para ser discutida y mejorada en emacs-devel.

Sé que después de llamar (start-server) dentro de una sesión de Emacs existente, puedo usar emacsclient -c (en la misma computadora) para crear nuevos marcos que se conecten a ese servidor, de modo que cada nuevo fotograma creado por emacsclient tenga acceso a el mismo conjunto de estado compartido (por ejemplo, búferes).

La mayoría de la documentación que he encontrado se centra en el caso de uso "déjame acceder rápidamente a mi Emacs local", por lo que hay dos cosas de las que aún no he visto detalles:

  1. ¿Puede emacsclient -c acceder a los servidores Emacs iniciados por otros usuarios, o está cableado para detectar solo sesiones iniciadas por mi propio usuario?

  2. ¿El servidor de Emacs (directa o indirectamente) admite conexiones remotas? Es decir, ¿hay alguna forma de configurar Emacs (posiblemente con SSH) que permita que las llamadas a emacsclient -c en máquinas remotas tengan acceso al estado local de mi servidor Emacs?

(En caso de que aún no lo haya adivinado, lo que en última instancia me gustaría hacer es combinar las dos técnicas anteriores para proporcionar soporte de edición colaborativo rudimentario).

Este es un problema del mundo real, así que aquí es con lo que estoy trabajando:

  • La funcionalidad necesaria ya debe estar integrada en Emacs (23.3.1, 64 bits). Puedo extender las extensiones de Emacs desde los repositorios estándar de Ubuntu, pero preferiría no hacerlo. (Lo cual creo que descarta a Rudel , por desgracia)
  • No hay nuevos usuarios o spoofing de usuario. Las soluciones deben funcionar con el conjunto existente de cuentas de usuario, y los usuarios no deben pretender ser otros usuarios (por ejemplo, a través de su o ssh ).

Si hace alguna diferencia, las máquinas están en una LAN privada, tienen clientes y servidores OpenSSH instalados (y en ejecución), y todos los usuarios pueden conectarse a (todas sus máquinas) en todas las máquinas, pero no tienen un sistema de archivos compartido.

Entonces, ¿alguien sabe si el servidor de Emacs puede

  • otorgar acceso a otros usuarios, o
  • proporcionar acceso remoto?

EDITAR

Como se comentó en la respuesta de rwb, está claro que las nuevas ventanas que se abren localmente ejecutando emacsclient -c realidad están siendo creadas por el proceso remoto del servidor de Emacs. Es decir, emacsclient simplemente está activando el comportamiento relevante en el servidor. Esto ocasiona algunos problemas con las configuraciones de visualización incorrectas, ya que el servidor normalmente no tiene acceso al escritorio local (consulte a continuación). Sin embargo, ahora puedo conectarme a una sesión remota de Emacs si uso la siguiente secuencia de comandos:

En una terminal, donde 1.22.333.44 es la dirección IP de remotehost :

ssh -t -X remotehost / "emacs -nw --eval ''(progn (setq server-host /"1.22.333.44/" server-use-tcp t) (server-start))''"

Luego en otro (en la misma máquina):

scp remotehost:.emacs.d/server/server /tmp/server-file DISPLAY=localhost:10 emacsclient -c -f /tmp/server-file

El comando emacsclient hace que el servidor Emacs remoto (que encuentra detalles en /tmp/server-file ) abra una ventana gráfica de Emacs (en la pantalla local) que comparte estado con la sesión Emacs en el host remoto.

Como el servidor Emacs remoto se inició a través de ssh -X , SSH le proporciona acceso a mi pantalla local a través de una pantalla "falsa" :10 . El DISPLAY=:10 pasó (a través de emacsclient ) hace que se abra una ventana en mi escritorio local.

Aunque el enfoque anterior marca la casilla "Ejecutar servidor Emacs en la máquina remota, conéctese usando emacsclient localmente", es muy limitado. De hecho, no es muy diferente ejecutar el servidor y los clientes de forma local como un único usuario: la única diferencia es que el servidor ahora es remoto, por lo que tiene acceso a diferentes recursos del sistema.

Desafortunadamente, el lanzamiento a través de ssh -X es la única forma en que he podido abrir con éxito una ventana en el servidor X de una máquina diferente:

  • Especificar un DISPLAY=remote:0 básico DISPLAY=remote:0 no llega a ninguna parte (ya que los servidores Ubuntu X se inician con la opción -nolisten tcp ).

  • La conexión a través de SSH y el uso de DISPLAY=:0 también falla, pero esta vez solo debido a la falta de credenciales de autenticación adecuadas. (Creo que ese es el caso, de todos modos: el mensaje de error dice crípticamente No protocol specified / Can''t open display ).

Creo que encontrar una solución al segundo problema probablemente me acercaría mucho más a una solución.

Después de leer las publicaciones en http://comments.gmane.org/gmane.emacs.devel/103350 (comenzando en la publicación ''25 Oct 14:50 '', aproximadamente a la mitad del camino) empiezo a preguntarme si esto podría ser una de las cosas raras que Emacs no puede hacer (es decir, es imposible ;-)).

Sin embargo, si alguien tiene una forma de proporcionar acceso a pantallas X remotas sin el error de permisos anterior, todavía estoy abierto a la persuasión ...

TL; DR

Como lo señaló la respuesta de rwb, mis preguntas anteriores sobre si Emacs puede otorgar acceso remoto han hecho retroceder las cosas. No hay ningún problema real con Emacs otorgando acceso a otros usuarios ( server-use-tcp y un server-file adecuado se encargan de esto): el problema es cómo permitir que un proceso en una máquina abra nuevas ventanas X en otros usuarios '' X muestra (específicamente, el Emacs en ejecución (start-server) necesita abrir ventanas para los usuarios que lo soliciten a través de emacsclient -c ). Esa respuesta está más allá del alcance de esta pregunta.

Solución alternativa

Como solución, utilizamos lo siguiente:

  • máquina0: tmux -S /tmp/shared-tmux-socket new-session
  • machine1..machineN: ssh -t machine0 tmux -S /tmp/shared-tmux-socket attach

con permisos de archivos adecuados en /tmp/shared-tmux-socket .

Luego ejecutamos un Emacs en modo texto en la terminal compartida. :-) Esto genera algunas preguntas de suplantación de usuarios, pero al menos el anfitrión puede ver todo lo que los invitados están haciendo.


Creo que lo que estás pidiendo es imposible por definición, porque si le das a un usuario remoto acceso irrestricto a tu Emacs, esto es tanto "spoofing de usuario" como dejar que ese usuario remoto acceda a un shell a través de ssh. Para deletrearlo, desde el punto de vista de la seguridad, esta es probablemente una mala idea.

Además, los resultados de permitir que dos usuarios accedan a un Emacs no son tan buenos como cabría esperar. No está diseñado con acceso simultáneo en mente. Han pasado años desde que lo probé, así que las cosas podrían haber cambiado un poco, pero cuando lo hice fue raro por decir lo menos.

Aún así, intentaré responder a tu pregunta.

Parece que estás pensando en esto de forma directa, porque, en contra de la intuición, en términos de red, la pantalla X11 es el servidor y la aplicación X11 es el cliente. Esto es sorprendente porque normalmente la pantalla es local para el usuario y la aplicación se está ejecutando en algún servidor remoto.

Puede ordenar que emacs en ejecución se conecte a una pantalla remota y abra una nueva ventana con Mx make-frame-on-display . Para que esto funcione, el propietario de esa pantalla deberá otorgarle acceso.

Asumiremos que host-l es la computadora que ejecuta Emacs, y que desea que sea accesible para un usuario de la pantalla 0 en host-r . Tenga en cuenta que ha dicho que no desea utilizar el reenvío SSH, por lo que seguir este método causará que todo el tráfico se transmita a través de la red sin cifrar.

Primero, asegúrese de que display host-r:0 acepte conexiones TCP. No menciona su sistema operativo, pero probablemente este sea el predeterminado en Unix y probablemente no esté en Linux (por razones de seguridad). Si, por ejemplo, lo siguiente menciona -nolisten tcp entonces deberá cambiar esta configuración.

host-r$ ps -ef | grep X

Luego, haga que el usuario de host-r ejecute lo siguiente y le envíe la salida. Asegúrese de advertirles que esto le permitirá tomar el control completo de su sesión de escritorio actual, en caso de que lo elija.

host-r$ xauth list $DISPLAY host-r/unix:0 MIT-MAGIC-COOKIE-1 01234567890abcdef0123456789abcd

Esta es, de hecho, la "contraseña" para la pantalla. En host-l , colóquelo donde Emacs podrá encontrarlo con:

host-l$ xauth add host-r:0 MIT-MAGIC-COOKIE-1 01234567890abcdef0123456789abcd

Ahora ingrese Mx make-frame-on-display host-r: 0 y aparecerá una ventana de Emacs en la pantalla remota.


Esto debería proporcionar un punto de partida para lo que desea.

Desde el nodo de información (emacs) Opciones de emacsclient

`--server-file=SERVER-FILE'' Specify a "server file" for connecting to an Emacs server via TCP. An Emacs server usually uses an operating system feature called a "local socket" to listen for connections. Some operating systems, such as Microsoft Windows, do not support local sockets; in that case, Emacs uses TCP instead. When you start the Emacs server, Emacs creates a server file containing some TCP information that `emacsclient'' needs for making the connection. By default, the server file is in `~/.emacs.d/server/''. On Microsoft Windows, if `emacsclient'' does not find the server file there, it looks in the `.emacs.d/server/'' subdirectory of the directory pointed to by the `APPDATA'' environment variable. You can tell `emacsclient'' to use a specific server file with the `-f'' or `--server-file'' option, or by setting the `EMACS_SERVER_FILE'' environment variable. Even if local sockets are available, you can tell Emacs to use TCP by setting the variable `server-use-tcp'' to `t''. One advantage of TCP is that the server can accept connections from remote machines. For this to work, you must (i) set the variable `server-host'' to the hostname or IP address of the machine on which the Emacs server runs, and (ii) provide `emacsclient'' with the server file. (One convenient way to do the latter is to put the server file on a networked file system such as NFS.)

También es posible que desee ver las variables server-auth-dir , server-auth-key y server-port