昨夜、debianをマシンにインストールしました。現在、rootとして実行しているときに端末からGUIアプリを実行できない理由がわかりません。
例えば:
Sudo -i
glxgears
次の出力を生成します。
No protocol specified
Error: couldn't open display :0
しかし、最初にターミナルを開いたとき、ユーザーアカウントからglxgears
を実行できます。それは私がやった後だけですSudo -i
問題が発生します。これは、実行しようとするGUIアプリで発生します。おそらくX11に関連していると思いますが、よくわかりません。
Xサーバーにアクセスするには、次の2つが必要です。
$DISPLAY
変数(通常は:0
)認証情報は$XAUTHORITY
を介して明示的に指定でき、それ以外の場合のデフォルトは~/.Xauthority
です。
$DISPLAY
と$XAUTHORITY
がユーザーに設定されている場合、Sudo
もそれらを新しいシェルに設定し、すべてが正常に動作するはずです。
それらが設定されていない場合、おそらくデフォルトで間違った値になり、Xアプリケーションを起動できません。
Debianでは通常、$XAUTHORITY
は明示的に設定されていません。追加するだけ
export XAUTHORITY=~/.Xauthority
.bashrc
に、または明示的にXAUTHORITY=~/.Xauthority Sudo ...
と言うと、すべてが機能するはずです。
xauth list
を使用して、適切な認証情報が利用可能かどうかを確認することもできます。
私はあなたと同じ質問をしましたが、普通のユーザーです。ユーザーアカウントfooを使用してfirefoxを起動するとします。私はバーとしてログインしています:
[bar@localhost ~]$ 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でテストされました)。
あなたはどちらか
-display :0.0
を追加して、コマンドラインで使用するディスプレイを指定します
または
Rootのログインスクリプトで環境変数を設定します(.bashrc、.profile、.bash_profile ...のいずれか)。
export DISPLAY=:0.0
設定されているか確認できます
$ env |grep DISPLAY
DISPLAY=:0.0
すべてのホストのすべてのユーザーのディスプレイを通常のユーザーとして開くには、次のようにします。
xhost +
Debianを使用している場合、シンプルでサポートされているソリューションは、Sudo
がX11認証資格情報をコピーするように手配することです。 pam_xauth
は、まさにこの目的のためにlibpam-modules
パッケージに含まれています。それを使用するには、追加する必要があります
session optional pam_xauth.so
/etc/pam.d/Sudo
ファイルに。 su
に追加することもできます。完全な情報については、もちろんpam_xauth
のマニュアルページを参照してください。
私を助けたもの:
user
側でxauth generate :0 . trusted
を実行すると、新しいMIT-MAGIC-COOKIE-1
が生成されますxauth list' as
user and
root(they should be the same if your
xAuthority`変数で新しく作成されたキーが同じファイルを指していることを確認します。
出来上がり、root
はターミナルから任意のX-App
にアクセスしますが、一時的なものです。
永続化するには、@ Huygensの回答を参照してください!
代替ソリューション:
現在のxユーザーがrootでない場合、rootで実行されているcronなどのサービスは表示にアクセスできません。
Rootユーザーをxに追加するだけで、ログイン時に起動スクリプトを使用して追加できます
xhost local:root
テストの目的で、現在のユーザーの下でコマンドを実行し、ルートスクリプト/ジョブ/サービス/ ...を再起動することができます。
Sudo
コマンドには、環境変数を保持するためのスイッチがあります。
-E, --preserve-env preserve user environment when running command
そのため、-Eスイッチを指定してコマンドを実行できます。例:
Sudo -E wireshark
Webブラウザーなどのプライバシーが重要なアプリケーションを実行する必要がない場合は、Sudoで-Eスイッチを追加することをお勧めします。 Chromeまたは-Eスイッチを追加するだけでFirefoxを実行することはできません。多くのブラウザがユーザー空間違反に対する保護を実装しているため。@huygensの answer はこの問題について洞察を持っているかもしれません。
注:ユーザーの環境にDISPLAY
およびXAUTHORITY
すでに正しく設定されています。