在其他计算机上使用Emacs服务器和emacsclient作为其他用户

Pau*_*ker 49 collaboration emacs remote-access emacsclient tmux

我知道在我调用(start-server)现有的Emacs会话后,我可以使用emacsclient -c(在同一台计算机上)创建连接到该服务器的新帧,这样创建的每个新帧emacsclient都可以访问同一组共享状态(例如缓冲区) ).

我发现的大多数文档都集中在"让我快速访问我的本地Emacs"用例,所以有两件事我还没有看到任何细节:

  1. 可以emacsclient -c访问由其他用户启动的Emacs服务器,还是仅通过硬连线检测我自己的用户启动的会话?

  2. Emacs服务器(直接或间接)是否支持远程连接?也就是说,有没有办法设置Emacs(可能涉及SSH),允许远程机器emacsclient -c上的调用访问我的Emacs服务器的本地状态?

(如果你还没有猜到,我最终想要做的是结合上面的两种技术来提供基本的协作编辑支持.)


这是一个现实世界的问题,所以这就是我正在使用的:

  • 必要的功能应该已经内置到Emacs中(23.3.1,64位).我可以从标准的Ubuntu存储库扩展到Emacs扩展,但我不愿意.(遗憾的是,我相信Rudel的规则.)
  • 没有新用户或用户欺骗.解决方案应与现有的一组用户帐户一起使用,用户不得伪装成其他用户(例如通过sussh).

如果它有所不同,机器在私有LAN上,安装(并运行)OpenSSH客户端和服务器,并且所有用户都可以连接到(他们自己的帐户)所有机器,但它们没有共享文件系统.


那么,有没有人知道Emacs服务器是否可以

  • 授予其他用户访问权限,或
  • 提供远程访问?

编辑

正如在rwb的回答中所评论的那样,很明显,通过运行emacsclient -c在本地打开的新窗口实际上是由远程 Emacs服务器进程创建的.也就是说,emacsclient只是触发服务器中的相关行为.这会导致显示设置不正确的一些问题,因为服务器通常无法访问本地桌面(请参阅下文).但是,如果我使用以下命令序列,我现在可以连接到远程Emacs会话:

在一个终端中,1.22.333.44IP地址在哪里remotehost:

ssh -t -X remotehost \
  "emacs -nw --eval
   '(progn (setq server-host \"1.22.333.44\" server-use-tcp t) (server-start))'"
Run Code Online (Sandbox Code Playgroud)

然后在另一个(在同一台机器上):

scp remotehost:.emacs.d/server/server /tmp/server-file
DISPLAY=localhost:10 emacsclient -c -f /tmp/server-file
Run Code Online (Sandbox Code Playgroud)

emacsclient命令使远程Emacs服务器(它找到其中的详细信息/tmp/server-file)打开一个图形Emacs窗口(在本地显示器上),该窗口与远程主机上的Emacs会话共享状态.

由于远程Emacs服务器是通过启动的ssh -X,因此SSH通过"假" :10显示器提供对本地显示器的访问.在DISPLAY=:10传递给它(通过emacsclient),从而使我的本地桌面上打开一个窗口.


虽然上面的方法确实勾选了"在远程计算机上运行Emacs服务器,使用emacsclient本地连接到它"框,但它非常有限.实际上,将本地服务器和客户端作为单个用户运行并没有什么不同:唯一的区别是服务器现在是远程的,因此可以访问不同的系统资源.

不幸的是,启动via ssh -X是我能够在不同机器的X服务器上成功打开窗口的唯一方法:

  • 指定基本DISPLAY=remote:0无处可寻(因为Ubuntu X服务器是使用该-nolisten tcp选项启动的).

  • 通过SSH连接然后使用DISPLAY=:0也失败了,但这次只是由于缺乏合适的身份验证凭据.(我相信情况就是这样:错误消息隐藏地说No protocol specified/ Can't open display.)

我认为找到解决第二个问题的方法可能会让我更接近解决方案.


阅读了http://comments.gmane.org/gmane.emacs.devel/103350上的帖子(从10月25日14:50开始,约一半下来),我开始怀疑这可能是Emacs不能做的罕见事情之一(即不可能;-)).

但是,如果任何人都有办法提供对远程X显示的访问而没有上述权限错误,我仍然愿意接受说服....

TL; DR

正如rwb的回答所指出的那样,我上面提到的关于Emacs是否可以授予远程访问权限的问题已经倒退了.Emacs授予对其他用户的访问权限server-use-tcp并且没有真正的问题(并且适当server-file地处理这个问题):问题是如何允许一台机器上的进程在其他用户的X显示器上打开新的X窗口(具体地说,Emacs正在运行)(start-server)需要为要求通过的用户打开窗口emacsclient -c.这个答案超出了这个问题的范围.

替代方案

作为解决方法,我们使用以下内容:

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

具有合适的文件权限/tmp/shared-tmux-socket.

然后我们在共享终端中运行文本模式Emacs.:-)这确实引起了一些用户欺骗问题,但至少主持人可以看到客人正在做的一切.

rwb*_*rwb 14

这应该为您想要的提供一个起点.

来自info节点(emacs)的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.)
Run Code Online (Sandbox Code Playgroud)

你也可能想看看变量server-auth-dir,server-auth-keyserver-port


mav*_*vit 11

我认为你所要求的是不可能的定义,因为如果你给远程用户不受限制的访问你的Emacs,这就像让那个远程用户通过ssh访问shell一样"欺骗".为了说明这一点,从安全的角度来看,这可能是一个坏主意.

此外,让两个用户访问一个Emacs的结果并不像您希望的那样好.它的设计并未考虑到同时访问.我尝试了几年,所以事情可能会有所改变,但是当我这样做时,它至少可以说是古怪的.

不过,我会尽力回答你的问题.

听起来你正在思考这种情况,因为在网络方面,X11显示器是服务器,而X11应用程序是客户端.这是令人惊讶的,因为通常显示器对用户是本地的,并且应用程序在某个远程服务器上运行.

您可以指示正在运行的emacs连接到远程显示器并打开一个新窗口M-x make-frame-on-display.为此,该显示的所有者需要授予您访问权限.

我们假设host-l是运行Emacs的计算机,并且您希望显示0的用户可以访问它host-r.请注意,您已经说过您不想使用SSH转发,因此遵循此方法将导致所有流量将通过网络未加密.

首先,确保显示host-r:0正在接受TCP连接.你没有提到你的操作系统,但这可能是Unix上的默认设置,可能不在Linux上(出于安全考虑).例如,如果提到以下内容,-nolisten tcp则需要更改此配置.

host-r$ ps -ef | grep X
Run Code Online (Sandbox Code Playgroud)

接下来,让host-r的用户运行以下命令,并将输出发送给您.请务必警告他们,如果您愿意,这将允许您完全控制他们当前的桌面会话.

host-r$ xauth list $DISPLAY
host-r/unix:0  MIT-MAGIC-COOKIE-1  01234567890abcdef0123456789abcd
Run Code Online (Sandbox Code Playgroud)

实际上,这是显示器的"密码".在host-l,将它放在Emacs将能够找到它的地方:

host-l$ xauth add host-r:0 MIT-MAGIC-COOKIE-1  01234567890abcdef0123456789abcd
Run Code Online (Sandbox Code Playgroud)

现在输入M-x make-frame-on-display host-r:0并在远程显示器上弹出Emacs窗口.


Tho*_*och 7

Aaron Gallagher实施了一个解决方案:http://blog.habnab.it/blog/2013/06/25/emacsclient-and-tramp/

它的工作原理(AFAIU)如:

  • emacs服务器是用tcp启动的
  • 他用tramp-sh打开了与远程系统的连接,打开了一个前向端口("后向通道")
  • 建议tramp-sh将扩展的auth cookie文件复制到远程系统
  • 在远程系统上,他调用一个特殊的emacsclient.sh shell脚本来模拟emacsclient,但在文件名前加上扩展的auth cookie中找到的相应tramp前缀

我在他的博客文章中添加了一条评论,建议在emacs-devel上讨论和增强这个想法.

  • http://andy.wordpress.com/2013/01/03/automatic-emacsclient/类似但看起来更简单. (3认同)