这不是关于如何通过 ssh 转发 X 或如何设置 DISPLAY 以使转发的 X 正常工作的问题。那是另一个问题 - 如果您最终来到这里寻找答案,只需再进一步,因为您会发现 99% 的 X DISPLAY 问题都与此有关。
我的问题是如何选择DISPLAY 端口。也就是说,如果我这样做,ssh -X ...
然后用 检查 DISPLAY echo $DISPLAY
,我可能会看到localhost:10.0
或localhost:12.0
或类似的东西。它并不总是每次都相同,就像在前面的例子中一样,它一次包含 10,其他时间包含 12。我如何选择它,而不是每次都让它半随机?我想强制它始终选择 10.0 或始终 12.0 或其他任何值,只要它是一致的。
最好能找到一种适用于多显示器的解决方案。我经常有 2 或 3 个 X 服务器显示器 - 即:localhost:10.0、localhost:10.1、localhost:10.2 - 可以ssh X
成功连接并设置。但同样,它可能使用 10.0、10.1、10.2,也可能使用 12.0、12.1、12.2。无论它是什么,我都需要它保持一致。
我的具体用例:我在工作中使用软件,需要知道在哪里查找显示。每次 ssh 使用不同的 DISPLAY 值时,我都需要进入软件的配置文件并手动更改所有条目。这很麻烦,而且它真的应该是一种设置后就忘掉的事情 - 这就是我的问题。
我认为这个选择是由 ssh 在 ssh 服务器(X 客户端)端做出的。我认为 X 服务器不知道或不关心 X 客户端在本地将其视为“10.0”或它使用的任何内容。如果我错了,请纠正我,因为我不确定。
我没有看到 ssh 选择该值的任何选项。
最好不需要提升权限(root/admin)。我不明白为什么需要提升权限,但我只是先说明一下。如果您有一个需要 root 权限的答案,那总比没有答案好,我可能会使用它。
答案1
我认为您遇到的问题是 ssh 服务器无法保证其他人尚未使用(本地或远程转发)特定的显示号(和端口),因此它必须选择一个打开的。我不确定,但我推测它会尝试按顺序打开它们,并在第一个打开的端口处停止。任何打开的显示端口(包括一些因旧进程而未关闭的端口)都可能无限期地保持您想要的端口打开。
虽然不能保证,但您可以尝试X11DisplayOffset
在服务器的 中设置不同的值sshd_config
。这仍然无法阻止另一个用户甚至您的恶意进程占据第一个可用的 X 显示器/端口。
或者,您可以尝试手动将DISPLAY
变量(在服务器端)设置为一些“不寻常的”或高端口号,希望您可以避免使用通常使用的较低编号的端口。例如, pick DISPLAY=:76
,这意味着您需要将端口 6076 转发回本地 X 服务器;如果您不知道,TCP 端口 X 使用的端口是 6000 + DISPLAY 号(VNC 服务器通常使用 5900 + DISPLAY,IIRC)。您可以使用类似下面的方法在 ssh 调用中手动转发:
ssh -R6076:localhost:6000 server
这会将远程(服务器)端的 6076 端口转发回您的本地显示器(假设 DISPLAY :0)。这种方法的缺点是,现在您必须ssh
使用 -X 自动处理所有 XAuth 内容(请参阅另一个帖子提示),但它应该可以工作。YYMV 和繁琐的部分留给读者练习 ;-)。