情况

情况

情况

Linux 服务器正在运行支持 XDMCP 的 xdm,它通过命令使用 XDMCP 连接到各种不同的 Linux 和 OS X 机器X -query <server>

用户登录后,窗口管理器就会启动,这主要是使用指定的元键通过键盘进行控制。

问题

分配的元密钥需要取决于连接到 Linux 服务器的盒子的平台。如何确定所连接的 X 服务器背后的平台是什么?

想法

我无法使用 DISPLAY 环境变量来打开,连接盒的 IP 是由 DHCP 分配的,不知道连接盒的平台是什么。

我知道 X 的 -class 选项可用于设置显示类,然后可用于设置 Xresources 中各种显示类的默认值。但是我不知道如何从命令行(或一些自定义 C 程序)获取连接的 Xserver 的类,而且,我不知道如何获取使用该类配置的 Xresource 的值。

理想情况下,可以在运行 X 服务器的机器上配置所使用的元密钥,以便在设置中引入新类型的平台时,运行 xdm 的 Linux 服务器不需要任何重新配置​​。

解决这个问题的最佳方法是什么?是否可以确定 X 服务器运行的平台?是否可以将某些配置选项从 Xserver 传递到窗口管理器脚本?有更好的方法来解决这个问题吗?

答案1

如果您设置键盘映射,以便将相同的键符号和修饰符分配给各处的 Meta 键,那么这个特殊问题就很容易解决。


您可以通过以下方式获取有关服务器的一些信息数据库程序。服务器定义了一些属性xrdb通过预处理使其可用。您可以使用 打印出来xrdb -symbols。例如,

xrdb -Dsymbols | sed -n 's/-DSERVERHOST=//p'

打印 X 服务器的主机名。您可以使用 C 预处理结构为特定服务器主机定义特定资源:

#ifdef SRVR_darkstar
#endif

这是一个 shell 脚本,它将 xrdb 符号转换为 shell 环境变量。将它与类似的东西一起使用eval "$(xrdb_sh_prefix=X_ xrdb-sh)"

#!/bin/sh
# Access xrdb #define's from the shell

# For each binding that xrdb(1) would give to the preprocessor, print
# NAME=VALUE for -DNAME=VALUE.
# If $xrdb_sh_export is not empty, also print "export NAME".
# If $xrdb_sh_prefix is not empty, prefix it to each NAME in output.
# Shell metacharacters are preceded by `\' in VALUEs. NAMEs are
# assumed to be admissible C identifiers.
# Example:
#   xrdb_sh_export=y xrdb_sh_prefix=X_ xrdb-sh
# outputs somthing like
#    X_SERVERHOST=drongo
#    export X_SERVERHOST
#    X_VENDOR=The\ XFree86\ Project\,\ Inc
#    export X_VENDOR
# ...
# The output of this program is typically used in a Bourne shell thus:
#   eval "`xrdb_sh_prefix=X_ xrdb-sh`"

if [ -n "$xrdb_sh_export" ]; then
  awk_export='print "export " name'
fi
awk -v prefix="$xrdb_sh_prefix" '
  /^-D/ {
    $0 = substr($0, 3)
    eq = match($0, /=/)
    name = (prefix) (eq ? substr($0, 1, eq-1) : $0)
    if (eq) {
        $0 = substr($0, eq+1)
        sub(/^\"/, ""); sub(/\"$/, "")
        gsub(/[^0-9A-Z_a-z]/, "\\\\&")
    } else {
        $0 = ""
    }
    print name "=" $0
    '"$awk_export"'
  }
  /^exit=[0-9]+$/ {sub(/^.*=/, ""); exit $0}
' <<EOF
`{ xrdb "$@" -symbols || echo exit=$?; } | $sort || echo exit=$?`
EOF

另一种方法是从服务器端在根窗口上设置自定义属性,例如xpropxprop从客户端查询这些属性(再次使用)。

xprop -set Server_arch "$(uname -m)"

相关内容