XDG_RUNTIME_DIRとは何ですか?


13

コマンドラインから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:

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


1
オペレーティングシステムについて詳しく教えてください。
DKボーズ

回答:


27

まず最初に:XDG_RUNTIME_DIR

最初の質問「XDG_RUNTIME_DIRとは」に答えるために 、ログイン時に自動的に設定される環境変数です。小さな一時ファイルを保存できるユーザー固有のディレクトリの場所を実行するプログラムに指示します。XDG_RUNTIME_DIRpam_systemd(8)によって設定されるため、実際にはX(プログラムをグラフィカルに実行する)に関連していないことに注意してください。

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

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

Xディスプレイ

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

echo $DISPLAY

また、次のようにsudo入力することで、ディスプレイの表示を確認できます

sudo -s
echo $DISPLAY
exit

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

XAUTHORITY

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

echo $XAUTHORITY
sudo -s
echo $XAUTHORITY
exit

場合は、XAUTHORITYあなたのためのあなたのホームディレクトリ内のファイルを指しているが、あなたが実行することのブランクはsudo、その後、問題だという。

FIX:環境変数を保存する

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

sudo -E evince

より良い方法:env_keep

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

sudo sudo -V

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

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

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

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

xhost si:localuser:root

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


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


精巧な答えをありがとう。すべてのユーザーの回答には、少なくとも新しいものがあると思います。(私にとって:Xへのアクセスを特定のユーザーに許可する方法。これはxhost +、ユニバーサルアクセスを許可するように発行するよりも優れています。)
drumfire

3

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

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

。としてグラフィカルエディタを実行しなければならないと決めた場合root、を読んman gksudo で利用してくださいgksudo


興味深いコメント。あなたはこのようなものにどのようにできるか知っていますか?どちらが重要journalctl -b -p err | wl-copyかを報告Failed to connect to a Wayland serverしますが、ユーザーPOVからは愚かに聞こえます。
mh-cbon
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.