X 転送

  1. 事前準備
  2. 最低限 HTML
  3. web ページの公開
  4. 本日の課題

--- 以降付録 ---

  1. 特殊文字
  2. スタイルシート
  3. X転送

1. 前準備

これから行う実技編では, 以下のように下線が引かれている部分をみなさんに実際に入力してもらいます.
先頭が "$" ならば一般ユーザでの作業, "#" ならば root での作業になります.

$ pwd
/home/dongury

後半の実習では 以下のように, コマンド入力例に joho??, joho!! と書いてある場合があります.
joho?? はリモートホスト (相方の計算機) での, joho!! はローカルホスト (自分の計算機) での作業を意味しています.

joho??$ xeyes
joho!!$ ssh -X ***

以降の実習ではこの部分に注目し, どの計算機で作業しているのかをしっかりと区別して取り組んでください.
joho??joho!! など, 特に何も書いてないところは, 基本的にはローカルホストでの作業になります.

[1.0] パッケージの更新

インストールされているパッケージに更新が無いか確認を行ってください.
(この作業の目的は,第 8 回 「0. 今後, 情報実習を受講するにあたってのお願い 」を参照)

$ sudo apt-get updateenter
$ sudo apt-get upgradeenter

[1.1] 必須作業

「startx」をする前に root になり, 以下の作業を行ってください.

$ sudo -s enter
# cd /etc/X11/xinitenter
# cp xserverrc xserverrc.bkenter
# vi xserverrcenter

xserverrc ファイル中の

exec /usr/bin/X -nolisten tcp "$@"

を下記のように書き換えます.

exec /usr/bin/X "$@"

次に, 前回の授業で編集した /etc/hosts.allow が以下のようになっていることを念のため確認して下さい.
なっていない場合は,vi で以下のように編集してください.

# less /etc/hosts.allowenter
... (コメント文)
ALL: localhost
ALL: 192.168.16.1XX 
(または ALL: ALL)

< less を用いて /etc/hosts.allow を確認.

< 全てのデーモンに対して, 192.168.16.1XX からのアクセスのみを許可
  XX は隣の実験機番号

以上の作業が終了したら 一般ユーザに戻り, startx を実行します.

# exitenter
$ startxenter

これで手元の計算機で X サーバが立ち上がり,X クライアントを使うことができるようになりました.

[1.2] 参考 : 面白い X クライアント

今回の実習で用いる X クライアントとしては xeyes を上げていますが,
もしも他の X クライアントを使いたいのであれば自由に変更してください.
以下に, 簡単に使える X クライアントをとりあえずリストしておきます.
中にはパッケージ (= コマンド名) をインストールする必要があるものもあるかもしれません.(何が出るかはお楽しみ)
太字は今回担当のTA おすすめです
なお xplanet には -window オプションが必要となり,macopix-gtk2 やninix-aya は別途データが必要です.

xlogo, xclock, xfontsel, xload, xcalc, oneko, xplanet, xteddy, xpenguins, xjokes, xcowsay, ninix-aya, macopix-gtk2

2. X クライアントを表示するサーバと画面の選択

[2.1] xhost によるアクセス許可

まず X サーバの制御プログラム「xhost」を使って 隣の情報実験機の X クライアントからのアクセスを許可します.
「xhost」とは X クライアントからのアクセスを許可または制限を設定するコマンドです.

$ xhost +192.168.16.1XXenter
< johoXXからの要求を受け付ける

アクセス許可がされたかどうかを確認してみましょう.

$ xhostenter
access control enabled, only authorized 
clients can connect
INET: johoXX.local
< アクセス許可をしたホストのリストを表示


< INET: 192.168.16.1XX の場合もある

xhost によるアクセス許可には以下のようなやり方もあります.(今回はやらないでください)

$ xhost +enter  < すべての計算機からの要求を受け付ける
access control disabled, clients 
can connect from any host

[2.2] 環境変数 DISPLAY の設定

環境変数 DISPLAY に指定されているサーバに X クライアント (以下 X と略することがある) が表示されます.
まず,自分が使っている端末に表示するように設定します. 設定の書式は以下の通りです.

(ホスト名):(ディスプレイ番号).(スクリーン番号)

設定例 (自分が使っている端末を表示するときはホスト名を記入しなくてもよい)

$ export DISPLAY=:0.0enter
あるいは以下の設定の仕方でもできます.(localhost は自分の計算機を指し示すホスト名です)

$ export DISPLAY=localhost:0.0enter

他の設定の仕方もできます. ホスト名+ドメイン名で設定することも可能です.
(joho06 の場合)

$ export DISPLAY=joho06.ep.sci.hokudai.ac.jp:0.0enter

IP アドレスで指定することも可能です. (joho01 の場合)

$ export DISPLAY=192.168.16.101:0.0enter

設定し終わったところで,確認をしてみましょう.

$ printenv | grep DISPLAYenter
DISPLAY=:0.0

環境変数 DISPLAY が先程設定した値になっていれば設定完了です. 試しに xeyes を実行してみましょう.

$ xeyes &enter

目玉のウインドウが出て来ましたね?

停止するには, jobs コマンドでジョブ番号を調べて kill コマンドでジョブを殺すことで停止できます.

$ jobs enter
[1]+  running                 xeyes &

$ kill %1enter

または systemctl status コマンドでプロセス ID を調べて kill コマンドで殺すことでも停止できます.

$ xeyes &enter
$ systemctl status | grep xeyes enter
│ ├─15881 xeyes

$ kill -KILL 15881enter

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

$ xeyes &enter
$ xeyes &enter
$ xeyes &enter
$ xeyes &enter
$ killall xeyes enter

これ以降の作業では何度も xeyes の表示先を変える (X を飛ばす) ことになるのですが作業が終わることにこれらの方法で消してください

[2.3] X を飛ばしてみる

X は環境変数 DISPLAY の値に設定されている場所へ表示されます.
DISPLAY に他の計算機 (X サーバ) を指定すれば,そこに X クライアントを飛ばせます.
それでは隣の情報実験機に xeyes を飛ばしてみましょう.
IP アドレスは隣の情報実験機のアドレスを入力してください.

$ export DISPLAY=192.168.16.1XX:0.0enter
$ xeyes &enter

3. X サーバ側からのアクセス制限

[3.1] xhost によるアクセス制限

次に「xhost」で X クライアントからのアクセス制限を行います

$ export DISPLAY=:0.0enter
$ xhost -192.168.16.1XXenter

< johoXX からの要求に答えない

設定を確認してみましょう

$ xhostenter
access controll enabled, only authorized 
clients can connect
< 指定したホストが表示されなければ OK

[3.2] 再び X を飛ばしてみる

何も記述されていない状態で X が飛ばせるか試してみましょう.
[2.3]と同様に隣の情報実験機同士で xeyes を飛ばしてみよう.

$ export DISPLAY=192.168.16.1XX:0.0enter
$ xeyes &enter
< 隣の情報実験機のIP アドレス

[3.3] もっと細かいアクセス制限

「xhost」はホスト(マシン)単位でアクセスを制御します. 「xauth」でさらに細かく制限することができます(ユーザ単位での制限).
詳しくは man で確認してください.
「xauth」を使用するときは必ず「xhost」によるアクセス許可を全て解除しておく (許可しない) こと忘れないようにしてください.
(「xhost -」「xhost - (隣の情報実験機のIP)」など)

リモートホスト側 の作業 ( X を飛ばされる方.例 joho??: ?? は X を飛される方の情報実験機番号)

hoge@joho??:~$ export DISPLAY=:0.0enter
hoge@joho??:~$ xhost -enter
hoge@joho??:~$ xhost -192.168.16.1!!enter
hoge@joho??:~$ xauth listenter
joho??/unix:0 MIT-MAGIC-COOKIE-1 174bakcfd407df4fa7cc5f4457c11147

< xhost によってコントロールリストによるアクセス制限を行う
< xhost のコントロールリストから隣の情報実験機の IP を削除
!! はX を飛ばす方の情報実験機番号

この174bakcfd407df4fa7cc5f4457c11147は,
ログインしているユーザ, ホストによって決まる文字列で, X を起動する毎(startx する毎) に変化します.

リモートホストで表示された174bakcfd407df4fa7cc5f4457c11147(暗号化された文字列) を
ローカルホスト側に設定します. (当然資料のこの文字をそのまま設定しても無効です).

ローカルホスト側の作業 ( X を飛ばす方.例 joho!!: !! は X を飛ばす方の情報実験機番号)

hero@joho!!:~$ xauthenter
using authority file /home/hoge/.xauthority
xauth> add 192.168.16.1??:0.0 . 174bakcfd407df4fa7cc5f4457c11147enter
xauth> exitenter
hero@joho!!:~$ export DISPLAY=192.168.16.1??:0.0enter
hero@joho!!:~$ xeyes &enter


< 隣の情報実験機の IP を指定して先程の暗号化した文字列をいれます.

< 隣の情報実験機の IP を指定

暗号化された文字列がサーバとクライアントで一致したときのみ目玉が表示されます.
成功したら,今度はリモートホスト側とローカルホスト側を交代してやってみてください.

設定の削除方法

hero@joho!!:~$ xauthenter
xauth> remove 192.168.16.1??:0.0enter
xauth> exitenter

時間に余裕がある場合は, 再度 xauth を実行し, add の部分の 赤字の文字列をわざと間違えてみて, 本当に目玉が表示できないことを 確かめてみよう.

[3.4] ssh による X 転送

リモートホストに接続し, リモートホスト側で実行したX をローカルホストのディスプレイに表示します.
接続先のコンピュータにアカウントが必要です. ssh を使うと,自動的に X が転送されます.
このとき xhost などの設定は不要です(内部で xauth を設定しています).

ローカルホスト側 まずは環境変数 DISPLAY を localhost に戻しましょう(joho!! がローカルホスト, joho?? がリモートホスト).

hero@joho!!:~$ export DISPLAY=:0.0

リモートホストに接続します.

hero@joho!!:~$ ssh -X 192.168.16.1??enter
are you sure you want to continue connecting (yes/no)? yes
password:
hero@joho??:~$ xeyes &enter

< 初めて接続するホストの場合は接続していいかという確認が行われます.
 このときは yes と打ってください. 初めてじゃない場合はでません. 

リモートホスト側

リモートホスト側で実際に xeyes が実行されているかを確認しましょう.

$ ps aux | grep xeyesenter
hero   4732  0.2  0.0  40660  2204 pts/1    s    20:32   0:00 xeyes

上記のように表示されると実際に hero さんが xeyes を実行していることが分かります.

-X の代わりに -x オプションを指定したり, オプションを指定しないでX の転送を試してみましょう.
これらの場合には -X オプションを指定した場合とは挙動が異なるはずです.
なぜそうなるのかは man ssh で調べてみてください.

hero@joho!!:~$ ssh -x 192.168.16.1??enter
password:
hero@joho??:~$ xeyes &enter
hero@joho!!:~$ ssh 192.168.16.1??enter
password:
hero@joho??:~$ xeyes &enter

4. X のセキュリティ

[4.1] 画面を盗み見る

隣の情報実験機同士で「xhost +」を設定し, お互いに覗き見てみよう.

リモートホスト側の作業(盗み見られる方)

hoge@joho??:~$ export DISPLAY=:0.0 enter
hoge@joho??:~$ xhost +enter

ローカルホスト側の作業(盗み見る方)

hero@joho!!:~$ xwd -display 192.168.16.1??:0.0 -root -silent -out xhost.xwdenter
hero@joho!!:~$ display xhost.xwd &enter
< xhost.xwd ファイルに画像をダンプ(記録)する
< ダンプした画像を表示

xwd X のイメージ(画像)をダンプする X クライアント
display 画像ビューワー

[4.2] 入力を監視する

隣の情報実験機同士で, お互いに仮想端末を検索し, お互いの入力を監視してみよう.

リモートホスト側の作業 (監視される方)

hoge@joho??:~$ export DISPLAY=:0.0 enter
hoge@joho??:~$ xhost +enter

ローカルホスト側の作業 (監視する方)

hero@joho!!:~$ xwininfo -display 192.168.16.1??:0.0 -root -tree | lessenter
xwininfo: Window id: 0x31 (the root window) (has no name)

  Root window id: 0x31 (the root window) (has no name)
  ...
  ...
  ...

hero@joho!!:~$ xev -display 192.168.16.1??:0.0 -id 0x31enter
< 仮想端末らしいウインドウのIDを探します. 抜けるときは q と打ってください. 







< 探し出した ID を設定しのぞきます.

リモートホスト側の人は何か新しいウィンドウ(ex. ターミナル,ブラウザなど)を開いてみてください.
そうすると,ロカールホスト側ではリモートホスト側で起きているイベントのログが表示されます.
このイベントログを見ることで,リモートホストでユーザが何をしているのかを監視することができます.

xwininfo ウィンドウの属性を表示
xev 指定したウインドウで発生したイベントを表示

一通り終わったら,リモートホスト側とローカルホスト側の作業を交代してやってください.


[4.3] セキュリティー上の注意点

これまで試してきて分かるように xhost + と設定すると全てのホストからのウィンドウ表示要求を受け入れることになってしまいます.
これは密かに誰かから監視される可能性があることを意味しています.セキュリティー上好ましくないのでなるべく xauth を使うようにしましょう.

5. 参考文献




情報実験第 9 回のページへ戻る

最終更新日: 2018/06/23 (吉田 辰哉) Copyright © 2018 inex