リモートXモニターでウィンドウを開く(「モニターを開けません」理由)?

リモートXモニターでウィンドウを開く(「モニターを開けません」理由)?

昔々、

DISPLAY=:0.0 totem /path/to/movie.avi

トーテムは私のラップトップからSSHに接続した後、movie.avi私のデスクトップで再生されます。

これでエラーが発生します。

No protocol specified
Cannot open display:

Debian スクイズは両方のコンピュータで安定した後に再インストールしましたが、設定が壊れているようです。

私はこれをグーグルしましたが、一生の間に何をすべきかわかりません。

(VLCには利用可能なHTTPインターフェイスがありますが、SSHほど便利ではありません。)

cronジョブで実行しようとすると同じ問題が発生します。

答え1

(で適応Linux:ssh + screenを介してセッションを開始するとwmctrlがディスプレイを開くことができない)

表示と権限

XプログラムはXディスプレイに接続するために2つの情報が必要です。

  • 表示する必要があるアドレスは通常、:0ローカルにログインするときのアドレス、またはリモート:10:11ログインするときのアドレスです(ただし、この数はアクティブなX接続の数によって変わることがあります)。モニターのアドレスは通常、DISPLAY環境変数に表示されます。

  • パスワードを表示する必要があります。 X はパスワードが呼び出されたことを示します。魔法のクッキー。マジッククッキーは直接指定されません。常に:42「display has cookie」形式のレコード集であるX権限ファイルに保存されます123456。 X権限ファイルは通常環境変数に表示されますXAUTHORITY。設定しないと、$XAUTHORITYプログラムはを使用します~/.Xauthority

デスクトップに表示されたウィンドウで作業しようとしています。あなたがデスクトップコンピュータを使用している唯一の人なら、あなたの表示名はおそらくです:0。 X権限ファイルの場所を見つけるのは、Debian squeezeまたはUbuntu 10.04のgdm設定でランダムに生成された名前のファイルにあるため、難しいです。 (以前のバージョンのgdmでは~/.Xauthority

変数値の取得

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
    
  • 実行中のプロセスの値を検出できますDISPLAYXAUTHORITYこれは自動化するのがより困難です。使用したいモニターに接続されているプロセスのPIDを見つけたら、/proc/$pid/environ(1)でeval export $(</proc/$pid/environ tr \\0 \\n | grep -E '^(DISPLAY|XAUTHORITY)=')環境変数を取得する必要があります。

クッキーのコピー

他の方法(提案通りアローキング)は、sshセッションから値を取得しようとせずに$XAUTHORITYXセッションにCookieをコピーすることです~/.Xauthority。ログインするたびにクッキーが生成されるためです~/.Xauthority

リモート管理者がその内容を表示できるようにするNFSまたは他のネットワークファイルシステムを介してホームディレクトリにアクセスできる場合、セキュリティ上の問題が発生する可能性があります。 X TCP接続を有効にしない限り(DebianはデフォルトでX TCP接続を解除します)、何らかの方法でコンピュータに接続する必要があります。したがって、ほとんどの人にとってこれは適用されない(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

1原則として、正しい引用符が不足していますが、この特別な場合には$DISPLAYシェルメタ$XAUTHORITY文字は含まれません。

答え2

以下を追加して解決しました。

xhost +si:localuser:$USER

到着する~/.xprofile。これが完全に安全かどうかはわかりませんが(知識豊富な人の考えを聞きたい)、一般的に提案したxhost +ようにアクセス制御をオフにするよりもはるかに優れていると思います。問題をグーグルしています。

答え3

私にとって効果的です。 Debian wheezy - > Ubuntuは信頼できます。

注:この場合、サーバーはディスプレイマネージャを実行せずにグラフィックカードまたはモニタが接続されていない「ヘッドレス」仮想マシンです。

bob@laptop:~$ grep -iB 1 tcp /etc/gdm3/daemon.conf
[security]
DisallowTCP = false
bob@laptop:~$ ssh -C -R 6000:127.0.0.1:6000 alice@server
X11 forwarding request failed on channel 0
alice@server:~$ export DISPLAY=:0.0
alice@server:~$ xterm

ラップトップのXディスプレイには、サーバーで実行されているxtermの出力が表示されます。

デバッグを有効にする:

bob@laptop:~/tmp$ nc -v 127.0.0.1 6001
localhost [127.0.0.1] 6001 (x11-1) : Connection refused
bob@laptop:~/tmp$ nc -v 127.0.0.1 6000
localhost [127.0.0.1] 6000 (x11) open
alice@server:~$ nc -v 127.0.0.1 6000
Connection to 127.0.0.1 6000 port [tcp/x11] succeeded!*
alice@server:~$ strace xterm

straceそれが何をしているのかについての多くの詳細が漏洩し、あなたはそれがどこに立ち往生しているかを推測することができるでしょう - 接続を待っているようです。

一行で...

ssh -C -R 6000:127.0.0.1:6000 alice@server "DISPLAY=:0.0 xterm"

関連情報