Pau*_*ker 49 collaboration emacs remote-access emacsclient tmux
我知道在我调用(start-server)
现有的Emacs会话后,我可以使用emacsclient -c
(在同一台计算机上)创建连接到该服务器的新帧,这样创建的每个新帧emacsclient
都可以访问同一组共享状态(例如缓冲区) ).
我发现的大多数文档都集中在"让我快速访问我的本地Emacs"用例,所以有两件事我还没有看到任何细节:
可以emacsclient -c
访问由其他用户启动的Emacs服务器,还是仅通过硬连线检测我自己的用户启动的会话?
Emacs服务器(直接或间接)是否支持远程连接?也就是说,有没有办法设置Emacs(可能涉及SSH),允许远程机器emacsclient -c
上的调用访问我的Emacs服务器的本地状态?
(如果你还没有猜到,我最终想要做的是结合上面的两种技术来提供基本的协作编辑支持.)
这是一个现实世界的问题,所以这就是我正在使用的:
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))'"
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
.这个答案超出了这个问题的范围.
替代方案
作为解决方法,我们使用以下内容:
tmux -S /tmp/shared-tmux-socket new-session
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-key
和server-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窗口.
Aaron Gallagher实施了一个解决方案:http://blog.habnab.it/blog/2013/06/25/emacsclient-and-tramp/
它的工作原理(AFAIU)如:
我在他的博客文章中添加了一条评论,建议在emacs-devel上讨论和增强这个想法.
归档时间: |
|
查看次数: |
20901 次 |
最近记录: |