gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 14:05:14 50 4
gpt4 key购买 nike

我打电话后才知道(start-server)在现有的 Emacs session 中,我可以使用 emacsclient -c (在同一台计算机上)创建连接到该服务器的新框架,以便由 emacsclient 创建的每个新框架可以访问同一组共享状态(例如缓冲区)。

我发现的大部分文档都集中在“让我快速访问本地 Emacs”用例上,因此有两件事我还没有看到任何细节:

  • 可以 emacsclient -c访问由其他用户启动的 Emacs 服务器,还是仅检测由我自己的用户启动的 session 是硬连接的?
  • Emacs 服务器(直接或间接)支持远程连接吗?也就是说,是否有某种方法可以设置允许调用 emacsclient -c 的 Emacs(可能涉及 SSH)。在远程机器上访问我的 Emacs 服务器的本地状态?

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

    这是一个现实世界的问题,所以这是我正在处理的问题:
  • 必要的功能应该已经内置到 Emacs 中(23.3.1,64 位)。我可以从标准的 Ubuntu 存储库扩展到 Emacs 扩展,但我不想这样做。 (遗憾的是,我认为这排除了 Rudel。)
  • 没有新用户或用户欺骗。解决方案应适用于现有的用户帐户集,并且用户不得伪装成其他用户(例如,通过 sussh )。

  • 如果有什么不同的话,这些机器都在一个私有(private) LAN 上,安装(并运行)了 OpenSSH 客户端和服务器,并且所有用户都可以连接到(他们自己的帐户)所有机器,但他们没有共享文件系统。

    那么,有没有人知道Emacs服务器是否可以
  • 授予其他用户访问权限,或
  • 提供远程访问?

  • 编辑

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

    在一个终端,其中 1.22.333.44remotehost的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 中找到详细信息)打开一个图形 Emacs 窗口(在本地显示器上),该窗口与远程主机上的 Emacs session 共享状态。

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

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

    不幸的是,通过 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 的帖子(从 '25 Oct 14:50' 帖子开始,大约一半)我开始怀疑这是否可能是 Emacs 不能做的罕见事情之一(即不可能 ;-) )。

    但是,如果有人确实有办法在没有上述权限错误的情况下提供对远程 X 显示的访问权限,我仍然愿意说服......

    TL;博士

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

    替代解决方案

    作为一种解决方法,我们使用以下方法:
  • 机器 0: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。 :-) 这确实提出了一些欺骗用户的问题,但至少主持人可以看到客人正在做的一切。

    最佳答案

    我认为根据定义,您所要求的内容是不可能的,因为如果您授予远程用户不受限制地访问您的 Emacs 的权限,这与让该远程用户通过 ssh 访问 shell 一样多“用户欺骗”。明确地说,从安全的角度来看,这可能是一个坏主意。

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

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

    听起来您正在考虑从后到前,因为与直觉相反,在网络术语中,X11 显示器是服务器,而 X11 应用程序是客户端。这是令人惊讶的,因为通常显示对用户来说是本地的,并且应用程序在某个远程服务器上运行。

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

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

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

    host-r$ ps -ef | grep X

    接下来,让 host-r 的用户运行以下命令,并将输出发送给您。如果您愿意,请务必警告他们,这将允许您完全控制他们当前的桌面 session 。
    host-r$ xauth list $DISPLAY
    host-r/unix:0 MIT-MAGIC-COOKIE-1 01234567890abcdef0123456789abcd

    这实际上是显示器的“密码”。在 host-l 上,把它放在 Emacs 可以找到的地方:
    host-l$ xauth add host-r:0 MIT-MAGIC-COOKIE-1  01234567890abcdef0123456789abcd

    现在输入 M-x make-frame-on-display host-r:0 并且应该在远程显示器上弹出一个 Emacs 窗口。

    关于emacs - 作为其他用户在其他机器上使用 Emacs 服务器和 emacsclient,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12546722/

    50 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com