情况
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
另一种方法是从服务器端在根窗口上设置自定义属性,例如xprop
。xprop
从客户端查询这些属性(再次使用)。
xprop -set Server_arch "$(uname -m)"