PuTTY X11 proxy: Authorisation not recognisedの対処法(Windows)

Xウィンドウのアプリケーションも便利に動くようになって、慣れてきたときに次のエラーメッセージが出てソフトを起動でないことがありませんか。今回はこの問題を解決する方法を考えてみましょう。

pi@RPi-Dev:~$ sudo gparted
PuTTY X11 proxy: Authorisation not recognised
(gpartedbin:2613): Gtk-WARNING **: cannot open display: localhost:10.0

Windows+Xming系Xサーバ+PuTTYでラズベリーパイにアクセスしてると時々見かけるこのエラーは、実は必ずsudoもしくはsuなどを使ってroot権限でウィンドウを開くアプリケーションを実行しようとしたときに発生します。

PuTTYのX11 Fordingオプションをオンにすると、Xアプリとサーバ間の通信がsshを通して行われるようになります。これがどのように行われているかと言えば、sshをオープンした時にMIT-Magic-Cookie-1という電子鍵を相手に渡します。これはPuTTYでX11Forwardingをオンに指定されているプロトコルです。

Clipboard02
このとき渡した電子鍵はユーザディレクトの下の.XAuthorityの中に保存されます。Xアプリケーションが起動するときにはこれをウィンドウズ側のXサーバに渡します。この鍵を参照にしてXサーバはXアプリケーションを画面に表示することを許します。

さて、sudoでルートになった場合、この鍵はどうなるでしょうか?試しにsudo -sでルートになってみて、rootのホームディレクトをls -la /rootしてください。あるべき.Xauthorityが存在しないと思います。ここに鍵が存在しないわけですから、sshを経由して通信できないということになります。linuxには便利なgksuというコマンドがあり、これを回避できるのですが、Xming系のXサーバでは正しく動きません。

この問題を回避するには、ユーザが保持している鍵をルートが入手必要があるということです。それで、次が具体的な手順になります。

方法1:鍵を直接インポートする

強引な方法ですが、ユーザが保存している鍵を直接rootに渡してしまうと動きます。次のコマンドがその手順です。

pi@RPi-Dev:~$ xauth list
RPi-Dev/unix:10  MIT-MAGIC-COOKIE-1  5cxxxxxxxxxxxxxxxxxxxxxxxxxxx3d3
RPi-Dev/unix:11  MIT-MAGIC-COOKIE-1  29wwwwwwwwwwwwwwwwwwwwwwwwwwwa92
pi@RPi-Dev:~$ sudo -s
root@RPi-Dev:/home/pi# xauth add RPi-Dev/unix:10  MIT-MAGIC-COOKIE-1  5c5cxxxxxxxxxxxxxxxxxxxxxxxxxxxd3
root@RPi-Dev:/home/pi# xauth add RPi-Dev/unix:11  MIT-MAGIC-COOKIE-1  29wwwwwwwwwwwwwwwwwwwwwwwwwwwww92

コマンドxauth listは、現在手持ちの鍵を表示するコマンドで、これはユーザモードで表示させます。xauth addは名前の通り鍵を追加するコマンドで、先に表示された鍵を使います。この追加が終わったら、問題なくルートでもXのGUIプログラムが表示できます。

方法2:実行環境をユーザにする

方法1は、rootに対してとはいえ、ユーザのキーを直接渡してしまうことは気が引けます。また、コピーしてペーストするのも手間ですね。なのでもうちょっと別の方法を考えてみましょう。

要はユーザが保存している/home/(user)/.Xautthorityをrootがデフォルトで読めればよいわけです。ちょうどよいことにsudoには-Eオプションで、rootになったときにユーザの環境変数をすべて引き継ぐオプションがあります。つまり、ルートのHOME自体が/home/(user)になるので、当然/home/(user)/.Xauthorityをルートがアクセスすることになります。

$ sudo -E gparted &

方法3:環境変数だけを受渡す

実は方法2はセキュリティ上、お勧めできるものではありません。rootはrootの環境変数、パス、設定で起動されるべきです。sudo -Eで実行すると、rootのホームディレクトリ自体はユーザディレクトリ、さらに環境変数もユーザが設定したものになり、思わぬ失敗を引き起こしかねません。

そこで、XAUTHORITYという環境変数だけをrootに渡すようにします。XAUTHORITYは、ユーザでは指定されていませんが、これは指定されていなければ~/.Xauthorityを見るのがデフォルトだからです。そのため、rootを起動するときに明示的にその環境変数を作り、そこに/home/(user)/.Xauthorityを設定して渡せばよいのです。このためには、次のようにします。

$ sudo XAUTHORITY=${HOME}/.Xauthority gparted &

sudoとgpartedの間にあるXAUTHORITY=${HOME}/.Xauthorityで、起動するrootシェルに直接環境変数を作って渡しています。こうするとより確実にファイルの場所だけを引き渡すことが出来ます。セキュリティ上はこちらの方が一番いいかなと思いますが、ちょっと手間かな?筆者はxsudoというスクリプトを使ってこの問題を回避してます。

pi@RPi-Dev:~$ cat /usr/local/sbin/xsudo
#!/bin/bash
/usr/bin/sudo XAUTHORITY=${HOME}/.Xauthority "$@"

コメントを残す