web-dev-qa-db-ja.com

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

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

例えば:

Sudo -i
glxgears

次の出力を生成します。

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

しかし、最初にターミナルを開いたとき、ユーザーアカウントからglxgearsを実行できます。それは私がやった後だけですSudo -i問題が発生します。これは、実行しようとするGUIアプリで発生します。おそらくX11に関連していると思いますが、よくわかりません。

41
Octopus

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

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

認証情報は$XAUTHORITYを介して明示的に指定でき、それ以外の場合のデフォルトは~/.Xauthorityです。

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

それらが設定されていない場合、おそらくデフォルトで間違った値になり、Xアプリケーションを起動できません。

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

export XAUTHORITY=~/.Xauthority

.bashrcに、または明示的にXAUTHORITY=~/.Xauthority Sudo ...と言うと、すべてが機能するはずです。

xauth listを使用して、適切な認証情報が利用可能かどうかを確認することもできます。

40
michas

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

[[email protected] ~]$ Sudo -u foo -H firefox

残念ながら、そのコマンドは質問と同じエラーで失敗しました(つまり、プロトコルが指定されておらず、ディスプレイを開くことができません)

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

xhost si:localuser:foo

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

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

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

25
Huygens

あなたはどちらか

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

または

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

export DISPLAY=:0.0

設定されているか確認できます

$ env |grep DISPLAY
DISPLAY=:0.0

すべてのホストのすべてのユーザーのディスプレイを通常のユーザーとして開くには、次のようにします。

xhost +

10
X Tian

Debianを使用している場合、シンプルでサポートされているソリューションは、SudoがX11認証資格情報をコピーするように手配することです。 pam_xauthは、まさにこの目的のためにlibpam-modulesパッケージに含まれています。それを使用するには、追加する必要があります

session  optional  pam_xauth.so

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

3
Toby Speight

私を助けたもの:

  1. user側でxauth generate :0 . trustedを実行すると、新しいMIT-MAGIC-COOKIE-1が生成されます
  2. xauth list' asuser androot(they should be the same if yourxAuthority`変数で新しく作成されたキーが同じファイルを指していることを確認します。

  3. 出来上がり、rootはターミナルから任意のX-Appにアクセスしますが、一時的なものです。

永続化するには、@ Huygensの回答を参照してください!

2
Timo

代替ソリューション:

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

Rootユーザーをxに追加するだけで、ログイン時に起動スクリプトを使用して追加できます

xhost local:root

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

1
intika

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

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

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

Sudo -E wireshark

Webブラウザーなどのプライバシーが重要なアプリケーションを実行する必要がない場合は、Sudoで-Eスイッチを追加することをお勧めします。 Chromeまたは-Eスイッチを追加するだけでFirefoxを実行することはできません。多くのブラウザがユーザー空間違反に対する保護を実装しているため。@huygensの answer はこの問題について洞察を持っているかもしれません。

注:ユーザーの環境にDISPLAYおよびXAUTHORITYすでに正しく設定されています

0
shan