web-dev-qa-db-ja.com

XDG_RUNTIME_DIRとは何ですか?

コマンドラインからEvinceを開こうとしていたときに、エラーが発生しました

neo@Muhammad:~$ Sudo evince

No protocol specified

** (evince:4164): WARNING **: Could not open X display
No protocol specified
error: XDG_RUNTIME_DIR not set in the environment.
Cannot parse arguments: Cannot open display:

この問題のトラブルシューティング方法

12
Muhammad Iliyas

まず最初に:XDG_RUNTIME_DIR

最初の質問「XDG_RUNTIME_DIRとは」に答えるために、これはログイン時に自動的に設定される環境変数です。実行するプログラムにユーザーの検索場所を通知します。 -小さな一時ファイルを保存できる特定のディレクトリ。 XDG_RUNTIME_DIRpam_systemd(8) によって設定されるため、実際にはX(プログラムをグラフィカルに実行)、これが問題のようです。

トラブルシューティング方法

2番目の質問「この問題のトラブルシューティング方法」は非常に良い質問です。つまり、修正がwhatだけでなく、自分で解決するhowにも興味があるということです。最初に、最初のエラーメッセージを見てください。特に、No protocol specifiedまたはWARNING **: Could not open X displayを検索すると、問題がXにあることがわかります。 (The X Windowing Systemとも呼ばれます)これは、グラフィカルプログラムが画面に表示される方法です。それを知ることで、多くのトラブルシューティングの質問が頭に浮かぶはずです。

Xディスプレイ

次の質問は、evinceが開けないこの "Xディスプレイ"とは何でしょうか? 「ディスプレイ」は、画面のアドレスです。[*] 画面に書き込みたいプログラムは、アドレスを知っている必要があります。 Xディスプレイが何であるかを確認するには、DISPLAY環境変数を確認します。

echo $DISPLAY

そして、次のように入力することで、SudoがDISPLAYをどう思うかを確認できます。

Sudo -s
echo $DISPLAY
exit

何も表示されない場合は、それが問題です。 (以下の修正を参照)。

XAUTHORITY

しかし、それが問題ではなく、DISPLAYSudoに正しく設定されている場合はどうなりますか?そして、あなたは疑問に思うかもしれません、Xは他のユーザーが書くことを妨げる何らかの許可を持っています私のディスプレイに?もしそうだと思うなら、あなたは正しいだろう、Xには2つの主要な認証方法があります: xauthおよびxhost。現在最も一般的に使用されているのは、 xauth(1) で、XAUTHORITY環境変数を使用します。繰り返しますが、Sudoに適切に設定されているかどうかを確認しましょう。

echo $XAUTHORITY
Sudo -s
echo $XAUTHORITY
exit

XAUTHORITYがホームディレクトリ内のファイルを指しているのに、Sudoを実行したときに空白になっている場合は、それが問題です。

FIX:環境変数を保存する

だから、修正は何ですか? DISPLAYまたはXAUTHORITY環境変数がSudo全体に保存されない場合、 Sudo(8)-Eオプションを使用して環境を保存するように指示できます。

Sudo -E evince

より良い方法:env_keep

あなたは、-Eがすべてを魔法のように動作させるなら、なぜそれがSudoのデフォルトではないのかと尋ねるでしょう。答えは、潜在的なセキュリティ上の危険があるということです。環境変数はプログラムの動作に影響を与えるため、すべてをユーザーアカウントからルートにエクスポートすることは望ましくありません。それを行う「正しい」方法は、 sudoers(8) を使用して、行Defaults env_keep += "DISPLAY XAUTHORITY"visudo(5) ファイルに追加することです。以下を実行することで、Sudoが保持する環境変数を確認できます。

Sudo sudo -V

(はい、Sudoを2回入力します)。デフォルトのsudoersファイル(/etc/sudoers)ではなく、システムをアップグレードしても上書きされないローカルファイルに行を配置することをお勧めします。次のようにできます:

Sudo visudo -f /etc/sudoers.d/local 

しかし、上記のいずれも機能しない場合はどうなるでしょうか?

これはかなり徹底した答えだと思いますが、まだ問題が解決しない場合は、他に提案することがあります。 xhost(1) を使用して、ローカルホスト(マシン)上の特定のユーザーにアクセスを許可することができます。

xhost si:localuser:root

この場合、rootはプログラムを実行するアカウントであるため、Sudoをユーザー名として指定しています。


[*]Q:画面が1つしかありませんが、Xディスプレイに「アドレス」が必要なのはなぜですか? A:Xマシン上だけでなく、インターネット上でも動作します。 Xを使用すると、他のインターネットホストに表示されるプログラムをマシンで簡単に実行できます。画面に表示される他のホスト上のプログラム(許可を与えた場合)。

21
hackerb9

XDG_RUNTIME_DIRは、プログラムが物を見つけることができるように、X Windowsコンテキストで設定される環境変数です。あなた(neo)はグラフィックスコンテキストを設定しました。

evincerootとして実行しようとすると、ユーザー(root)が別のユーザー(neo)ディスプレイにアクセスしようとしている状態になりました。これは悪いことと見なされます。

グラフィカルエディターをrootとして実行する必要がある場合は、man gksudoを読み、gksudoを使用してください。

3
waltinator