手もとでXが動いてるときにsshでリモートホストに接続して そこで何かX11のコマンドを実行すると、 そのコマンドつまりリモートのXクライアントは、 ssh が作った X display に接続する、という機能が ssh にはある。 このdisplayはssh経由で手もとのXサーバにつながっているので、 リモートのグラフィカルなプログラムが手元に出現する。 リモートで環境変数 DISPLAY を参照するとこうなっている。
yuji@nil:~%echo $DISPLAY localhost:10.0
localhost:10.0 が手元のXサーバへつながるsshのトンネルの入口というわけです。
同じ変数の値が、ローカルではこうです。
yuji@mozu:~/public_html/linux/yesterday%echo $DISPLAY :0.0
debianのデフォルトの設定はこの機能がサーバ側でオフになっているので、 これを使うためには設定で on にしてサーバを再起動する。 ssh クライアント側では -X オプションを指定するか、 ~/.ssh/config で ForwardX11 yes とする。 すると、(コンパイル時にこの機能を殺していない限りは) スーパーマリオのワープトンネルみたいによそのホストのXクライアントが 自分の手元のXサーバに出現するわけです。
Xは、元々こういう発想の元に作られたシステムだった。 つまり、入出力を担当するサーバプロセスが居て、 ユーザが使うプログラムはこのサーバプロセスにクライアントとして接続する、 という体裁である。 かつて、計算機資源が貧弱でグラフィカルな環境におけるユーザの操作に 良いレスポンスで反応する、なんて事が至難であった時代、 計算能力に優れたホストコンピュータにログインしたユーザは、 そこで各個のユーザプログラムを起動すると、 手元の貧弱な描画その他入出力専門の仕事を行うハードウェアで 動作する X サーバにこのユーザプログラムが接続して、 描画をやってもらい、 ホストコンピュータの計算機資源をユーザのお世話如きに浪費せずに済ませる、 というわけなのだ。
変数 DISPLAY に "localhost" というのが入っているのは その名残である。 実際は名残ではなく、今もちゃんと動くのだが。 つまり、 DISPLAY の localhost のところにホスト名を入れれば 以後、そのホストのXサーバにユーザプログラムは接続しにいくようになる。 ちゃんと普通の TCP/IP を使って通信が行われる。 マウスが当該プログラムの上を動くと、嵐のようにパケットが行きかうのが見られる。
Xサーバに接続すると、どういう事が起きるかというと、 画面や入出力をなんでももらえるようになる。 そうでなくては画像処理ソフトも、エディタも期待された機能は発揮できないから、 当然に思えるが、 入出力を全部まとめてネットワークに開放しているわけで、 裏を返せば、誰でもこのサーバに接続できるというのは実にまずい。
ですから、ヨソからの接続はお断りにして、 ssh で手元にワープさせる、というのがここ10年で一般的になったわけです。
私が最初にこのシステムを使った頃は、 グローバルIPアドレスを名乗る、全く保護されていないセグメント上で、 YP を使ったパスワード無しの rlogin や X の通信が平文で行われていました。 ネットワークの授業では大野浩之先生がこれを tcpdump で見せて下さいました。 それでもほとんど何の問題も起きませんでした。 しかし、徐々に治安は悪化し、卒業する頃には半年に一度くらい全員パスワード変えなさい、 という指令が来るようになり、 卒業した年にはファイアウォールが導入され、学科のネットワークセグメントを保護するようになりました。
以下マニュアル
`file-chase-links' (buffer: *Hyper Apropos*, mode: Hyper-Apropos) Compiled Lisp function, (loaded from "/home/mohura/packages/build-area/xemacs21-21.4.17/lisp/files.elc"): arguments: (filename) FILENAME がリンクだった場合、そうではないものにたどりつくまで 追いかける。 file-truename とは違って、ディレクトリに含まれるリンクについては 処理対象としない。
ファイル名は文字列で与える。動いたところはこんな感じ。
(file-chase-links "/etc/alternatives/mp3-decoder") "/usr/bin/mpg123-oss"
らくがきを書くelispの、小見出しを付ける関数がヘボくて 機能しないhref値を書く事があったので、 この関数を使って書き直した。
以前生成されたヘボいhref値を直すのは面倒だからやめた。