リモートの tmux でコピーした内容のローカルのクリップボードへの反映

この記事は ターミナルマルチプレクサ Advent Calendar 2011 : ATND の15日目です。14日目は yoshikaw さんの 開発版GNU Screenでマウスを使う でした。

GNU screenやtmuxには色々な機能がありますが、その中の一つにコピーモードがあります。コピーモードを使えば、あるウィンドウで選択してコピーをしたテキストを別のウィンドウに貼り付ける事が出来ます。

このコピーモード、使っている内にコピーした内容をOS/ウィンドウシステムのクリップボードに反映したいと思うこともあるのではないでしょうか?

screenやtmuxをローカルのコンピューターで動かしている場合は比較的簡単で、コピーした内容をxselやpbcopyなどのクリップボードの内容を設定できるコマンドに渡すという方法が使えます。しかし、screen/tmuxをリモートのサーバ上で動かしている場合はこの方法は使えません。この場合は以下のような方法が考えられます。

  • sshのX11転送機能を利用する
  • サーバからローカルのコンピュータに接続してデータを送る
  • 端末エミュレータの機能を利用する

ローカル側でXサーバが動いていて、サーバへssh接続している場合はsshのX11転送を利用するのが簡単でしょう。ローカルでscreen/tmuxを動かしている時と同じようにxselが使えます。

2番目の方法はネットワーク越し(sshのリモートフォワードなど)で受け取ったデータをクリップボードに書き込むサーバプログラムをローカルで動かすという物で、例えばyoshikaw さんの実装例があります。

3番目はxtermが持つ機能を利用する方法で、今回はこれについて解説します。

xtermはvt100やECMA-48端末の一般的な制御シーケンスの他に独自の制御シーケンス等に対応しており、これを利用する事によって特殊な機能を実現する事が出来ます。よく知られている物としてはタイトル設定制御文字列があり、シェルやプログラムからタイトル設定用の文字列を送る事によってxtermのウィンドウタイトルを変更できます。

この独自拡張の制御シーケンスの中にクリップボード設定用制御文字列(OSC52)があります。tmux 1.5ではコピーモードで文字列をコピーした時に、この制御文字列を使って同じ内容をクリップボードにコピーする事が出来ます。

OSC52はxtermの独自拡張なのでつい最近まではxterm以外にサポートしている端末エミュレータは無かったのですが、tmuxがOSC52を利用できるようになった影響なのか、最近いくつかの端末エミュレータが立て続けにサポートするようになりました。私が把握している範囲では、xterm以外ではTera Term, RLogin, mltermが対応しており、minttyでも要望が出ているのでその内にサポートされるかもしれません。

設定方法:
OSC52は後述するように状況によってはセキュリティ的に問題が出るため、デフォルト設定では無効にしているしている端末エミュレータが多いです。
その為、この機能を利用するには端末エミュレータ側でOSC52を扱うように設定する必要があります。

xterm:
xtermでは2008/12/30のPatch #238よりデフォルトでこの機能が有効な状態でビルドされるようになりました。(機能自体はもっと前から実装されています)
OSC52を有効にしてtmuxからのクリップボードへの反映を行えるようにする為には、ウィンドウ上でControlを押しながらマウスの右ボタンを押しAllow Window Opsにチェックを入れます。

Tera Term:
Tera Termではバージョン4.72よりOSC52に対応しました。
OSC52を有効にしてtmuxからのクリップボードへの反映を行えるようにする為には、[設定]-[その他の設定]-[制御シーケンス]にある、“リモートからのクリップボードアクセス”を“書込のみ”に設定します。

RLogin:
RLoginでは 2.11.1よりOSC52に対応しました…のですが、タイミングが悪く現在の最新バージョンである2.11.4ではクリップボードへの書き込みが正しく動かないようです。バグ報告はしてあるので、次のバージョンでは正しく使えると思います12/16追記: 本日 RLogin 2.11.5 が出てこの問題も修正されました。以下の設定を行えば問題なく使えます。
設定自体は、[表示]-[オプション設定]-[クリップボード]にある“OSC 52 によりクリップボードの書き込みを許可する”のチェックを入れます。

mlterm:
mltermでは3.0.9よりOSC52に対応しています。
OSC52を有効にしてtmuxからのクリップボードへの反映を行えるようにする為には、~/.mlterm/mainにallow_osc52=trueを追加するか、mlterm起動時に -osc52 オプションを付加します。

tmux側の設定:
tmuxでは起動時にTERM環境変数がxtermやxterm-256colorなどxtermで始まっていると、自動的にこの機能が有効になります。

TERM環境変数がそれ以外の値の場合、.tmux.confに設定を追加する必要が有ります。
例えばTERMがmltermの場合、.tmux.confに以下の設定を追加します。

set-option -ag terminal-overrides ",mlterm:Ms=\\E]52;%p1%s;%p2%s\\7"

これらの設定を行うとtmuxのコピーモードでコピーした時にその内容がクリップボードにも反映されるようになります。

注意点1 – セキュリティ:
OSC52は便利ではあるのですが、状況によってはセキュリティ的に問題が有る場合があります。

OSC52でのクリップボードアクセスにはの読込と書込の2種類の機能がありますが、例えば読込を有効にしている場合、サーバ側のプログラムが定期的に読込アクセスを実施してクリップボードの内容を盗む事が出来てしまいます。

また書込みアクセスを有効にしている場合、こっそりとクリップボードの内容が危険なコマンドに置き換えられていて、貼り付けを行ったら危険なコマンドを実行してしまったという事が起き得ます。

さらに読込と書込の両方が有効になっている場合、まず書込でクリップボードの内容を変更したあとに読込のリクエストを行う事で、指定した文字列をユーザが入力したように見せかける事が出来ます。この場合、攻撃用のテキストファイルをcatコマンド等で表示しただけで被害を受ける可能性があります。

対策としては、以下が考えられます。

  • 信頼できないサーバに接続する時にはOSC52を有効にしない。
  • tmuxでは書き込みのみを使うので、有効にする時は可能ならば書き込みのみを有効にする。
  • tmuxの中で実行されたコマンドに関してはtmuxがOSC52を止めてくれるので、tmux実行時のみOSC52を有効にする。

注意点2 – 対応していない端末エミュレータ:
前述したように、TERM環境変数がxtermで始まる時は自動でこの機能が有効になり、コピーした時にその内容がtmuxから送りつけられます。
OSC52に対応していない端末エミュレータでも通常はこの制御文字列を無視するので問題は出ないはずですが、エミュレーションがいい加減な端末エミュレータの場合、送りつけられた内容を表示しようとして表示が崩れるかもしれません。
その場合は、^b : set-option set-clipboard off を実行して機能を無効化します。

また、コピーした内容が大きい時は多量のデータがやり取りされるので、シリアル通信等の低速の回線の場合はコピー時に待たされる場合があります。これが気になる時もこの機能を無効化しましょう。

最後に:
途中からtmuxの話ではなくOSC52の話が中心になってしまい、すみません。
元々はTera TermでOSC52をサポートした事(これ自体はtmuxのset-clipboardに触発されてです)に関して日記に書こうかなと思っていたのネタが、Advent Calendar に転用できるなと思って転用したというのが理由です。
ただ、利用できる端末エミュレータが限られているのもあり、知らない人には利用方法がわかり辛かったと思うので、紹介できてよかったと思います。

You can leave a response, or trackback from your own site.

Leave a Reply

Subscribe to RSS Feed Follow me on Twitter!