コマンドラインから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:
この問題のトラブルシューティング方法
最初の質問「XDG_RUNTIME_DIRとは」に答えるために、これはログイン時に自動的に設定される環境変数です。実行するプログラムにユーザーの検索場所を通知します。 -小さな一時ファイルを保存できる特定のディレクトリ。 XDG_RUNTIME_DIR
は pam_systemd
(8) によって設定されるため、実際にはX(プログラムをグラフィカルに実行)、これが問題のようです。
2番目の質問「この問題のトラブルシューティング方法」は非常に良い質問です。つまり、修正がwhatだけでなく、自分で解決するhowにも興味があるということです。最初に、最初のエラーメッセージを見てください。特に、No protocol specified
またはWARNING **: Could not open X display
を検索すると、問題がXにあることがわかります。 (The X Windowing Systemとも呼ばれます)これは、グラフィカルプログラムが画面に表示される方法です。それを知ることで、多くのトラブルシューティングの質問が頭に浮かぶはずです。
次の質問は、evinceが開けないこの "Xディスプレイ"とは何でしょうか? 「ディスプレイ」は、画面のアドレスです。[*] 画面に書き込みたいプログラムは、アドレスを知っている必要があります。 Xディスプレイが何であるかを確認するには、DISPLAY環境変数を確認します。
echo $DISPLAY
そして、次のように入力することで、Sudo
がDISPLAYをどう思うかを確認できます。
Sudo -s
echo $DISPLAY
exit
何も表示されない場合は、それが問題です。 (以下の修正を参照)。
しかし、それが問題ではなく、DISPLAY
がSudo
に正しく設定されている場合はどうなりますか?そして、あなたは疑問に思うかもしれません、Xは他のユーザーが書くことを妨げる何らかの許可を持っています私のディスプレイに?もしそうだと思うなら、あなたは正しいだろう、Xには2つの主要な認証方法があります: xauth
およびxhost
。現在最も一般的に使用されているのは、 xauth
(1) で、XAUTHORITY
環境変数を使用します。繰り返しますが、Sudo
に適切に設定されているかどうかを確認しましょう。
echo $XAUTHORITY
Sudo -s
echo $XAUTHORITY
exit
XAUTHORITY
がホームディレクトリ内のファイルを指しているのに、Sudo
を実行したときに空白になっている場合は、それが問題です。
だから、修正は何ですか? DISPLAY
またはXAUTHORITY
環境変数がSudo
全体に保存されない場合、 Sudo
(8) に-E
オプションを使用して環境を保存するように指示できます。
Sudo -E evince
あなたは、-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を使用すると、他のインターネットホストに表示されるプログラムをマシンで簡単に実行できます。画面に表示される他のホスト上のプログラム(許可を与えた場合)。
XDG_RUNTIME_DIR
は、プログラムが物を見つけることができるように、X Windowsコンテキストで設定される環境変数です。あなた(neo
)はグラフィックスコンテキストを設定しました。
evince
をroot
として実行しようとすると、ユーザー(root
)が別のユーザー(neo
)ディスプレイにアクセスしようとしている状態になりました。これは悪いことと見なされます。
グラフィカルエディターをroot
として実行する必要がある場合は、man gksudo
を読み、gksudo
を使用してください。