假设我在机器上并使用 X11 转发通过 sshlocal
登录机器。remote
有什么方法可以让在 ssh 会话中运行的程序remote
知道它们正在显示吗local
?理想情况下,我想知道运行 X 服务器的计算机的主机名。我的目标是根据程序(emacs)显示的机器来导致不同的行为。
答案1
我认为 X 服务器不会向客户端报告其主机名。客户端应该知道他们要连接的主机名,但通过 SSH 连接,即localhost
使用 ssh 进行转发。
OpenSSH服务器设置SSH_CLIENT
环境变量;您可以从那里读取客户端的 IP 地址。这是服务器看到的地址,因此您无法区分同一 NAT 后面的计算机。这是 X 服务器的地址,前提是没有发生任何其他事情(SSH 转发、客户端上的远程 X 服务器……)。请注意,只有当 Emacs 是从该 SSH 连接中启动时,您才会在 Emacs 中获得环境变量,而如果您使用 emacsclient 在正在运行的 Emacs 中创建了框架,则不会获得该环境变量。
x-server-XXX
您可以使用 Emacs 中的函数、x-display-XXX
和 来获取显示器的某些属性(尺寸、颜色深度、X 供应商等)display-XXX
。
答案2
获取服务器名称的一种巧妙方法:
当服务器启动时,安排它将自己的名称放入根属性中:
xprop -root -f __SERVER_NAME__ 8s -set __SERVER_NAME__ "$(hostname -s)"
然后您可以使用
xprop -root __SERVER_NAME__
来获取名称。