当使用 X 转发的 ssh 时如何指定 `$DISPLAY`

当使用 X 转发的 ssh 时如何指定 `$DISPLAY`

当我ssh -X连接到服务器时,我将被分配一个$DISPLAY值,通常localhost:x.0x所有用户未使用的最低数字,从 10 开始。(例如,如果没有其他用户使用 $DISPLAY,则它是 10。如果某个用户已经在使用10,那么它将是 11,依此类推)

现在我的问题是:有没有办法x在执行 时指定一个数字ssh -X,例如100.

我的目的是让一个独立的程序在服务器上保持运行,并始终用作localhost:100.0其显示。这样,即使我失去了与服务器的 X 连接,我也可以重新登录并仍然建立连接,而localhost:100.0不必担心在我断开连接期间其他用户占用同一端口。与默认的 10 相比,选择 100 大的数字可以避免大部分被占用的可能性。

答案1

有没有办法在执行 ssh -X 时为 x 指定一个数字,例如 100。

不可以,因为不仅需要“分配”号码,ssh 还需要在该号码对应的本地套接字上转发 X 协议。并且不能保证 ssh 连接时“number”是空闲的。这就是为什么 ssh 没有为此提供选项。

然后,即使我丢失了与服务器的 X 连接,我可以重新登录并仍然建立与 localhost:100.0 的连接

这是行不通的,因为该服务器是您的 X 服务器当地的机器(您通过 ssh 登录的机器),并且客户端程序正在运行偏僻的机器。因此,所有客户端程序都需要重新建立连接(因为涉及状态)。

如果您想要可以重新连接的远程桌面,请考虑使用 VNC 之类的工具。

答案2

我找到了两种方法:


第一个

  1. 从本地机器,ssh -X remote
  2. 获取显示端口号echo $DISPLAY | awk -F'[:.]' '{print $2}',假设为10
  3. 检查远程端口 6020 是否被使用:lsof -i TCP:6020,假设没有使用
  4. 将端口6020转发到6010:ssh -NTR 6020:localhost:6010 localhost可选添加(使用-fexit时需要记住杀死此进程,推荐-ftrap "kill $!" EXIT
  5. 设置环境:DISPLAY=${DISPLAY/:10/:20}
  6. 更新~/.Xauthority以让显示端口localhost:20.0获得相同的 xauth 魔法密钥:xauth add $(xauth list :10 | sed 's/:10/:20/')

或者

  1. ssh 到远程而不使用-Xssh remote
  2. 在远程机器组中DISPLAY=localhost:20.0
  3. 在本地计算机中,将远程端口转发6020到本地计算机的 xserver 套接字/tmp/.x11-unix/X0ssh -NTR 6020:/tmp/.x11-unix/X0 remote,可选地添加-f
  4. 将本地计算机的 xauth 密钥传输到远程计算机:在 local 中xauth list :0,假设它是local-hostname:0 MIT-MAGIC-COOKIE-1 hash
  5. 在远程机器中:执行xauth add remote-hostname:20 MIT-MAGIC-COOKIE-1 hash.

对比这两种方法,第一种不需要将本地机器的xauth key传输到远程机器,这或许更安全(任何专家都可以告诉我如果我这样做会引发什么潜在的安全问题吗?)。但它需要占用两个端口:一个是自己分配的端口ssh -X,另一个是你要使用的端口。

答案3

我知道没有办法指定显示。

在 Linux 上(或者至少在 Ubuntu 上),显示器只是/tmp/.X11-unix/.例如:/tmp/.X11-unix/X0是显示:0

因此,您可以将任何套接字移动到任何其他路径,它仍然可以工作。 (我不确定 ssh 转发的 X 连接是否如此,但可能是。)

(顺便说一句,ssh -Y可能比 更安全ssh -X,但我已经很久没有使用过任何一个了。)

在任何情况下,如果套接字关闭(由于 SSH 连接结束),则在该套接字上运行的任何程序都可能退出。

如果您想运行持久的 X 程序,请考虑运行 VNC 服务器,并使用 VNC 客户端连接到它。您可以使用 SSH 安全地建立 VNC 连接隧道。我经常这样做。我相信您可以在“虚拟”显示器上运行 VNC 服务器(这意味着您只能在连接 VNC 客户端时才能看到该显示器),但我从未这样做过。

更新

因此,通过 SSH 进行 X11 转发可能涉及 3 个要素:

  1. 某个端口的 TCP 套接字
  2. DISPLAY 变量
  3. 处理 X 权限要求的某种形式

所有这三项都可以手动完成。您可以使用手动转发任何端口-R。您可以手动设置显示。您可以(可能?)以某种方式手动调整 X 权限设置。处理X权限可能是最棘手的,我不知道该怎么做,但我怀疑它可以做到。

如果执行 1、2 和 3,则应该能够在不使用-X或 的情况下转发 X11 连接-Y

我仍然怀疑大多数 X 程序在与服务器的连接关闭时会退出。

我仍然相信设置 VNC 服务器和客户端会给你带来更好的结果。

相关内容