1. 前準備
[1.1] 必須作業
「startx」をする前に root になり, 以下の作業を行ってください.
$ sudo -s# cd /etc/X11/xinit
# cp xserverrc xserverrc.bk
# vi xserverrc

xserverrc ファイル中の
exec /usr/bin/X -nolisten tcp "$@"を下記のように書き換えます.
exec /usr/bin/X "$@"
次に, 前回の授業で編集した /etc/hosts.allow が以下のようになっていることを念のため確認して下さい.
| # vi /etc/hosts.allow | < vi を用いて /etc/hosts.allow を編集. < 全てのデーモンに対して, 192.168.16.1?? からのアクセスのみを許可 (?? は相方の実験機番号) | 
以上の作業が終了したら, 一般ユーザに戻り, startx を実行します.
# exit$ startx

これで手元の計算機に X サーバが立ち上がりました. こうすることで手元の計算機で X クライアントを使うことができるようになりました.
[1.2] 任意での作業
今回の実習で用いる X クライアントとしては xeyes を上げていますが, もしも他の X クライアントを使いたいのであれば自由に変更してください. 以下に, 簡単に使える X クライアントをとりあえずリストしておきます. 中にはパッケージ (= コマンド名) をインストールする必要があるものもあるかもしれません. (何が出るかはお楽しみ) なお xplanet には -window オプションが必要となります.
xlogo, xclock, xfontsel, xload, xcalc, oneko, xplanet, xteddy, xpenguins, ico
2. X クライアントを表示するサーバと画面の選択
[2.1] xhost によるアクセス許可
まず X サーバの制御プログラム「xhost」を使って 3N+1 or 3N+2 の X クライアント からのアクセスを許可します.「xhost」とは X クライアントからのアクセスを許可または制限を設定するコマンドです.
| $ xhost +192.168.16.1?? | 
< joho??からの要求を受け付ける
 | 
アクセス許可がされたかどうかを確認してみましょう.
| $ xhost | < アクセス許可をしたホストのリストを表示 < INET: 192.168.16.1?? の場合もある | 
xhost によるアクセス許可には以下のようなやり方もあります.(今回はやらないでください)
$ xhost +< すべてのマシンからの要求を受け付ける access control disabled, clients can connect from any host
[2.2] DISPLAY の設定
環境変数 DISPLAY に示されるサーバに X クライアント (以下 X と略することがある) が表示されます. 自分が使っている端末に表示するように設定します. 設定の書式は以下の通りです.
(ホスト名):(ディスプレイ番号).(スクリーン番号)
設定例 (自分の元々の端末を表示するときはホスト名を記入しない)
| $ export DISPLAY=:0.0 | 
$ export DISPLAY=localhost:0.0
他の設定の仕方もできます. ホスト名+ドメイン名で設定することも可能です. (joho06 の場合)
$ export DISPLAY=joho06.ep.sci.hokudai.ac.jp:0.0
IP アドレスで指定することも可能です. (joho01 の場合)
$ export DISPLAY=192.168.16.101:0.0
設定を確認してみましょう.
$ printenv | grep DISPLAYDISPLAY=:0.0
DISPLAY が先程設定した値になっていれば設定完了です. 試しに xeyes を実行してみましょう.
$ xeyes &
目玉のウインドウが出て来ましたね?
停止するには, jobs コマンドでジョブ番号を調べて kill コマンドでジョブを殺すことで停止できます.
$ jobs[1]+ running xeyes & $ kill %1

または systemctl status コマンドでプロセス ID を調べて kill コマンドで殺すことでも停止できます.
$ xeyes &$ systemctl status | grep xeyes
│ ├─15881 xeyes $ kill -KILL 15881

複数同じジョブを動かしているときにすべて一斉に消すには killall コマンドを使います.
$ xeyes &$ xeyes &
$ xeyes &
$ xeyes &
$ killall xeyes

これ以降の作業では何度も xeyes を飛ばすことになるのですが作業が終わることにこれらの方法で消してください
[2.3] X を飛ばしてみる
X は環境変数 DISPLAY の値に設定されている場所へ表示されます. DISPLAY に他のマシン (X サーバ) を指定すれば,そこにクライアントの画面を飛ばせます. それでは相方のマシンに xeyes を飛ばしてみましょう. IP アドレスは相手のマシンのアドレスを入力してください.
$ export DISPLAY=192.168.16.1??:0.0$ xeyes &

3. X サーバ側からのアクセス制限
[3.1] xhost によるアクセス制限
次に「xhost」で X クライアントからのアクセス制限を行います
| $ export DISPLAY=:0.0 | 
< joho?? からの要求に答えない | 
設定を確認してみましょう
| $ xhost | 
< 指定したホストが表示されなければ OK | 
[3.2] 再び X を飛ばしてみる
何も記述されていない状態で X が飛ばせるか試してみましょう. [2.3]と同様にお互いのマシンに xeyes を飛ばしてみよう.
| $ export DISPLAY=192.168.16.1??:0.0 | 
< 相手の IP アドレス
 | 
[3.3] もっと細かいアクセス制限
「xhost」はホスト(マシン)単位でアクセスを制御します. 「xauth」でさらに細かく制限することができます(ユーザ単位での制限). 詳しくは man で確認してください. 「xauth」を使用するときは必ず「xhost」によるアクセス許可を全て解除 しておく (許可しない) こと忘れないようにしてください. (「xhost -」や「xhost - (相手ホストのIP)」など)
リモートホスト側(例 joho??: 画面を飛される方, ?? は画面が飛ばされる方の計算機番号)
| hoge@joho??:~$ export DISPLAY=:0.0 | < xhost によってコントロールリストによるアクセス制限を行う < xhost のコントロールリストから相手の IP を削除 | 
この174bakcfd407df4fa7cc5f4457c11147は, ログインしているユーザ, ホストによって決まる文字列で, X を起動する毎 (startx する毎) に変化します.
リモートホストで表示された174bakcfd407df4fa7cc5f4457c11147 (暗号化された文字列) をローカルホスト側に設定します. (当然資料のこの文字をそのまま設定しても無効です).
ローカルホスト側(例 joho!!: 画面を飛ばす方, !! は画面を飛ばす方の計算機番号)
| hero@joho!!:~$ xauth | < 相手のホストの IP を指定して先程の暗号化した文字列をいれます. < 相手のホストの IP を指定 | 
暗号化された文字列がサーバとクライアントで一致したときのみ目玉が表示されます.
設定の削除方法
hero@joho!!:~$ xauthxauth> remove 192.168.16.1??:0.0
xauth> exit

時間に余裕がある場合は, 再度 xauth を実行し, add の部分の 赤字の文字列をわざと間違えてみて, 本当に目玉が表示できないことを 確かめてみよう.
[3.4] ssh による X 転送
リモートホストに接続し, X をローカルホストのディスプレイに表示します. 接続先のコンピュータにアカウントが必要です. ssh を使うと, 自動的に画面が転送されます. このとき xhost などの設定は不要です(内部で xauth を設定しています).
ローカルホスト側 まずはディスプレイを localhost に戻しましょう(joho!! がローカルホスト, joho?? がリモートホスト).
| hero@joho!!:~$ export DISPLAY=:0.0 | 
リモートホストに接続します.
| hoge@joho!!:~$ ssh -X 192.168.16.1?? | < ?? はリモートホストの計算機の番号 < 初めて接続するホストの場合は接続していいかという確認が行われます. このときは yes と打ってください. 初めてじゃない場合はでません. | 
リモートホスト側で実際に xeyes が実行されているかを確認しましょう.
| $ ps aux | grep xeyes | 
上記のように表示されると実際に hoge さんが xeyes を実行していることが分かります.
-X の代わりに -x オプションを指定したり, オプションを指定しないで X の転送を試してみましょう. これらの場合には -X オプションを指定した場合とは挙動が異なるはずです. 理由は man ssh で調べてみてください.
| hoge@joho!!:~$ ssh -x 192.168.16.1?? | 
| hoge@joho!!:~$ ssh 192.168.16.1?? | 
4. X のセキュリティ
[4.1] 画面を盗み見る
3n+1 マシンおよび 3n+2 マシンで「xhost +」を設定し, お互いに覗き見てみよう.
リモートホスト側(覗き見られる方)
hero@joho??:~$ export DISPLAY=:0.0hero@joho??:~$ xhost +

ローカルホスト側(覗く方)
| hoge@joho!!:~$ xwd -display 192.168.16.1??:0.0 -root -silent -out xhost.xwd | < xhost.xwd ファイルに画像をダンプ(記録)する ?? は相手のマシンの番号 < ダンプした画像を表示 | 
| xwd | X のイメージ(画像)をダンプする X クライアント | 
| display | 画像ビューワー | 
[4.2] 入力を監視する
3n+1 マシンおよび 3n+2 マシンで, お互いに仮想端末を検索し, お互いの入力を 監視してみよう.
リモートホスト側(監視される方)
hero@joho??:~$ export DISPLAY=:0.0hero@joho??:~$ xhost +

ローカルホスト側(監視する方)
| hoge@joho!!:~$ xwininfo -display 192.168.16.1??:0.0 -root -tree | less | < 仮想端末らしいウインドウのIDを探します. 抜けるときは q と打ってください. ?? は相手のマシン番号 < 探し出した ID を設定しのぞきます. | 
リモートホスト側の人は何か新しいウィンドウを開いてみてください. ロカールホスト側でおもしろいことがおこります.
| xwininfo | ウィンドウの属性を表示 | 
| xev | 指定したウインドウで発生したイベントを表示 | 
[4.3] セキュリティー上の注意点
これまで試してきて分かるように xhost + と設定すると全てのホストからのウィンドウ表示要求を受け入れることになってしまいます. これは密かに誰かから監視される可能性があることを意味しています. セキュリティー上好ましくないのでなるべく xauth を使うようにしましょう.
5. 参考文献
- 松田晃一, 暦本純一 著「入門X Window」 アスキー, ISBN4-7561-0166-6
- 山口和紀, 古瀬一隆 監修「新 The UNIX Super Text (上・下)」 技術評論社, (上巻)ISBN4-7741-1682-2, (下巻)ISBN4-7741-1683-1/