作为其他用户在其他机器上使用Emacs服务器和emacsclient
我知道,在我现有的Emacs会话中调用(start-server)
之后,我可以使用emacsclient -c
(在同一台计算机上)创build连接到该服务器的新帧,以便每个由emacsclient
创build的新帧都可以访问同一组共享状态(如缓冲区)。
我发现的大多数文档都关注“让我快速访问我的本地Emacs”用例,所以有两件事情我还没有看到任何细节:
-
emacsclient -c
可以访问由其他用户启动的Emacs服务器,还是硬连接来检测仅由我自己的用户启动的会话? -
Emacs服务器(直接或间接)是否支持远程连接? 也就是说,是否有一些方法来设置Emacs(可能涉及到SSH),允许在远程机器上调用
emacsclient -c
访问Emacs服务器的本地状态?
(如果您还没有猜到,我最终想要做的就是将上述两种技术结合起来,以提供基本的协作编辑支持。)
这是一个现实世界的问题,所以这就是我正在处理的事情:
- Emacs已经有了必要的function(23.3.1,64位)。 我可以从标准Ubuntu版本库扩展到Emacs扩展,但我不想。 (我相信,我不相信Rudel ,)。
- 没有新用户或用户欺骗。 解决scheme应该与现有的一组用户帐户一起工作,并且用户不能假装是其他用户(例如通过
su
或ssh
)。
如果它有什么区别,机器是在一个专用的局域网上,有OpenSSH客户端和服务器安装(和运行),所有用户可以连接到(他们自己的帐户)所有机器,但他们没有共享文件系统。
那么,有人知道Emacs服务器是否可以
- 向其他用户授予访问权限,或者
- 提供远程访问?
编辑
正如在rwb的回答中所评论的那样,很显然,通过运行emacsclient -c
在本地打开的新窗口实际上是由远程 Emacs服务器进程创build的。 也就是说, emacsclient
只是触发服务器中的相关行为。 这会导致一些显示设置不正确的问题,因为服务器通常不能访问本地桌面(见下文)。 但是,如果使用以下命令序列,则现在可以连接到远程Emacs会话:
在一个terminal中, 1.22.333.44
是1.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-file
find详细信息)打开一个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-dir
, server-auth-key
和server-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浪汉模式”