リモートXディスプレイでウィンドウを開きます(「ディスプレイを開けない」理由)。


81

昔々、

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

ラップトップからデスクトップにsshすると、トーテムがmovie.aviデスクトップで再生されます。

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

No protocol specified
Cannot open display:

Debian squeezeが両方のコンピューターで安定した時点で再インストールしましたが、設定が壊れたと思います。

私はこれをグーグルで調べましたが、私の人生では自分が何をしているのか理解できません。

(VLCには動作するHTTPインターフェイスがありますが、sshほど便利ではありません。)

cronジョブからこれを実行しようとすると、同じ問題が発生します。


1
リモートマシンに.Xauthorityファイルが表示されていますか?他の明らかな質問は-あなたのsshサーバーとクライアントはX転送を許可するように設定されていますか?sshにどのコマンドを使用しましたか?
ファヒムミタ

1
Xを転送しようとしていますか?クライアントではなくホストでコマンドを実行したい。私のsshコマンドはssh me @ host Locateです。ホストコンピューター上の.Xauthorityはどのファイルとも一致しません。
ジャスティンクレス

Faheemが示唆しているように、totemX Cookieが見つからないことが原因で問題が発生しているためXAUTHORITY、適切な値、つまりデスクトップ上の通常のセッションの値に設定する必要があるという良い変化があります。Linuxの読み取りいくつかのバックグラウンドでssh + screen介してセッションを開始すると、wmctrlはディスプレイを開けません。関連する回答も参照してくださいルートとして、別のユーザーのデスクトップでグラフィカルプログラムを起動できますか?
ジル

1
大丈夫、物理的にコンピュータの前に座って、sshセッションにエコーの$ XAUTHORITYに/ var / runを与える/ gdm3 / AUTH-FOR-jcress-bb32gX /データベース入力し、エコーの$ DISPLAY =(上記のパス)を入力すると、問題が解決しません
ジャスティンクレス

1
私は、彼らは単に保持していることができなかった理由をGDM3、非難$XAUTHORITY~/.Xauthority誰もがそれがあることを期待ように。
アローマスター

回答:


78

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
    
  • あなたは、の値が検出できるDISPLAYXAUTHORITY、実行中のプロセスからの。これは自動化が困難です。作業するディスプレイに接続されているプロセスのPIDを把握し、/proc/$pid/environeval 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は、シェルメタキャラクターは含まれません。


2
これを自動化する1つの方法~/.xprofileは、Xログイン中にのみ実行されるを作成~/.Xauthorityし、正しい情報で作成/更新することです。シンボリックリンクで十分ですか?
アローマスター

@Arrowmaster:それは良い提案です。私はそれを考えていませんでした。すべてのケースで機能するわけではありません。たとえば、複数のXセッション(異なる端末で、vncを使用して...)にログインした場合など、単純であり、通常の使用には十分です。シンボリックリンクが最善の方法です。うーん、実際にはより良い、簡単な方法があります~/.Xauthority。情報をにコピーできます
ジル

1
以下のようなものを入れてしまうxauth extract - $DISPLAY | xauth -f "$HOME/.Xauthority" merge -における~/.xprofile複数の$ DISPLAY年代の事件を解決しますか?
アローマスター

@Arrowmaster:複数のディスプレイでどのような問題が見られますか?興味のあるディスプレイに関する情報のみを抽出しているため、原則としてコードは少し簡潔になりますが、質問者のケースでの単純なマージ、または実際には非常に珍しい状況以外では何も問題はありません。
ジル

1
ディスプレイに接続されている既存のプロセスから環境を読み取ることは、意外なことに悪意があるため、予想外です。私は心から承認します。Unix.SEには、このためにEvil Genius™バッジが必要です。
デロバート

19

追加することでこの問題を解決しました

xhost +si:localuser:$USER

~/.xprofile。これが完全に安全であるかどうかはわかりませんが(より知識のある人の意見を聞くのは非常に興味があります)、xhost +あなたが一般的に提案するように、アクセス制御を無効にするよりもはるかに優れていると推測していますこの問題についてはグーグル。


1
localuserサーバーが解釈するアドレスは完全に安全です。Debianは、デフォルトでログインプロセスの一部としてこれを行います(in /etc/X11/Xsession.d/35x11-common_xhost-local)。詳細については、Xsecurityのマニュアルページ参照してください。
サム・モリス

あなたがLANにしている場合は、xhost +ほとんどのケースで...おそらく十分である
アレクシス・ヴィルケ

このコマンドの意味を説明できますか?
alpha_989

@ alpha_989:「[$ USER]として実行されているローカルで実行されている[localuser]アプリケーションへのアクセスを許可[+]」という意味です。「SIは」ただのり(参照であるxhost(1)Xsecurity(7)ドキュメント用)。このコマンド自体で、いかなる種類のリモートアクセスやX11転送も許可されませ(通常、「マジッククッキー」メカニズムが優先されますxhost)。
ケビン

7

必要がある export DISPLAY=:0.0


いいえ。変数が同じ行に書き込まれている場合、Unixはエクスポートを必要としません。その変数は、行が終了するまで有効です。
アレクシスウィルケ

確かに、あなたは正しいです。
-asoundmove

この答えは明らかに間違っているため、削除する必要があります。
ピョートルドブロゴスト

DISPLAY =:0.0と入力するだけで変数名が設定されることを知らなかった。ありがとう@asoundmove。ただし、:0.0はサーバーディスプレイのDISPLAY変数の値だと思います。Puttyからログインしている場合、変数DISPLAYは10以上でなければなりません。DISPLAY =:10
alpha_989

3

私にとってはうまくいきます、debian wheezy-> ubuntu trusty。

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

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"
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.