pwntools を使ったエクスプロイトコードをデバッグする(gdb.debug( bin_file ))とき、別ウィンドウが立ち上がって、GDB が起動します。Ubuntu では、うまく別ウィンドウが起動してくれるのですが、Parrot OS 6.1 では、なぜか、別ウィンドウが起動してくれません。
いろいろ情報を探したり、ChatGPT に聞いたりしたところ、context の terminal を明示的に設定する必要がある、ということが分かりました。
書籍の「詳解セキュリティコンテスト: CTFで学ぶ脆弱性攻略の技術 Compass Booksシリーズ」の提供してくれているエクスプロイトコードでは、context の terminal に、tmux を設定していました。
そこで、今回は、いい機会ですので、tmux の導入をやってみたいと思います。
それでは、やっていきます。
はじめに
tmux の GitHub です。tmux の公式サイトを探しましたが、見当たらなかったので、おそらく、この GitHub が公式サイトなんだと思います。
GitHub 内の Wiki(https://github.com/tmux/tmux/wiki)から見ていくと良さそうです。
Getting started、インストール方法、マニュアルへのリンクが掲載されています。ここでも、これらを参考にしながら進めていきます。
Getting started
最初に、Getting started のリンクがあるので、こちらを見ていきます。
tmux とは、ターミナル内で、複数のターミナルプログラムを実行できるようにするものです、という説明があります。
私の通常のターミナルの使い方
私の場合、普段は、Virtual Box の Parrot OS を起動させて、Windows の TeraTerm でコマンドを実行するという方法で、いつもやっています。複数のターミナルが必要になった場合は、複数の TeraTerm を起動して対応しています。
TeraTerm 間の移動は、Ctrl + Tab で切替ができるので、通常は、tmux の必要性は少ないです。シングルモニタの場合は、1つのウィンドウに複数タブで作業する方が効率が良いと思いますが、複数モニタを使っていると、ウィンドウを移動させて、複数のウィンドウを同時に見ながら作業するので、単一ウィンドウを複数使う方がやりやすいんですよね。
あと、TeraTerm のいいところは、いろいろカスタマイズしなくても、デフォルトの状態で、とても使いやすくて、軽く動作してくれるところです。例えば、選択しただけでクリップボードに入ってくれたり、ダブルクリックすると単語単位で選択してクリップボードに入れてくれたり、Alt + v で貼り付けも出来ます。あと、しばらく使った後でも、上にスクロールすると過去の結果がちゃんと残ってくれてるところです。他のターミナルプログラムは、上にスクロールすると、過去の結果がぐちゃぐちゃになったり、残ってなかったりします。。
tmuxが必要になった理由
上でも言いましたが、普段は、tmux の必要性は低いのですが、冒頭に書いた課題に対して、tmux を使って解決できたので、導入しました。
tmuxの特徴
話がそれましたが、Getting started を見ていきます。結構長いです。
まず、1番のメリットは、SSH などで接続して作業している場合、tmux で作業していた状態(サイトで書かれているように、長いコンパイルを開始しておくなど)とすると、いったん、ホストとの接続を閉じて、また、しばらくして、再度、ホストと接続したとき、tmux を起動すると、以前の状態が保たれています(実行していたコンパイルは tmux を閉じても継続される)。tmux は、一度起動すると、明示的に終了しない限り、ずっと、継続して動作してくれています。ただし、ホストが再起動すると、セッションは全て消えます。これについては、プラグインを入れることで、再起動してもセッションが残るようにすることが出来ます(後述します)。これは、とても重要だと思いますが、Getting started には書かれていないようです。
あとは、QEMU を CUI で起動したとき、ネットワーク接続が出来ない場合(ネットワーク接続が出来れば、複数の SSH接続が出来る)は、ターミナルを複数起動することが出来ません。そんなときでも tmux を導入すると、複数のウィンドウ(やペイン)を使うことが出来ます。
かなり前に、私も一度 tmux を導入したことがありました。しかし、すぐに使うのをやめました。理由は、tmux は、デフォルトの状態では、非常に使いにくいです(Windowsユーザには直感的に扱いにくい操作方法であるため)。具体的には、上にスクロールしても、過去の結果が残ってくれません(設定などで残せるのかもしれませんが、今は分かりません)。また、コピペも直感的にできませんし、マウスも使えません。いろんな設定や、プラグインを入れて、ようやく使いやすくなります。また、話がそれたので戻します。
tmux に存在する、セッション、ウィンドウ、ペインの概念の説明があります。この概念は、説明を読んでも分かりにくいところです。簡単に言うと、セッションは、上で述べたように、コンパイルを実行した状態で、tmux を閉じても、コンパイルは継続されます。これをセッションと表現しています。
ウィンドウは、ブラウザや、ターミナルのタブのようなもので、画面ごと切り替えてターミナルを操作するものです。それに対して、ペインは、画面を分割して、それぞれのターミナルを見ながら操作できるというものです。最初は、ウィンドウだけを使う方が分かりやすいと思います。慣れてきたら、ペインも使っていく、というのがいいと思います。
あとは、具体的な操作方法が書かれています。ここからは、使いながら見ていくのがいいと思います。
インストール方法
tmux の単体のインストールはとても簡単です。
$ sudo apt install tmux
設定
インストールした後、Getting started を見ながら、tmux の操作をやっていくと、キー割り当て(キーバインド)が使いにくいことがあると思います。ここでは、そのキー割り当てを変える方法を説明します。
Getting started にも書かれていますが、設定ファイル(.tmux.conf)を新しく作り、そこに記述することで、キー割り当てを変更することが出来ます。また、この設定ファイルには、後述するプラグインを有効にすることにも使います。
では、具体的にやっていきます。ホームディレクトリに、.tmux.conf というファイルを新しく作ります。そこに設定内容を記載していきます。
tmux は、何をするにも、C-b(プリフィックスキー)を押すところから始まりますが、このキー割り当てが問題です。bash を使うと、C-b は左に進む機能が割り当てられていて、それが使えなくなるからです。まずは、プリフィックスキーのキー割り当てから変えていきます。
$ nano ~/.tmux.conf
設定は、以下のようになります。私の場合、プリフィックスキーは、Ctrl + w に変更しています(1行目)。また、C-b を無効にしています(2行目)。Getting started では、3行目の記述もありますが、私は記述していません。3行目の記述の意味は、tmux上で動かしてるアプリケーションにも、C-w を送るということらしいです(from ChatGPT)。今のところ、必要性を感じないので、3行目は無効にしています。
5行目は、Getting started にも紹介がありますが、マウス操作を有効にするための設定です。アクティブなウィンドウやペインの変更、テキストのコピー(クリップボードには入らず、tmux内で貼り付け可能)などです。これは有効にしておかないと、かなり不便です。
set -g prefix C-w
unbind C-b
#bind C-w send-prefix
set-option -g mouse on
プラグインの追加
ここからは、標準の tmux に機能を追加するプラグインの紹介です。
Tmux Plugin Manager
まず最初は、tmux のプラグインを管理するプラグイン(Tmux Plugin Manager:以下、tpm)です。これを使うことによって、個別のプラグインのインストールを、.tmux.conf に記述するだけで、自動的にダウンロードして、インストールしてくれるようになります。
GitHub に書かれてる通りに、インストール、設定をします。Gitクローンした後、nanoコマンドを使って、設定ファイルに書き込み、tmux source で、更新した設定ファイルを読み込んでいます。
$ git clone https://github.com/tmux-plugins/tpm ~/.tmux/plugins/tpm
$ nano ~/.tmux.conf
$ tmux source ~/.tmux.conf
設定内容は以下です(GitHub に書かれてる内容)。
最初に設定されているのが、tpm です。そのすぐ下に設定されている tmux-sensible は、別のプラグインです。おそらく、tpm と同じ GitHub で管理されているプラグインなので、ついでに入れてくれているんだと思います。
# List of plugins set -g @plugin 'tmux-plugins/tpm' set -g @plugin 'tmux-plugins/tmux-sensible' # Other examples: # set -g @plugin 'github_username/plugin_name' # set -g @plugin 'github_username/plugin_name#branch' # set -g @plugin 'git@github.com:user/plugin' # set -g @plugin 'git@bitbucket.com:user/plugin' # Initialize TMUX plugin manager (keep this line at the very bottom of tmux.conf) run '~/.tmux/plugins/tpm/tpm'
この後、tmux を起動して、prefix + I(プリフィックスキーの後、シフトキー+i)で、プラグインをインストールします。この prefix + I は、tmux環境のリフレッシュもしてくれるので、何回実行しても大丈夫です。
あと、一応、tmux-sensible は以下です。
ここに書かれている以下の設定内容が、自動的に反映されるようです。わざわざ設定しなくても、必要そうなものを設定してくれている、というように理解しています。また、ユーザが設定したものを上書きしたりしない、と書かれてます。
# Address vim mode switching delay (http://superuser.com/a/252717/65504) set -s escape-time 0 # Increase scrollback buffer size from 2000 to 50000 lines set -g history-limit 50000 # Increase tmux messages display duration from 750ms to 4s set -g display-time 4000 # Refresh 'status-left' and 'status-right' more often, from every 15s to 5s set -g status-interval 5 # (OS X) Fix pbcopy/pbpaste for old tmux versions (pre 2.6) set -g default-command "reattach-to-user-namespace -l $SHELL" # Upgrade $TERM set -g default-terminal "screen-256color" # Emacs key bindings in tmux command prompt (prefix + :) are better than # vi keys, even for vim users set -g status-keys emacs # Focus events enabled for terminals that support them set -g focus-events on # Super useful when using "grouped sessions" and multi-monitor setup setw -g aggressive-resize on
Tmux Resurrect
こちらも、tpm と同じ GitHub に置かれてるプラグインで、ホストを再起動しても、セッションを継続してくれます。tmux環境を保存するときは prefix + s、環境を復元するときは、prefix + r ですが、下の tmux-continuum を使うとこれらを自動で行ってくれるので、基本的に不要になります。
.tmux.conf に以下を追記します。
set -g @plugin 'tmux-plugins/tmux-resurrect'
tmux-continuum
こちらは、Tmux Resurrect が使われている前提で、(デフォルトでは)15分間隔で、tmux環境を自動保存してくれます。また、マシンの起動時に、自動的に tmux を起動する機能があるようですが、この機能を有効にするには、何か設定が必要らしく、私は使っていません。また、tmux を起動すると、自動的に、tmux環境を復元してくれる機能があります。以下の設定の 2行目を追記すると、この機能が有効になります。
.tmux.conf に以下を追記します。
set -g @plugin 'tmux-plugins/tmux-continuum' set -g @continuum-restore 'on'
コピペの問題
基本的に、tmux 内でコピーしたものは、クリップボードに入りません。tmux 内では、コピーしたものを貼り付けることが出来るのですが、クリップボードに入らないため、他のアプリケーションには、コピーしたものを利用することが出来ません。
対策としては、いろいろあるようですが、tmux の wiki に書かれている方法(https://github.com/tmux/tmux/wiki/Clipboard)で、うまくいった方法を採用しました。
まず、xsel をインストールします。これはクリップボードに出力したり、クリップボードから入力したりするツールです。これを利用することで tmux と、それ以外とのクリップボードのやり取りを可能にしているようです。
$ sudo apt install xsel
合わせて、.tmux.conf も追記が必要です。tmux の wiki には、-bi ではなく、-i と書かれてるのですが、私の環境では、-bi でないと動きませんでした。
set -s copy-command 'xsel -bi'
これで快適に(?)、tmux を利用できるようになります。
TeraTermでtmuxを使ってる場合のコピーについて
TeraTerm で tmux を使ってる場合、コピーしようとすると、エラーになってしまいます。こちらは、TeraTerm の設定で回避することが出来ます。
TeraTerm のメニューの設定→その他の設定→制御シーケンスに進みます。リモートからのクリップボードアクセスが無効になってると思うので、「読込/書込」に変更します。また、「リモートからのクリップボードアクセスを通知する」のチェックを外すと、クリップボードにアクセスしたときに、いちいち、通知が来るのを無効にすることが出来ます。
一方、もし、単純に、TeraTerm上の文字列をコピーしたいだけなら、TeraTerm のコピーの機能を使うこと(tmux を使わない場合に TeraTerm でコピーする方法と同じ)で、文字化けを回避することが出来るようです。Ctrlキーを押しながら、ドラッグすると、TeraTerm のコピー機能を使うことが出来るので、文字化けを回避できます。
現状は、tmux でコピーすると、文字化けする問題があります。こちらはまだ未解決です。この辺が使う人を選ぶツールですよね。。
セッションがたくさん増える問題
これは、私の使い方が悪いのかもしれませんが、tmux を起動するときに、ついつい、$ tmux とやってしまいます。すると、以下のように、たくさんセッションが出来てしまいます。。
そこで、今後は、使い方を改める意味もあって、ここに記載しておきます。
ちなみに、現在のセッションを確認するには、以下のようにします。
$ tmux ls 0: 1 windows (created Sat Nov 8 21:27:32 2025) 1: 1 windows (created Sat Nov 8 21:27:32 2025) 2: 1 windows (created Sat Nov 8 21:27:32 2025) 3: 1 windows (created Sat Nov 8 21:27:32 2025) 4: 2 windows (created Sat Nov 8 21:26:14 2025) 5: 1 windows (created Sat Nov 8 21:27:27 2025)
使わないセッションは、$ tmux kill-session -t [セッション名] で削除することが出来ます。これを毎回打つのは大変なので、エイリアス(`alias tk='tmux kill-session -t')を設定して、以下のように削除しています。
$ tk 0 $ tk 1 $ tk 2
本来は、新しいセッション名を指定して、tmux を起動する $ tmux new -s [セッション名] を使って、以降は、$ tmux a -t [セッション名] で、新しく作ったセッションを再度使う、という方法をするのだと思います。
一方、たくさんの種類のセッションを使い分けなくていい、私のようなケースであれば、セッションに名前を付けなくても、$ tmux ls で、ウィンドウ数が多いセッションが、使いたいセッションということが分かります。そして、その番号(tmux ls で表示されたセッション一覧の行頭の番号)を指定して、tmux を起動できる($ tmux a -t 4)ので、今後は、そういう運用にしていこうと思います。ついでに、起動もエイリアス(`alias ta='tmux a -t')を設定しました。
キーバインドの詳細
上の設定で、プリフィックスキーのキーバインドを変更しました。ここでは、もう少し詳しくキーバインドについて紹介します。
tmux のキーバインディングは、デフォルトで、以下の 4つのキーテーブルがあります。
- root:プリフィックスキーを使わないキーが定義されています
- prefix:プリフィックスキーを使ったキーが定義されています
- copy-mode:コピーモード中に使うキーが定義されています(emacsスタイル)
- copy-mode-vi:コピーモード中に使うキーが定義されています(viスタイル)
コピーモードとは、ターミナル内の文字列を選択、コピーできるモードのことです。
例えば、直前に catコマンドで出力した内容に、実行したいコマンドの文字列が含まれていたとします。通常は、マウスを使ってコピーしていくところだと思いますが、コピーモードでは、C-p(上に移動)や、C-f(右に移動)など、emacs で使う移動のキーでカーソルを動かし、選択、コピーが出来ます。
デフォルトでは、emacsスタイルの copy-mode が使われていますが、viスタイルの copy-mode-vi に切り替えることも出来ます。
私は、emacsスタイルのまま使ってますので、関係するキーテーブルは、root、prefix、copy-mode の 3つということになります。つまり、この 3つのキーテーブルに、現在有効になっているキーバインドが定義されているということです。
.tmux.conf では、このデフォルトのキーバインドを上書きする設定を記載したということになります。設定後に、このキーテーブルを見ると、更新されたキーバインドが表示されます。
では、このキーテーブルを確認してみます。何も指定しないと、全てのキーテーブルが表示され、-T で、個別のキーテーブルを指定すると、そのキーテーブルだけが表示されます。list-keys は、lsk と省略することも出来るようです。
$ tmux list-keys bind-key -T copy-mode C-Space send-keys -X begin-selection bind-key -T copy-mode C-a send-keys -X start-of-line bind-key -T copy-mode C-b send-keys -X cursor-left bind-key -T copy-mode C-c send-keys -X cancel (以下、省略) $ tmux lsk -Troot bind-key -T root MouseDown1Pane select-pane -t = \; send-keys -M bind-key -T root MouseDown1Status select-window -t = bind-key -T root MouseDown2Pane select-pane -t = \; if-shell -F "#{||:#{pane_in_mode},#{mouse_any_flag}}" { send-keys -M } { paste-buffer -p }
ここからは、実際に、キーバインドを変更してみたいと思います。
コピーモードでは、プリフィックスキー + [ で開始されます。ターミナル内を移動して、対象の文字列の先頭で、Ctrl + スペース で、コピーの選択を開始できます。最後に、プリフィックスキー + w で、コピーを行い、コピーモードを終了します。コピーした文字列は、プリフィックスキー + ] で貼り付けることが出来ます。
私は、プリフィックスキーを C-b から C-w に変更しているので、コピーしてコピーモードを終了できない状態です。そこで、コピーしてコピーモードを終了するキーバインドを変更したいと思います。
現在の定義を探します。
$ tmux lsk -Tcopy-mode | grep C-w bind-key -T copy-mode C-w send-keys -X copy-pipe-and-cancel
コピーして、コピーモードを終了するキーバインドを Enterキーにしたいと思います。.tmux.conf に、C-w のところを Enter に変えて記述すればいいです。あとは、設定を有効にするために tmux source で読み込みます。
$ nano ~/.tmux.conf bind-key -T copy-mode Enter send-keys -X copy-pipe-and-cancel $ tmux source ~/.tmux.conf
これで、コピーモードがちゃんと使えるようになりました。
私の設定(.tmux.conf)
ここまでで紹介した内容ですが、現在の私の設定です。
# List of plugins set -g @plugin 'tmux-plugins/tpm' set -g @plugin 'tmux-plugins/tmux-sensible' set -g @plugin 'tmux-plugins/tmux-resurrect' set -g @plugin 'tmux-plugins/tmux-continuum' set -g @continuum-restore 'on' set -g prefix C-w unbind C-b #bind C-w send-prefix bind-key -T copy-mode Enter send-keys -X copy-pipe-and-cancel bind-key -T copy-mode C-u send-keys -X page-up bind-key -T copy-mode Space send-keys -X begin-selection set-option -g mouse on set -s copy-command 'xsel -bi' # Initialize TMUX plugin manager (keep this line at the very bottom of tmux.conf) run '~/.tmux/plugins/tpm/tpm'
おわりに
今回は、Linux で使用するツールである tmux の紹介でした。私の場合、常に使っているツールというわけではないのですが、使用頻度が低いだけに、何をどうやって、インストールしたかを忘れてしまうので、記事にした感じです(笑)
最後になりましたが、エンジニアグループのランキングに参加中です。
気楽にポチッとよろしくお願いいたします🙇
今回は以上です!
最後までお読みいただき、ありがとうございました。