(Linuxからの適応:セッションがssh + screen経由で開始された場合、wmctrlはディスプレイを開くことができません)
表示と権限
Xディスプレイに接続するには、Xプログラムに2つの情報が必要です。
これは、ディスプレイのアドレスを必要とする一般的である:0あなたがローカルでログインしている場合や:10、:11などあなたがリモートでログインしているとき(その数は、接続がアクティブになっているどのように多くのXに応じて変更することができます)。ディスプレイのアドレスは通常、DISPLAY環境変数で示されます。
表示にはパスワードが必要です。Xディスプレイパスワードは、マジッククッキーと呼ばれます。マジックCookieは直接指定されません。それらは常にXオーソリティファイルに保存されます。これは、「display :42has cookie 123456」という形式のレコードのコレクションです。X権限ファイルは通常、XAUTHORITY環境変数で示されます。$XAUTHORITYが設定されていない場合、プログラムはを使用します~/.Xauthority。
デスクトップに表示されているウィンドウを操作しようとしています。デスクトップマシンを使用しているのがあなただけである場合、表示名はである可能性が非常に高くなり:0ます。Xオーソリティファイルの場所を見つけるのは困難です。なぜなら、gdmはDebian squeezeまたはUbuntu 10.04でセットアップされているため、ランダムに生成された名前のファイルにあるからです。(以前のバージョンのgdmはデフォルト設定、つまりに保存され~/.XauthorityたCookieを使用していたため、以前は問題ありませんでした。)
変数の値を取得する
以下にDISPLAYとの値を取得するいくつかの方法を示しますXAUTHORITY。
あなたは体系から(自分のログインスクリプトでは、おそらく自動的に、デスクトップからscreenセッションを開始することができます~/.profile。しかし、唯一のXの下でログインしている場合、それを実行します。テスト場合DISPLAYで始まる値に設定されている:(それはあなたがそうしているすべてのケースをカバーする必要がありますばったり会う))。で~/.profile:
case $DISPLAY in
:*) screen -S local -d -m;;
esac
次に、sshセッションで:
screen -d -r local
DISPLAYおよびの値をXAUTHORITYファイルに保存して、値を呼び出すこともできます。で~/.profile:
case $DISPLAY in
:*) export | grep -E '(^| )(DISPLAY|XAUTHORITY)=' >~/.local-display-setup.sh;;
esac
sshセッションで:
. ~/.local-display-setup.sh
screen
あなたは、の値が検出できるDISPLAYとXAUTHORITY、実行中のプロセスからの。これは自動化が困難です。作業するディスプレイに接続されているプロセスのPIDを把握し、/proc/$pid/environ(eval export $(</proc/$pid/environ tr \\0 \\n | grep -E '^(DISPLAY|XAUTHORITY)=')¹)から環境変数を取得する必要があります。
クッキーをコピーする
別のアプローチ(Arrowmasterの提案に従う)は$XAUTHORITY、sshセッションでの値を取得しようとせず、代わりにXセッションにそのCookieをにコピーさせること~/.Xauthorityです。Cookieはログインするたびに生成されるため、で古い値を保持しても問題はありません~/.Xauthority。
リモート管理者がその内容を表示できるようにするNFSまたはその他のネットワークファイルシステムを介してホームディレクトリにアクセスできる場合、セキュリティ上の問題が発生する可能性があります。X TCP接続を有効にしていない限り、彼らはまだ何らかの形であなたのマシンに接続する必要があります(Debianはデフォルトでそれらをオフにしています)。したがって、ほとんどの人にとって、これは適用されない(NFSなし)か、問題ではありません(X TCP接続なし)。
デスクトップXセッションにログインするときにCookieをコピーするには、~/.xprofileor ~/.profile(またはログイン時に読み取られる他のスクリプト)に次の行を追加します。
case $DISPLAY:$XAUTHORITY in
:*:?*)
# DISPLAY is set and points to a local display, and XAUTHORITY is
# set, so merge the contents of `$XAUTHORITY` into ~/.Xauthority.
XAUTHORITY=~/.Xauthority xauth merge "$XAUTHORITY";;
esac
¹ 原則として、これには適切な引用はありませんが、この特定の例$DISPLAYで$XAUTHORITYは、シェルメタキャラクターは含まれません。