我知道在(start-server)
现有的 Emacs 会话中调用之后,我可以使用emacsclient -c
(在同一台计算机上)创建连接到该服务器的新帧,以便由创建的每个新帧emacsclient
都可以访问同一组共享状态(例如缓冲区)。
我发现的大多数文档都集中在“让我快速访问我的本地 Emacs”用例上,所以有两件事我还没有看到任何细节:
可以访问由其他
emacsclient -c
用户启动的 Emacs 服务器,还是硬连线只能检测由我自己的用户启动的会话?Emacs 服务器(直接或间接)是否支持远程连接?也就是说,是否有某种方法可以设置 Emacs(可能涉及 SSH),允许
emacsclient -c
对远程机器的调用访问我的 Emacs 服务器的本地状态?
(如果您还没有猜到,我最终想做的是结合上述两种技术来提供基本的协作编辑支持。)
这是一个现实世界的问题,所以这就是我正在处理的问题:
- 必要的功能应该已经内置在 Emacs 中(23.3.1,64 位)。我可以从标准的 Ubuntu 存储库扩展到 Emacs 扩展,但我不希望这样做。(可悲的是,我认为排除了Rudel。)
- 没有新用户或用户欺骗。解决方案应该使用现有的用户帐户集,并且用户不得假装是其他用户(例如通过
su
或ssh
)。
如果有什么不同的话,这些机器在私有 LAN 上,安装(并运行)OpenSSH 客户端和服务器,所有用户都可以连接到(他们自己的帐户)所有机器,但他们没有共享文件系统。
那么,有谁知道 Emacs 服务器是否可以
- 授予其他用户访问权限,或
- 提供远程访问?
编辑
正如 rwb 的回答中所评论的那样,很明显,通过运行在本地打开的新窗口emacsclient -c
实际上是由远程Emacs 服务器进程创建的。也就是说,emacsclient
只是简单地触发服务器中的相关行为。这会导致一些显示设置不正确的问题,因为服务器通常无法访问本地桌面(见下文)。但是,如果我使用以下命令序列,我现在可以连接到远程 Emacs 会话:
在一个终端中,1.22.333.44
IP 地址在哪里remotehost
:
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 服务器(它可以找到 in 的详细信息/tmp/server-file
)打开一个图形 Emacs 窗口(在本地显示器上),该窗口与远程主机上的 Emacs 会话共享状态。
由于远程 Emacs 服务器是通过 启动的ssh -X
,因此 SSH 为它提供了通过“假”显示访问我的本地显示的权限:10
。因此,DISPLAY=:10
传递给它(通过emacsclient
)会导致在我的本地桌面上打开一个窗口。
虽然上面的方法确实勾选了“在远程机器上运行 Emacs 服务器,使用emacsclient
本地连接到它”框,但它非常有限。实际上,以单个用户的身份在本地运行服务器和客户端并没有太大区别:唯一的区别是服务器现在是远程的,因此可以访问不同的系统资源。
不幸的是,通过启动ssh -X
是我能够在另一台机器的 X 服务器上成功打开窗口的唯一方法:
指定一个 basic
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上的帖子(从 '25 Oct 14:50' 帖子开始,大约一半)我开始怀疑这是否可能是Emacs 不能做的罕见事情之一(即不可能 ;-) )。
但是,如果有人确实有办法在没有上述权限错误的情况下提供对远程 X 显示器的访问,我仍然愿意说服......
TL;博士
正如 rwb 的回答所指出的那样,我上面关于 Emacs 是否可以授予远程访问的问题让事情倒退了。Emacs 授予其他用户访问权限并没有真正的问题(server-use-tcp
并且适当server-file
地处理这一点):问题是如何允许一台机器上的进程在其他用户的 X 显示器上打开新的 X 窗口(具体来说,Emacs 正在运行(start-server)
需要为通过emacsclient -c
) 要求它的用户打开窗口。这个答案超出了这个问题的范围。
替代解决方案
作为一种解决方法,我们使用以下方法:
- 机器0:
tmux -S /tmp/shared-tmux-socket new-session
- 机器1..机器N:
ssh -t machine0 tmux -S /tmp/shared-tmux-socket attach
具有适当的文件权限/tmp/shared-tmux-socket
。
然后我们在共享终端中运行一个文本模式的 Emacs。:-) 这确实引发了一些用户欺骗问题,但至少主人可以看到客人所做的一切。