Archive

tmux 内で SSH した時のロギングを自動でやる

この記事は Pepabo AdventCalendar 2014 の9日目の記事です。
前日はinouetakuyaさんでした! 明日はtnmtさんです!

今年まさかアドベントカレンダーに参加することになるとは思っていませんでしたが、
今朝社内IRCにてチーム内で反響があった tmux で作業をする際の tip を紹介したいと思います。


今朝のチームのIRCの一幕

私はいちいち手動で作業ログを取得するのが面倒なので普段から踏み台サーバの tmux で pip-pane を使ってほぼ自動的にやっているのですが、 今朝以下を zipper さんに発見されたのをきっかけにすこし盛り上がりました。

laughk 11803 0.1 0.0 74852 1496     ? Ss  10:23 0:00 tmux -2
laughk 11804 0.1 0.0 65764 3200 pts/3 Ss+ 10:23 0:00 \_ -bash
laughk 11861 0.0 0.0 54660 2756 pts/9 Ss+ 10:23 0:00 \_ ssh db002.******************
laughk 11863 0.0 0.0 63824 1124     ? S   10:23 0:00 \_ sh -c cat >> /home/laughk/.tmuxlog/db002.****************/2014-12/09/102348.log
laughk 11864 0.0 0.0 58888  532     ? S   10:23 0:00 \_ cat

IRCログ

10:26:21    zipper | 全然関係ないけど、いわっちさー作業ログってどうやって取ってるの?
10:26:48   iwasaki | お
10:26:51    zipper | http://ghe.**********/gist/zipper/30d0d4a03553bab1d70e
10:26:54    zipper | これ気になる
10:26:56    zipper | cat >> ?
10:27:09   iwasaki | ああ
10:27:51   iwasaki | tmux pipe-pane って機能使ってやってる感じです。
10:28:07   iwasaki | せっかくなのでgistに書き起こしてみます
10:28:31    zipper | pipe-paneか
10:28:36    zipper | 使ってる使ってる
10:28:51    zipper | pipe-pane使うとフォークするんだなぁってことを知った
10:28:56    zipper | そりゃそうだ感あるけどw
10:28:56  Bob_tani | おれも、いわっちの話きいてまねしていれた。
10:30:05   iwasaki | http://ghe.**********/gist/laughk/cd3e1755bffcd899efc9
10:30:05        -- | Notice(zipper): bind-key H command-prompt -p "logname:" "pipe-pane 'cat >> $HOME/logs/%%.log' \; display-message
                   | 'Started logging to $HOME/logs/%%.log'"
10:30:05        -- | Notice(zipper): bind-key h pipe-pane \; display-message 'Ended logging'
10:30:11    zipper | ↑こんな感じで入れてた
10:30:17      tora | ほうほう
10:30:19    zipper | っても、glidenoteさんのパクリな気がする
10:30:21      tora | さっそくパクろう
10:30:21   iwasaki | 相当強引ですが、↑ を bashrc に書いてますねー
10:30:26    zipper | なるほど
10:30:37   iwasaki | tmux 内で ssh すれば自動的にロギング開始です
10:30:40    zipper | tmuxならdefault-commandあたりでできそうな気がする
10:30:43    zipper | おお
10:30:46    zipper | かっこいい
10:31:03      tora | 自動!
10:31:14      tora | ログイン先にログがでるのはいいすね
10:31:41   iwasaki | いちいちロギング有効にしたりするのがダルかった+忘れることが多かったので頑張って見た感じです
10:31:43        -- | Notice(tora): やっぱりそうなるよねぇ > /home/laughk/bin/tmux
10:31:57    zipper | tmuxバージョンあげよう計画
10:32:01    zipper | ってか、rpm作ろうw
10:32:11    zipper | *****-repoにうpればよい
10:32:42    zipper | みんな俺俺tmux入れるのはツライ
10:34:11    zipper | RHEL Client relase …?
10:34:21    zipper | Tikango
10:34:26    zipper | Tikanga
10:36:42        -- | Notice -> #**********: なんかアドベントカレンダーのネタこっちのほうが良さげ (tmux 自動ロギング)
10:37:04    zipper | 両方書けばいいんだよ!!!
10:37:11        -- | Notice -> #**********: weechat ネタ8割がたすでに書いてる...
10:37:17        -- | Notice -> #**********: はっ
10:37:28    zipper | 別に1つである必要はないのだよ!
10:37:35        -- | Notice(tora): じゃあ僕の回で代わりに書いて下さい。
10:37:39        -- | Notice(zipper): それはダメw
10:37:44        -- | Notice -> #**********: ちょw
10:37:46        -- | Notice(tora): えっ
10:38:23    zipper | 12/25空いてるよw
10:38:27   iwasaki | wwww
10:38:35    zipper | http://qiita.com/advent-calendar/2014/pepabo
10:38:55   iwasaki | ちなみにアドベントカレンダーでtmuxのロギングネタ書くとしたら、今のIRCのやりとり引用してもよいです?
10:39:37    zipper | 私はいいよ
10:39:38      tora | 開かれたチャンネルなので引用に断りはいらないとおもわれ
10:39:48    zipper | そうね
10:39:48   iwasaki | 了解っす!
10:40:33    zipper | 既知かもしれないけど、私の設定の元ネタこれね https://github.com/glidenote/dotfiles/blob/master/.tmux.conf#L53
10:40:38    zipper | パクったった
10:40:47        -- | Notice(zipper): けど、bind Hはめんどい
10:40:52        -- | Notice(zipper): 変えたいと思っている
10:41:08   iwasaki | 実は自分もこれをパクった後頑張って自動で走らせるようにしました!w
10:41:13    zipper | だよねーw

やっていること

やりかたは様々ありそうですが、私の場合は ~/.tmux.conf をいじるのではなく、
~/.bashrc または ~/.zshrc に以下の関数を定義してssh コマンドに細工をしています。

## Tmux + SSH --------------------------------------------------------
function ssh_tmux() {
  tmux  set-option default-terminal "screen" \; \
        new-window -n $(echo $@ | perl -ple 's/(^|\s)-[^\s] *[^\s]+//g' | cut -d" " -f2 ) "exec ssh $(echo $@)" \; \
        run-shell        "[ ! -d $HOME/.tmuxlog/#W/$(date +%Y-%m/%d) ] && mkdir -p $HOME/.tmuxlog/#W/$(date +%Y-%m/%d)" \; \
        pipe-pane        "cat >> $HOME/.tmuxlog/#W/$(date +%Y-%m/%d/%H%M%S.log)" \; \
        display-message  "Started logging to $HOME/.tmuxlog/#W/$(date +%Y-%m/%d/%H%M%S.log)"
}

if [[ $TERM = screen ]] || [[ $TERM = screen-256color ]] ; then
  alias ssh=ssh_tmux
fi

これを仕込むことでtmux上でのsshコマンドが以下のようになります。

  • 新しい window で TERM=screen でリモートセッションが始まる。
  • 作成された window 名が接続先のホスト名またはIPアドレスになる
  • ~/.tmuxlog/(接続先ホスト名またはIPアドレス)/YYYY-MM/DD/HHMMSS.log というファイルに接続先での作業のロギングをする。

個人的にはログを保存するディレクトリはホストごとに分けたいし、
window名はホストと同じにしてどこにログイン中なのかわかるようにしておきたい。
あとはscreen-256colorが有効なまんまだとリモート先で悪さされることが結構あるのでよしなにしたい
といった思いからこんな感じになっております。 (強引だとは思うのでもっといい方法あったら知りたい...)

これを普段踏み台で使っているサーバに仕込んでおけば、tmuxを起動するだけでロギングするのを忘れずにすみます。 上記IRCログにあるようにtmuxが古いと使えなかったり、地味にtopをやりっぱなしにしておくとログがとんでもなく肥大したりしますが概ね快適に使えています。

取得したログを確認したい場合はscriptコマンドで取得したもの同様にエスケープシーケンスも入っているので less -rless -R で確認するといい感じです。

参考という名の偉大なる元ネタ様