ttyrec: 端末を録画再生するツール

高林哲 鵜飼文敏 大和正武

Linux Conference 2001 投稿論文 (フルペーパー)
http://0xcc.net/pub/lc2001/ [PDF]

最終更新日: 2001-10-10 (公開日: 2001-10-10)


はじめに

UNIXの世界では伝統的に文字ベースの端末および端末エミュレータ (以下、端末に統一) が広く用いられている。古くは VT100 をはじめ とする専用の端末、グラフィカルなウィンドウシステムが普及した 現在では xterm や kterm をはじめとする端末など、時代を問わず 端末 は UNIXには欠かせない存在となっている。UNIX が得意とす るコマンドライン指向のテキスト処理との相性のよさが、これほど 端末が広く用いられている理由といえる。本論文では端末を録画再生す るツール ttyrec を紹介し、その応用および関連するソフトウェア について述べる。

[VT100] [kterm]
図1: VT100 (DECマシ ンの歴史 より) および kterm の写真

ttyrec

ttyrec は端末を録画再生するツールである。端末上の行動は emacs -nw でも vi でも w3m でも、端末上で動くプログラムなら 何でも録画できる。録画したデータは付属の ttyplay コマンドで 再生が可能である。ttyrec は ttyrec のWebサイト からソースコードが入手可能なほか、次の各種パッケージが用 意されている。

ttyrecの開発

ttyrec は script コマンドにマイクロ秒単位で時刻情 報を埋め込 む機能を追加しただけの単純なコマンドである。再生用のttyplay コマンドはファイルに記録された文字列と時刻情報を元に、録画デー タを再生する。script コマンドの man を読むと、HISTORYの節か ら BSD由来のコマンドであることがわかる。

HISTORY
     The script command appeared in 3.0BSD.

ttyrec を開発するにあたって、高林は Red Hat Linux で使われて いる script コマンドのソースコードを入手することから始めた。 rpm コマンドを使って次のように実行すると、 script コマンドを含む RPM パッケージがわかる。

% rpm -qf /usr/bin/script
util-linux-2.10s-12

パッケージ名がわかれば、ソースコードパッケージ (SRPM) から 目的のソースコードが得られる。なお、util-linux の最新版は http://www.kernel.org/pub/linux/utils/util-linux/から入手できる。

ソースコードが入手できれば、後は、時刻情報を埋め込むように script コマンドに手を入れて ttyrec を作り、再生用の ttyplay コマンドを新たに作るだけである。開発はものの半日で完了した。

ttyrecの使い方

ttyrec と ttyplay コマンドの使い方を紹介する。

録画

% ttyrec
(シェルが立ち上がるので、自由に作業してから exit)

再生

% ttyplay ttyrecord

オプションを指定すると、倍速再生 (-s2) や、他人の録画データ をリアルタイムに覗き見する (-p) ことができる。このように極め て単純なソフトウェアであるが、ちょっとした工夫でおもしろい応 用ができる。たとえば、端末だけですべての作業をこなしている 旧世代 のUNIXハッカーなら、ログインシェルの設定ファイルに細工をして 端末上のすべての行動を ttyrec で記録するだけで、そのハック人 生の生涯を記録に収めることができるだろう。設定例:

if test -z $TTYRECLOG; then
    export TTYRECLOG=$HOME/var/log/ttyrec/`date +"%Y-%m-%d"`-$$
    ttyrec -a $TTYRECLOG
    exit
fi

ttyrecを用いたファイル転送

ttyrec には端末を介してファイル転送を行うという、一風変わっ た機能がある。たとえば、

サイトA(ローカル) → サイトA(出島) → サイトB(出島) → サイトB(ローカル)

のようにログインしているときに、「サイトB(ローカル)」のファ イルを手元の「サイトA(ローカル)」に転送するのは大変である。 そこで、ttyrec を -u オプションつきで動かしておくと、このよ うな状況でのファイル転送が簡単に行える。

仕組みは簡単である。「サイトB (ローカル)」では転送したいファ イルを uuencode して端末に垂れ流す。すると、「サイトA(ローカ ル)」で動いている ttyrec が begin 664 ... という uuencode のヘッダを見つけて、手元にファイルを作成する。このように、ファ イル転送は端末への出力を介して行われる。

ttyrec によるファイル転送は、 山下 が考案したアイディアに基づいている。氏は、ファ イアウォールの内側の計算機からファイルを転送しようとした際に 困難に直面し、端末上で見えているファイルが簡単に手元に転送で きないのはおかしい、と強い不満を感じて ttyrec によるファイル 転送というアイディアを産み出した。

これは名案であるとして ttyrec -u をすぐさま実現して Web上に 公開すると、端末をファイル転送のメディアとして用いる手法は古 くから存在することがわかった。たとえば、パソコン通信の通信文 を常に監視して、メッセージに含まれるish フォーマットのテキストを裏で検出して復号するというrish というツールがある。これは、ttyrec -u が行っている処理とほぼ 同様である。つまり、ttyrecによるファイル転送は斬新なアイディ アでも何でもなく、大昔からある手法の一種に過ぎなかったのであ る。

ttyrecの問題点

ttyrec の録画データには、端末の大きさに関する情報が含まれな いという問題がある。再生は録画したときと同じ大きさの端末で行 う必要があるが、録画したときの端末の大きさは録画データから知 ることができない。そこで、後述する tty mania では、端末の大 きさを80桁×24行に限定して、録画データを配布している。

録画データに端末の大きさに関する情報を残すことも考えたが、録 画中に端末の大きさが変わったときや、再生時に端末の大きさを変 更する処理が複雑になると想定されたため、実現は見送った。

なお、ttyrecは端末への出力のみを記録するため、telnetなどで入 力したパスワードは端末上に出力されないかぎり ttyrec の録画デー タに残ることはない。

tty mania

ttyrec は元々、端末上の行動記録を後から検索してソフトウェア の使用方法などの備忘録として利用しよう、という発想の元に高林 によって作られたが、Web上に公開して他の人からの反応を得ると、 他の使い道の方がおもしろいということがわかった。

大和は ttyrec をソフトウェアのプロモーションビデオに使えるの ではないかと思いつき、 土屋 が開発した emacs-w3m という Emacs上の Webブラウザ向けのプロモーションビデオを作成 し、 不可解なアジテーションとともに、 その宣伝活動を行った。次にその檄文の一部を抜粋する。

最近特に開発が盛んなemacs-w3mが動作している様を撮影し,Emacs Video計画 の第一段として,世に問うことにした.すでにS式中毒にconsされている同志 諸君においては,このVideoに対する忌憚のない意見を聞かせて欲しい.また おのおの,育て上げてきた自慢のライブラリの動作やshare/lispを漁って身に 付けた秘密の技術を撮影し,広く公表することにより,この計画に参入してく れることを希望する.すべてのソフトウェアの設定ファイルのフォーマットが S式であるという素晴しい世界を実現しようではないか.

[emacs-w3m] [emacs-w3m] [emacs-w3m] [emacs-w3m]
[emacs-w3m] [emacs-w3m] [emacs-w3m] [emacs-w3m]
図2: 大和が作成した emacs-w3m のプロモーションビデオ [録画データ]

tty mania は、このよう にして各方面に飛び火したプロモーションビデオ作成熱が高じて出 来上がった Webサイトである。 大和のビデオをはじめとして、各 種のプロモーションビデオが公開されている。tty mania では単に ttyrec で録画したデータをファイルとして置くだけではなく、 ttyplayサーバによる動画配信サービスの提供も行っている。 ttyplayサーバは、クライアント側に telnet コマンドだけしか要 求しないという点で優れている。つまり、クライアント側には ttyrec をインストールする必要がない。たとえば、大和のビデオ を見るためには、端末からtelnet コマンドを使って次のように実 行するだけでよい。

% telnet tty.namazu.org 12345

ttyplay サーバ

ttyplayサーバの実現は 北目によって考案さ れた。といっても、単に /etc/inetd.conf に次のような設定を加 えるだけである。

12345 stream tcp nowait root ttyplay /somewhere/emacs-w3m.tty

さらに、ttyplay に -p オプションを指定すると、リアルタイムの ストリーミングが行えることがわかった。この仕組みにより、自分 が行っている作業を遠隔地の人間にリアルタイムで伝えることがで きる。ごく狭い仲間内で行われたストリーミング実験では、特に意 味のあることをしたわけでもないのに、 IRC によるチャットと連動 して大いに盛り上がった。

このように、新たなコードを何も書かずに、既存のツール (inetd) と組 み合わせるだけで、ttyplayサーバが実現できたのは UNIX ならで はといえよう。ポート番号でコンテンツを切り替えるという素朴な サーバではあるが、とにかく動くことは動く。労少なくして功多し である。

tty mania のコンテンツ

tty mania に登録されているコンテンツの中でも最もインパクトが あるのは小松の体操であ る。これは、PCに接続したビデオカメラで撮影した小松が踊ってい る映像を aatv でアス キーアートに変換したものである。実際に ttyplay で再生すると、 非常になめらかに動く。

[小松の体操] [小松の体操] [小松の体操] [小松の体操]
[小松の体操] [小松の体操] [小松の体操] [小松の体操]
図3: 小松の体操 [録画データ]

一方、旧世代UNIXハッカーの面目躍如たる森本は xterm のTektronix互換モー ドを生かし、グラフィック表示を ttyrec で録画することに成功し た。当初、ttyrec は文字ベースの情報しか扱えないと思われてい たが、Tektronix互換モードを活用すれことによりグラフィック表 示の録画再生という新たな可能性が生まれた。温故知新である。

[Tektronix] [Tektronix] [Tektronix]
図4: xterm の Tektronix互換モードを利用したグラフィック表示

tty mania は運営が開始されるとともに、すぐさま Web日記業界 (?) の各方面で話題にのぼり、tty.namazu.org のトップページへ の初日のアクセスは約 800件に達した。Web日記業界における情報伝 達のすばやさには目を見張るものがある。

ところで、Kevin On Demand! では、Kevin MitonickTsutomu Shimomura の計算機に不正侵入する様子を、 tty mania と同 様に telnet コマンドだけで見る ことができる。通常の端末の出力に加えて経過時間を表示するなど、 非常によくできているが、残念ながら Kevin On Demand! を実現す るソフトウェアは公開されていない。Webサイトの説明によると、 この録画データはtcpdump の改良版の出力か ら再構成したそうである。

関連ソフトウェア

本節では ttyrec に関連するソフトウェアを紹介する。

Joey Hess の Debianパッチ

ttyrec が公開される 4 か月ほど前に、Joey Hessが同様のツー ルを Debian向けに開発 していたことが ttyrec の公開後に判明した。アプローチは ほぼ同様だが、Hessの作には次のような特長がある。

北目が ttyrec の Debianパッケージの作成を提案すると、Hess は、 自分のパッチを script コマンドに適用する方がいいし、本家の script に修正を反映させるといい、と主張した。確かに一利ある が、我々は、今さら本家の script に修正を反映させてそれを普及 させるのは難しいだろうと考えている。それに、ttyrec を公開し てから Hessのパッチの存在に気づいたというのは手遅れである。かく して車輪は再発明され続ける。

ttyplayd

北目によって考案されたttyplayサーバは、inetdを利用しているた めに各録画データに対して、inetdのエントリを追加する必要があっ た。これは、新たな録画データの追加にはルート権限が必要である ことを意味する。また録画データそれぞれに対して異なるポート番 号を割りあてる必要がある。そこで、鵜飼はinetdを使わない ttyplay サーバの実装 ttyplayd を考案した。ttyplayサーバがや るべきことは、TCPコネクションを確立し、そのコネクションに ttyplayの出力を送ることである。単一ポートで複数の録画データ を扱えるようにするためには、接続後にプロンプトを出してユーザ に再生したいデータを選択させればよい。PerlやRubyといったスクリプト 言語を用いれば、このような処理は簡単に記述できる。特権ポートさ え使わなければ、ルート権限を必要とせずに一般ユーザ権限でもサー バを走らせることができる。

ところで、最近のtelnetクライアントでは、わざわざユーザ名を入 力しなくてもデフォルトで現在と同じユーザ名でログインセッショ ンを開始することができる。 これはTELNETプロトコルの TELNET Environment Option を使って、USER 環境変数をクライアント からサーバに送ることによって実現されている。また、-l オプションで別のユーザ名 を指定することもできる。ttplaydではこの 機構を用いて、再生するデータの選択を可能にした。たとえば、大 和の emacs-w3m のビデオを再生するには次のように実行すればよ い。

% telnet -l emacs-w3m tty.namazu.org 10023
または
% browser telnet://emacs-w3m@tty.namazu.org:10023/

URL 表記の場合は、ユーザ名のフィールドを利用して録画データを指定 する。ただし、telnet URLをサポートしたブラウザは少なく、 サポートされていても、適切なクライアントが起動するとは限らな いため、誰でも簡単に使える状況とはいえない。

ttyplaydは、ttyplayサーバだけでなくWebサーバとしての機能も有 している。我々はこれをハイブリッドサーバと呼んでいる。ttyrec の録画データが保存されているディレクトリを指定すれば、その一 覧をWebページとして提供できる。当然ながら、そのページには ttyplayサーバへのリンクを表示する。また録画データ自体を application/x-ttyrec というMIME typeでダウンロード可能である。 従ってブラウザ側で、このMIME type に対して ttyplay を実行す るように設定しておけば自動的に再生が行われる。 以上のような機能をもつ ttyplaydを用いると tty mania の維持管理コストを削減できる。

M-x play-function

大和は ttyrecをEmacsのヘルプ機能の一部として利用することを考 えた。M-x describe-function, M-x describe-mode, M-x infoなど Emacs のヘルプは充実している。しかし現状のヘルプ機能で得られ るのは文章化された情報だけであり、それを読んで理解する必要が ある。特にEmacsを使い始めた初心者にとって、文章を読んで機能 を理解するのは負担が大きい。

そこで、M-x play-functionは Emacsの関数を動画によって説明す るための枠組みを提供する。ヘルプ動画の提供者は、説明したい関 数の動作をEmacs 上で実演し、それをttyrec を用いて録画する。 そして、ユーザが M-x play-function に続いて関数名を入力する と、Emacsは新しいフレームを開いてヘルプ動画を再生する。

ttyrec を用いると、このような単純な仕組みで動画ヘルプが実現 できる。へルプ動画が端末の表現力に限定されるという欠点がある ものの、Emacsの基本的な編集操作は十分にカバーできると我々は 考えている。 たとえば、矩形を切り取って空白で埋め尽くすclear-rectangle は 言葉で説明されても理解しづらいが、play-function で動画として 説明されると一目瞭然である。

[play-function-1] [play-function-2]
図5: M-x play-function による clear-rectangle のヘルプ

gttyplay

gttyplayは ttyplay コマンドに GTK+ の GUIを付加した再生ツー ルである。gttyplay は、再生の一時停止、再生速度の動的な変更、 プログレスバーによる経過表示といった機能を提供する。再生の表示は kterm などの端末の中で行われる。

[gttyplay]
図6: gttyplay

Ruby/TtyPlay

Ruby/TtyPlay は ttyplay と同様の処理を行う Ruby用のライブラリである。 Ruby/TtyPlay を用いると、Rubyから手軽に ttyrec の録画データ を扱うことができる。実際、ttyplayd では、ttyplayコマンドを呼び出す代わりに、Ruby/TtyPlay の TtyPlayer オブジェクトを用いて録画データの配信を行っている。

x11rec

ttyrecによって端末の録画が実現されると、今度は任意の X上のア プリケーションを録画するツールが欲しくなった。調べると、 GTK+ のアプリケーション の操作を記録・再生する Gerd というツールが見つかったが、対象が GTK+に限定されることと、 出力ではなく操作を記録するために再生時に実際に GTK+アプリケーションが動かされるという点が不便である。 そこで、高林は X 上のアプリケー ションを録画するツールx11rec を開発し た。これは、xwd を連続的に実行して、最後に ImageMagickGifsicle を用いて MNGまたは アニメーションGIFのフォーマットで動画ファイルを作成するとい う素朴な代物である。しかし、このような 力技なやり方であるにも関わらず、十分な性能で動く。実際、 Pentium III 700 MHz の計算機では gnomine を 14.5 fps で録画することができた。

[gnomine] [gnomine] [gnomine] [gnomine]
[gnomine] [gnomine] [gnomine] [gnomine]
図7: x11rec で録画した gnomine [録画データ]

x11rec は極めて素朴な手法によって実現されているため、マウス カーソルをキャプチャできない、録画のフレームレートが正確ではない、 遅い計算機では使い物にならない、などの多くの欠点がある。一方、 vncrecvnc の 描画プロトコルを元に録画を行うため、スクリーンを連続的にビットマップ 画像としてキャプチャするのではなく、一連の描画イベント を記録する。vncを経由しているため、マウスカーソルのキャプチャも可能である。 さらに、 x11rec が完成してしばらくすると、Rasca による XVidCap が見つかった。これはスクリーンを動画としてキャプチャする GUI つきのツールである。

[XVidCap]
図8: XVidCapの動作画面

vncrec や XVidCap と比べると x11rec はずいぶんと素朴なツール である。実際のところ、 x11rec の利点は、Ruby でたった 100行 程度で実現されているという単純さくらいしかない。

ところで、XVidCap も内部的に xwd と同様に Xサーバから特定の 領域のビットマップ画像を得るため、マウスカーソルのキャプチャ は行えない。 通常の Xサーバから直接マウスカーソルをキャプチャすることは難しいようだが、 田岡 は、XFree86 の DGA (Direct Graphic Access) の拡張機能を利用してマウスカーソル込みでスクリー ンをキャプチャするツールxdgagrab を公開している。

なお、マルチメディアに強い UNIXである IRIX には スクリーンやビデオ入力などを動画および静止画としてキャプチャする MediaRecorder という高機能なツールが付属している。 MediaRecorderの完成度は高く、マウスカーソルのキャプチャが可能である。 また、Windows にはスクリーンを録画再生するツールとし て ScreenCamSnagIt がある。

Expect

Don Libes によるExpect は、ftp や telnet などの対話的なソフトウェアの操作を自動化するツール である。Expect を用いると、ユーザ名やパスワードの入力が自動 で行えるため、シェルスクリプトや Makefile の中から対話的なソ フトウェアを一括に処理できる。

screen

GNU Projectscreen は VT100/ANSI端末をエミュレートする端末マネージャである。screen を用いると、1つの端末で複数の仮想端末を切り替えて使うことが できる。screen は、端末の出力のログを記録したり、その時点の ハードコピーを記録することができる。さらに、端末に出力された ものをコピーアンドペーストすることもできる。仮想端末を管理し ている部分と端末をエミュレートしているフロントエンドは分かれ ており、任意の時点でそれを切り離したり、接続し直すことも可能 である。したがって、作業中にネットワークが不意に切断されても、 screen で作業していればあとでscreenのセッションに再接続すれ ば、作業をそのまま再開できる。さらに複数のフロントエンドで 1 つのscreenセッションを共有することもできる。これは、2人のユー ザが 1つの仮想端末を共有して作業を行うのに利用できる。下の図 は画面を上下に分割してそれぞれのウィンドウに異なる仮想端末を 割り当てている様子を示す。

[screen]
図9: screenの動作画面

おわりに

ttyrec はソフトウェア単体としてみるとたわいもない代物である し、実際にも大したことはできないのであるが、どういうわけか 「これを使えばいろいろなことができそうだ」という幻想を物好き な人たちに与える効果を持っていた。半日で作ったようなソフトウェ アで多くの人を楽しませることができたのは嬉しいかぎりである (とはいっても狭い世界での話だが)。

素朴なアイディアと単純な実装が取り柄の ttyrec であるが、その コンセプトを発展させて ttyrec を内蔵した端末があればおもしろ いのではないかと考えている。これは、GUIのスライダーを使って 自由自在に過去に遡ったり、過去の行動履歴を動的に検索したりで きるという端末である。計算機資源が加速度的に豊かになってゆく につれて、あらゆる履歴を富豪的に記録する タ イムマシン式のアプローチはごく自然なものになりつつある。

[ttyrec terminal]
図10: ttyrecを内蔵した端末

ところで、ttyrec を不正侵入者を追跡する用途に使えるのではな いか、という指摘を海外からもらったが、逆に、悪意を持った人間 によって悪用される危険性も考えられる。我々は平和的な利用法を 期待するものであり、ttyrec が悪用されないことを願っている。

参考文献

参考文献は本文中にハイパーリンクとして埋め込んだ。Web版は http://0xcc.net/pub/lc2001/ から閲覧可能である。なお、本文中は敬称略とした。

著者紹介

高林哲
ソニーコンピュータサイエンス研究所。 奈良先端科学技術大学院大学博士後期課程。 大学時に 全文検索システムNamazuを開 発して以来、フリーソフトウェアの世界に興味を持つ。最近は UNIXにみ る世代間の断絶と題して、旧世代と新世代のUNIXハッカーの違 いを分析しようと試みたが、一般の人から見ればどちらも同じでは ないかと気づき、どうでもよくなりつつある。
鵜飼文敏
日本ヒューレット・パッカード株式会社。Debian Projectオフィシャル メンバー、Debian JP Projectリーダー、日本Linux協会会長。大学院在籍中に386BSD やLinuxをPC98アーキテクチャで動かして以来、フリーなオペレー ティングシステムの世界にはまる。Debian JP Project創設時のメ ンバで以後Debianを中心に活動。debian.or.jp およびlinux.or.jpなどの運用管理 を行なっている。
大和正武
奈良先端科学技術大学院大学博士後期課程。gyve, gtkDPS, dgs, gs-cjkの開発に参加。 フリーソフトウェアの開発は情操教育の役に立つような気がしてい る。

Satoru Takabayashi