「ルート」からGUIアプリを実行できないのはなぜですか:「プロトコルが指定されていません」?


38

昨夜、マシンにdebianをインストールしました。現在、rootとして実行しているときに、ターミナルからGUIアプリを実行できない理由がわかりません。

例えば:

sudo -i
glxgears

次の出力を生成します。

No protocol specified
Error: couldn't open display :0

しかし、最初に端末を開くとglxgears、ユーザーアカウントから実行できます。そのことをしsudo -iて初めて問題が発生します。これは、実行しようとするGUIアプリで発生します。おそらくX11に関連していると思いますが、よくわかりません。


1
stackoverflow.com/a/20612084 これは私にとって完璧に機能しました。

回答:


39

Xサーバーにアクセスするには、2つのことが必要です。

  • $DISPLAY正しい表示を指す変数(通常:0
  • 適切な認証情報

認証情報はを介して明示的に指定できますが$XAUTHORITY、デフォルトでは~/.Xauthorityそうではありません。

場合$DISPLAY$XAUTHORITY、ユーザーのために設定されている、sudoあまりにも、新しいシェルのためにそれらを設定し、すべてが正常に動作するはずです。

設定されていない場合は、デフォルトで間違った値が設定されている可能性があり、Xアプリケーションを起動できません。

Debian $XAUTHORITYでは通常、明示的に設定されていません。追加するだけ

export XAUTHORITY=~/.Xauthority

あなた.bashrcまたは明示的に言うXAUTHORITY=~/.Xauthority sudo ...とすべてが動作するはずです。

xauth list適切な認証情報が利用可能かどうかを確認するためにも使用できます。


1
xauth info権限ファイルへのパスを示しています
トマストメチェク

1
xhost +私の問題を修正
-danger89

3
xhost +認証が完全に無効になり、すべてのユーザーが画面上のすべてのアプリケーションにアクセスできるようになることに注意してください
...-michas

1
Debianでは、XAUTHORITYエクスポートをルートとして入力しますか?deb10で動作していないのですか?sudo su
marinara

@marinaraはのsudo -i代わりに使用しますsudo su -
ミカ

23

私はあなたと同じ質問をしましたが、普通のユーザーについてです。ユーザーアカウントfooを使用してfirefoxを起動したいとします。私はバーとしてログインしています:

[bar@localhost ~]$ sudo -u foo -H firefox

悲しいことに、質問と同じエラーでコマンドが失敗しました(つまり、プロトコルが指定されておらず、ディスプレイを開けません)

私の解決策は、ユーザーfooをXサーバーへの許可されたアクセスのリストに単に追加することでした。

xhost si:localuser:foo

これで、Firefox(および他のXアプリケーション)を使用して起動できました sudo、ユーザーfooして。

背景:X Windowには、クライアント/サーバーアーキテクチャがあります。アプリケーションを起動すると、Xサーバーの承認を要求して表示します。デフォルトでは、セッションを開く(グラフィカルにログインする)と、ユーザー(ユーザー)は明らかにサーバーと通信してアプリケーションを表示することができます。指定しない限り、他のユーザーにはこの権限がありません。xhost権限のリストを操作するツールです。これsiは、ルールがサーバー側であり、ローカルユーザーfooディスプレイ用途に。Xウィンドウはこの点で非常に強力であり、DISPLAY環境変数and xhost(ただしそれらに限定されない)で遊ぶことにより、リモートアプリケーションをローカルに表示できます。昔、人々がタイプしたときxhost + 暗黙的に誰もがXセッションを使用できるようにしたため、いたずらのためにアプリケーションを画面に表示することができました;-) X Windowクライアント/サーバーアーキテクチャを使用する人が少なくなっている現在ではあまりありません(少なくとも、過去10年)。

PS:Firefoxを一種の「刑務所」で起動するために(将来pdf.jsのような脆弱性を回避するために)これを行いました。しかし、sudo経由でFirefoxを呼び出すと、オーディオやビデオハードウェアにアクセスできないことがすぐにわかりました。しかし、sudo経由でFirefoxを呼び出すときに、ビデオハードウェアアクセラレーションとオーディオをアクティブする方法を明確に説明している人がいます。YMMVとこれらの指示。たとえば、音声で拒否された許可がまだありますが、ビデオは正常です(SELinux ONでFedora 22でテスト済み)。


1
私の場合fooroot、つまりxhost si:localuser:rootUbuntu 17.10で実行する必要がありました。
カールリヒター

xhost si:localhost<user>コマンドをどこに追加しますか?ログオンしているユーザーがいない場合は、許可を与えるXサーバーを使用できるユーザーはいません。
cbcoutinho

@cbcoutinho上記の使用例は、誰かがログオンしていて、同じホストで他の誰かとしてXWindowアプリケーションを実行したい場合です。ユースケース(解決したい問題は何か)を説明していただければ、私は潜在的にあなたを助けることができます。
ホイヘンス

@Huygens流体をシミュレートするワークステーションがあり、GPUも装備されています。私ParaViewvtk、通常はワークステーション自体に構築されたプログラムでビジュアライゼーションをレンダリングします。ParaViewまた、sshを介して安全なヘッドレスクライアント/サーバーレンダリングモデルを提供します。これは、VNCを使用する代わりにリモートを利用したいです。ワークステーションにログインして実行しxhostないと、GPUを利用できません。つまり、マシンをリモートで再起動できず、GPUにアクセスできます。
cbcoutinho

1
@cbcoutinho X Windowは、クライアントサーバーアーキテクチャです。ssh経由で接続すると、ローカルワークステーションがクライアントXウィンドウになります。rloginなどの安全でないプロトコルでxhostを使用できますが、sshは使用できません。sshに指示する必要があります。sshで-Xor(より良い?)-Yフラグを使用すると、適切なリダイレクトが行われます。もちろん、ローカルCサーバーが必要です。しかし、GPUとOpenGLでは、レンダリング/計算がどこで行われるかはわかりませんが、おそらくサーバー側ではなくクライアント側にあります。難しいかもしれません。
ホイヘンス

10

あなたはどちらか

以下を追加して、コマンドラインで使用するディスプレイを指定します -display :0.0

または

ルートのログインスクリプト(.bashrc、.profile、.bash_profile ...のいずれか)に環境変数を設定します。

export DISPLAY=:0.0

設定されているかどうかを確認できます。

$ env |grep DISPLAY
DISPLAY=:0.0

すべてのホストのすべてのユーザーに対して通常のユーザーとして表示を開くには、次のようにします。

xhost +


1
xhost +は、sudoに入る前の一時的な手段として動作します
タコ14年

1
xhost +私のためにも働いたが、彼らはの下の端末からではなく、許可しているユーザーの端末から実行することを言及するのを忘れていただけだsudo su
-nyxee

1
ブームのような完璧な仕事
Adiii

3

Debianを使用している場合、シンプルでサポートされている解決策はsudo、X11認証資格情報のコピーを手配することです。 まさにこの目的のためにパッケージにpam_xauth含まれていlibpam-modulesます。それを使用するには、追加するだけです

session  optional  pam_xauth.so

あなたの/etc/pam.d/sudoファイルに。に追加することもできますsu。完全な情報についてはpam_xauth、もちろんmanページを参照してください。


2

何が私を助けました:

  1. あなたxauth generate :0 . trusteduser側で、新しいを生成することができますMIT-MAGIC-COOKIE-1
  2. xauth list' asユーザーandルートの(they should be the same if yourxAuthority`変数が同じファイルを指している、新しく作成されたキーを確認します。

  3. 出来上がり、端末からroot任意にアクセスしますX-Appが、一時的です。

永続的にするには、@ Huygensの回答をご覧ください!


1

代替ソリューション:

ルートの下で実行されているcronなどのサービスには、現在のxユーザーがルートでない場合に表示するアクセス権がありません。

ルートユーザーをxに追加するだけで、ログイン時にスタートアップスクリプトで実行できます。

xhost local:root

テストのために、現在のユーザーの下でコマンドよりも実行し、ルートスクリプト/ジョブ/サービス/を再起動することができます...


好奇心が強いのですが、なぜcron経由でGUIアプリを実行するのでしょうか?
タコ

私のディストリビューションでは、私は、システムのセキュリティ状態をチェックし、レポートを作成し、ルートcronジョブ(ミリ秒)を持っている...ので、代わりに私は、そのジョブの実行時にレポートしてポップアップGUIを持つことを好む、そのレポートを確認するために、ログに行きます
intika

これは私のために働いた
マーカス・ビニシウス・ポンペウ

0

このsudoコマンドには、環境変数を保持するためのスイッチがあります。

 -E, --preserve-env            preserve user environment when running command

そのため、-Eスイッチを使用してコマンドを実行できます。例:

sudo -E wireshark

Webブラウザのようなプライバシーが重要なアプリケーションを実行する必要がない場合は、sudoで-Eスイッチを追加する方が良いでしょう。-Eスイッチを追加するだけではChromeまたはFirefoxを実行できません。多くのブラウザがユーザースペース違反に対する保護を実装しているためです。@huygensの答えには、この主題に関する洞察があるかもしれません。

注:ユーザーの環境がなく DISPLAY XAUTHORITY 正しく設定されている場合、-Eスイッチを追加しても役に立ちません


-1

このコマンドを使用すると動作します

sudo cp /home/user/.Xauthority .Xauthority

2
これcp: cannot stat ‘/home/user/.Xauthority’: No such file or directoryにより、私がアクセスできるDebianベースの10以上のマシンのいずれかが提供されます。
Anthonの

これにより、少しのコンテキストが得られ(たとえば、現在のディレクトリを静かに期待します)、複数のX11インスタンスで行う場合のトラブルなどの副作用については言及しません。この方法は少しハックがあると思います。
v6ak
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.