昔々、
DISPLAY=:0.0 totem /path/to/movie.avi
ラップトップからデスクトップにsshを実行すると、トーテムが movie.avi
を再生します。 デスクトップ上。
これでエラーが発生します:
No protocol specified Cannot open display:
両方のコンピューターで安定したときにDebiansqueezeを再インストールしましたが、構成が壊れたと思います。
私はこれをグーグルで検索しましたが、私が何をすべきかを一生理解することはできません。
(VLCには機能するHTTPインターフェースがありますが、sshほど便利ではありません。)
これをcronジョブから実行しようとすると、同じ問題が発生します。
承認された回答:
(Linuxから採用:セッションがssh + screenで開始された場合、wmctrlは表示を開くことができません)
表示と権限
Xプログラムは、Xディスプレイに接続するために2つの情報を必要とします。
-
ディスプレイのアドレスが必要です。通常は
:0
です。 ローカルにログインしているとき、または:10
、:11
、など。リモートでログインしている場合など(ただし、アクティブなX接続の数によって数が変わる可能性があります)。ディスプレイのアドレスは通常、DISPLAY
に表示されます 環境変数。 -
表示用のパスワードが必要です。 Xディスプレイのパスワードはマジッククッキーと呼ばれます 。マジッククッキーは直接指定されません。それらは常に「display
:42
」の形式のレコードのコレクションであるX典拠ファイルに保存されます。 クッキーを持っている123456
」。 X典拠ファイルは通常、XAUTHORITY
で示されます。 環境変数。$ XAUTHORITY
の場合 が設定されていない場合、プログラムは〜/ .Xauthority
を使用します 。
デスクトップに表示されているウィンドウを操作しようとしています。デスクトップマシンを使用しているのがあなただけの場合、表示名は:0
である可能性が非常に高くなります。 。 DebiansqueezeまたはUbuntu10.04で設定されたgdmを使用すると、ランダムに生成された名前のファイル内にあるため、X典拠ファイルの場所を見つけるのは困難です。 (以前のバージョンのgdmはデフォルト設定、つまり〜/ .Xauthority
に保存されたCookieを使用していたため、以前は問題はありませんでした。 。)
変数の値を取得する
DISPLAY
の値を取得するいくつかの方法を次に示します。 およびXAUTHORITY
:
-
デスクトップから、おそらくログインスクリプトで自動的に(
〜/ .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 $( ¹)。
Cookieのコピー
別のアプローチ(Arrowmasterによる提案に従う)は、 $ XAUTHORITY
の値を取得しようとしないことです。 sshセッションではありますが、代わりにXセッションでCookieを〜/ .Xauthority
にコピーします。 。ログインするたびにCookieが生成されるため、〜/.Xauthority
に古い値を保持しても問題ありません。 。
リモート管理者がその内容を表示できるようにするNFSまたはその他のネットワークファイルシステムを介してホームディレクトリにアクセスできる場合は、セキュリティの問題が発生する可能性があります。 X TCP接続を有効にしていない限り、何らかの方法でマシンに接続する必要があります(Debianではデフォルトでオフになっています)。したがって、ほとんどの人にとって、これは当てはまらない(NFSがない)か、問題ではない(X TCP接続がない)かのどちらかです。
デスクトップXセッションにログインするときにCookieをコピーするには、次の行を〜/ .xprofile
に追加します。 または〜/ .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
シェルのメタ文字は含まれません。