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

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

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

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

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

(如果您还没有猜到,我最终想要做的就是将上述两种技术结合起来,以提供基本的协作编辑支持。)


这是一个现实世界的问题,所以这就是我正在处理的事情:

  • Emacs已经有了必要的function(23.3.1,64位)。 我可以从标准Ubuntu版本库扩展到Emacs扩展,但我不想。 (我相信,我不相信Rudel ,)。
  • 没有新用户或用户欺骗。 解决scheme应该与现有的一组用户帐户一起工作,并且用户不能假装是其他用户(例如通过sussh )。

如果它有什么区别,机器是在一个专用的局域网上,有OpenSSH客户端和服务器安装(和运行),所有用户可以连接到(他们自己的帐户)所有机器,但他们没有共享文件系统。


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

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

编辑

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

在一个terminal中, 1.22.333.441.22.333.44的IP地址:

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

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

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

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

由于远程Emacs服务器是通过ssh -X启动的,SSH提供了通过“假” :10显示器访问我的本地显示器。 DISPLAY=:10传递给它(通过emacsclient ),从而导致我的本地桌面上打开一个窗口。


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

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

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

  • 通过SSH连接,然后使用DISPLAY=:0也会失败,但这次只是由于缺less合适的authentication凭证。 (无论如何,我认为是这样的:错误信息隐密地说No protocol specified / Can't open display 。)

我认为find解决第二个问题的办法可能会让我更接近解决scheme。


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

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

TL; DR

正如rwb的回答所指出的那样,我上面关于Emacs是否可以授予远程访问权限的问题让事情倒退了。 Emacs授予其他用户的访问权限( server-use-tcp和一个合适的server-file负责这个问题)并没有真正的问题:问题是如何让一台机器上的进程在其他用户的计算机上打开新的X窗口, X显示 (具体来说,Emacs运行(start-server)需要通过emacsclient -c打开窗口)。 这个答案超出了这个问题的范围。

替代scheme

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

  • 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上具有合适的文件权限。

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

根据定义,我认为你所要求的是不可能的,因为如果你让一个远程用户不受限制地访问你的Emacs,这和让这个远程用户通过ssh访问一个shell是一样的“用户欺骗”。 说清楚,从安全的angular度来看,这可能是一个坏主意。

另外,让两个用户访问一个Emacs的结果并不如你所希望的那样好。 它的devise不是同时存取的。 我尝试了几年,所以事情可能会有所改变,但是当我这么做的时候,至less可以说是古怪的。

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

这听起来像是你在考虑这个事情,因为从networkingangular度来看,X11显示器是服务器,而X11应用程序是客户端。 这是令人惊讶的,因为通常显示是用户本地的,应用程序在某个远程服务器上运行。

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

我们将假设host-l是运行Emacs的计算机,并且要让host-r上显示0的用户可以访问它。 要知道,你已经说过你不想使用SSH转发,所以按照这个方法将会导致所有的stream量都是未encryption的。

首先,确保显示host-r:0正在接受TCP连接。 你没有提到你的操作系统,但是这可能是Unix上的默认设置,可能不是在Linux上(出于安全原因)。 例如,如果-nolisten tcp那么你需要改变这个configuration。

 host-r$ ps -ef | grep X 

接下来,让host-r的用户运行以下内容,并向您发送输出。 一定要警告他们,如果您select,这将允许您完全控制他们当前的桌面会话。

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

这实际上是显示器的“密码”。 在host-l ,把它放在Emacs能够find它的地方:

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

现在inputMx make-frame-on-display host-r:0并在远程显示器上popup一个Emacs窗口。

这应该为你想要的东西提供一个起点。

从信息节点(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.) 

你也可能想看看variablesserver-auth-dirserver-auth-keyserver-port

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

它工作(AFAIU)就像:

  • emacs服务器是用tcp启动的
  • 他用tramp-sh打开一个远程系统的连接,打开一个前向端口(“back channel”)
  • build议使用tramp-sh将扩展的auth cookie文件复制到远程系统
  • 在远程系统上,他调用一个特殊的emacsclient.shshell程序脚本来模拟emacsclient,但在扩展的auth cookie中find相应的tramp前缀的前缀

我在他的博客文章中添加了一条评论,提出了这个想法,在emacs-devel上进行讨论和加强。

如果你这样做,让人们远程编辑文件,你可能想看看“stream浪汉模式”

http://emacswiki.org/emacs/TrampMode