상태
Linux 서버는 다양한 Linux 및 OS X 시스템에 연결하기 위해 명령을 통해 XDMCP를 사용하는 XDMCP 지원 xdm을 실행하고 있습니다 X -query <server>
.
사용자가 로그인하면 지정된 메타 키를 사용하여 키보드를 통해 제어되는 창 관리자가 시작됩니다.
질문
할당하는 메타키는 Linux 서버에 연결된 상자의 플랫폼에 따라 다릅니다. 연결된 X 서버 뒤에 어떤 플랫폼이 있는지 어떻게 확인합니까?
아이디어
DISPLAY 환경 변수를 사용하여 열 수 없습니다. 연결 박스의 IP는 DHCP에 의해 할당됩니다. 연결 박스의 플랫폼이 무엇인지 알 수 없습니다.
나는 X의 -class 옵션을 사용하여 디스플레이 클래스를 설정할 수 있다는 것을 알고 있습니다. 그런 다음 Xresources의 다양한 디스플레이 클래스에 대한 기본값을 설정하는 데 사용할 수 있습니다. 하지만 명령줄(또는 일부 사용자 정의 C 프로그램)에서 연결된 Xserver의 클래스를 가져오는 방법을 모르고 더 나아가 해당 클래스로 구성된 Xresource의 값을 가져오는 방법도 모릅니다.
이상적으로는 X 서버를 실행하는 시스템에서 사용되는 메타키를 구성할 수 있으므로 새로운 유형의 플랫폼이 설정에 도입될 때 xdm을 실행하는 Linux 서버에서 재구성이 필요하지 않습니다.
이 문제를 해결하는 가장 좋은 방법은 무엇입니까? X 서버가 어떤 플랫폼에서 실행되고 있는지 확인할 수 있습니까? Xserver의 특정 구성 옵션을 창 관리자 스크립트로 전달할 수 있습니까? 이 문제를 해결하는 더 좋은 방법이 있습니까?
답변1
이 특별한 문제는 동일한 키 기호와 수정자가 모든 곳의 메타 키에 할당되도록 키맵을 설정하면 쉽게 해결됩니다.
서버에 대한 정보를 얻을 수 있습니다.데이터 베이스프로그램. 서버는 일부 속성을 정의합니다.xrdb
전처리를 통해 사용할 수 있도록 합니다. 인쇄를 이용하시면 됩니다 xrdb -symbols
. 예를 들어,
xrdb -Dsymbols | sed -n 's/-DSERVERHOST=//p'
X 서버의 호스트 이름을 인쇄합니다. C 전처리기 구조를 사용하여 특정 서버 호스트에 대한 특정 리소스를 정의할 수 있습니다.
#ifdef SRVR_darkstar
…
#endif
이것은 xrdb 기호를 쉘 환경 변수로 변환하는 쉘 스크립트입니다. 이와 같은 것을 사용하십시오 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)"