はじめに

KMC の黒魔術師 @t_uda です。昔はブラウザで動く黒魔術1が専門でしたが、最近は TeX 黒魔術2にも手を染め始めました。

この記事は KMC アドベントカレンダー 2013 の 10 日目の記事です。昨日の記事は nona 君の「楽しいトンネルの掘り方(オプション: -L, -R, -f, -N -g)」でした。SSH アドベントカレンダー 2013 の 3 日目の今日は X11 forwarding の話をします。一応、専門的な説明は避けて (Open)SSH 初心者向けにカンタンな「使い道」の紹介をするつもりです(技術的な話を期待していた人ごめんなさい)。

SSH ⇒ CUI ?

突然ですが皆さん“SSH”にどのよう印象をお持ちでしょうか。

「黒い」?

「コマンドライン」?

「リモートで何かできる」?

日課と趣味が SSH な KMC 部員3からはこんな言葉は出てこないと思いますが、めったに SSH を利用しないユーザにとっての SSH っておよそこんなイメージじゃないでしょうか。私も数年前はこの程度の印象しかありませんでした(もっとも、昔は TeraTerm を使っていたので「黒い」イメージはなかったですが)。

実際、SSH で何かしらしているときって、大半が CUI での作業だと思います。じゃぁ SSH を使っていて「GUI が使えればいいのに」と思ったことはありませんか。

いきなり言われても分からないかもしれないので、具体的なシチュエーションで例を挙げてみましょう。

私が大学の計算機で数値シミュレーションのプログラムを動かしていたときのことです。結果を視覚化してみるために、プログラムがデータを書き出しおえたら手元のノート PC に数値データを scp でダウンロードしてきて、そして gnuplot でグラフにして見る、という一連の流れを何度も繰り返していました。

uda@localhost:~$ ssh daigaku

uda@daigaku:~$ ./keisan > kekka.txt
uda@daigaku:~$ exit

uda@localhost:~$ scp uda@daigaku:kekka.txt localhost:kekka.txt
uda@localhost:~$ gnuplot

gnuplot> splot "kekka.txt"

デバッグをしたり、パラメータを微調整して再度プログラムを実行するたびに、いちいちこれらの手順を繰り返していました。

「あぁ、もう!SSH 越しに(大学の計算機の側で)gnuplot を使えたらいいのに!」

はい、ということで、「それ、X11 forwarding 使えばできるよ!」というのが今回のお話です。

時魔法「X11 転送」

細かい理屈は置いといて、X11 forwarding という仕組みを使うことで、リモートホスト側にインストールされている X11 アプリケーションをローカルホスト側で使うことができます。

以下では OpenSSH の ssh コマンドを使って X11 forwarding する方法について解説していきます。なお、参考までに執筆時の筆者の環境を以下に載せておきます。

  OS SSH X Window System
ローカルホスト Debian sid openssh-client 1:6.4p1-1 xserver-xorg 1:7.7+4
リモートホスト Debian wheezy openssh-server 1:6.0p1-4 (libx11-6 2:1.6.2-1)

X11 forwarding に対応している SSH クライアントを使えば、OpenSSH でなくとも同様のことが実現できます。また、クライアントマシン側に X Window Server 環境も必要です。一例として Windows OS の場合であれば、SSH クライアントとして PuTTY を、X Window Server として Xming をそれぞれ使うことで、X11 forwarding を実現できます。

X オプション

X11 forwarding をするには、オプション -X を指定してリモートログインします。例えば、次のようにします。

uda@localhost:~$ ssh -X daigaku

これで、SSH のセッション中は X11 forwarding が有効になります。

召喚魔法「グヌープロット」

さて、では実際に gnuplot を使ってみましょう!

リモートホストで gnuplot を実行した様子

このように、リモートホストで X11 アプリケーションの gnuplot を実行し、グラフ描画させてみたところ、手元のディスプレイに sin 関数のグラフが描画されました!成功です!

.ssh/config

ちなみに、.ssh/configファイルに以下のような設定を書いておくことで、リモートホスト“daigaku”へ SSH するときに自動的に X11 forwarding が有効化されます4。頻繁に X11 forwarding を利用する場合は設定しておくと便利でしょう。

Host daigaku
	ForwardX11 yes
	 :

なお .ssh/config に関しては、KMC アドベントカレンダー 12 日目に non117 さんが詳しくやってくださるようです。

C オプション

上で挙げたのは比較的動作が「軽い」例でしたが、例えば gnuplot の 3 次元プロットコマンド splot を使って、大量のデータ点をプロットし、さらにマウスを使って図をぐるぐる回転しようとしたりしたら、X サーバ/クライアント間での通信量が膨れ上がってしまうことでしょう。

そこで、X11 forwarding を有効化するときは、圧縮オプションの -C を併用するのがオススメです。

uda@localhost:~$ ssh -XC daigaku

こうすることで、X サーバ/クライアント間の通信量をかなり削減することができます。

他の利用例

せっかくですから、他にも X11 forwarding と組み合わせて使えそうな X11 アプリケーションを、小技と合わせて 2 つほど紹介しておきましょう。

時魔法「多段 X11 転送」×召喚魔法「アイスウィーズル」

アイスウィーズルって書かれるとパッと見で何のことか分からないですね。商標の都合とかで名前が変わった Debian 版の Firefox のことです。つまりブラウザです。なんとブラウザも X11 forwarding で呼び寄せることができます!

uda@localhost:~$ ssh -XC kmc.gr.jp

uda@kmc.gr.jp:~$ ssh -XC ring

uda@ring:~$ firefox &

この例の場合、踏み台のサーバに一度ログインして、続けて LAN 内の別のマシン ring に ssh し、そこで firefox を起動しています。こんな風に、多段転送もできるんですね。

KMC の部内サーバ ring 上で firefox を実行している様子

ブラウザのタイトルバーにも (ホスト ring) と書かれていますね。このように起動したブラウザは、LAN 内のマシンで動いているので、LAN 内で動かしている Web アプリケーションの動作確認がカンタンにできたりします。上の図の場合、LAN 内の sharp:4089 でこの記事のプレビューサーバを動かしていて、そのページを閲覧しています5

時魔法「エージェント転送」×召喚魔法「クラスター・セキュアシェル」

最後に、せっかくの SSH アドベントカレンダー企画ですから、SSH に関するツールということで“ClusterSSH”(cssh) を紹介しましょう。

ClusterSSH は、複数ホストに一度に SSH することができる便利なツールです。例えば、LAN 内のクライアントマシンの設定ファイルを一括更新したりするのに非常に便利です。一括操作用のダイアログが現れるので、そこにコマンドを打ち込むと、接続しているすべての端末に同じコマンドが打ち込まれます。

uda@localhost:~$ ssh -XCA daigaku

uda@daigaku:~$ cssh host1 host2 host3 ...

ここで、新しいオプション -A が出てきました。これは Agent forwarding を有効化するオプションです。SSH Agent をフォワードすることで、リモートホスト daigaku から host1, host2, host3, … へ (c)ssh するときにローカルホストの鍵を用いて鍵認証できるようになり、パスワード入力の手間を減らすことができます6。実際手間減ってラクです。SSH Agent や鍵認証の話はこの記事の趣旨から外れてしまうので詳しくは解説しません。よく分からなければ、筆者がよく組み合わせて使うオプションの紹介程度と思っていただいて結構です。

リモートホストで cssh を実行した様子

図は、8 台のマシンに一斉に SSH している様子です。中央のダイアログにフォーカスして打ち込んだ ls -la | grep hoge というコマンドがすべての端末に入力されています。

最後に

いかがだったでしょうか。今回は「どんな使い方ができるのか」に主眼をあてて、必要なソフトウェアのインストール方法などは省いています。もしお使いの環境で X11 forwarding してみたくなったら、適宜調べてみてください。“X forward”だと他の用語が引っかかったりするので、“(OS名) X11 forwarding”のようなキーワードでググるのがオススメです。また、Debian の場合であれば、この記事で出たソフトウェアはすべて APT で手に入れることができます。

ちなみに、最近はどうも堅苦しい文章ばかり書いていたので、今回はちょっと節のタイトルだけ遊んでみました。SSH 関連の用語ってどれもカッコいいと思うんですが私だけでしょうか。なお、いろんな魔法を唱えていましたが私のジョブは黒魔導士でも召喚士でもなく算術士7です。

明日は possum さんによる autossh の話です。

参考文献

  1. man よめ(だいたい書いてある)
  2. 第7章 X Window システム - Debian リファレンス

注釈

  1. JavaScript のこと。 

  2. TeX マクロのこと。 

  3. 日課と趣味が SSH な KMC 部員に聞いたところ「SSH の印象は SSH って感じですねぇ」と言われました。 

  4. [20160425追記] X11Forwarding yes と記載していましたが正しくは ForwardX11 yes でした。前者は別の設定ファイルに書く意味の異なるオプションです(Cf. man sshd_config)。 

  5. 重いので今日くらいしかそんなことしないですが。まぁ普段はローカルフォワードしてローカルマシンで作業しています。ポートフォワードに関する解説は…… あれ、昨日やってるハズなんですが……??? nona 君のトンネルの掘り方記事がハワイ時間 9 日 14 時に公開されたようですので、そちらをご参照下さい。 

  6. もちろん、ClusterSSH 先の各リモートホストで同じパスワードが使えるのであれば、パスワード入力は一度で済みます。仮にそうだとしても cssh するなら鍵認証の方がいいよね、って思ってる理由を gdgd 書こうとしたのですが、話題それてきて面倒になったので、「手間は減らした方がいいんだよ!」とお茶を濁すことにしました。 

  7. そこ、召喚士に算術つけた方が強いとか言わない!