ちょっと前にscriptコマンドで取得したターミナルログにタイムスタンプを付与する方法について記述したが、今回はその状態でさらにscriptreplayを行えるようにしてみる。 ここで厄介なのが、scriptreplayで用いるタイミングが記録されたファイルの書き方が、そのタイムスタンプ+表示されていた文字数になっている事。 行数とかとくに気にされてないので、各行にタイムスタンプが差し込まれている現状だとその文字数が一体何行になるのかを知る必要がある。

1. ログ再生時にタイムスタンプを除外する場合

こっちは簡単。単純にcutコマンドを使ってファイルからタイムスタンプの部分を除外してやれば良い。

ログ取得時

LANG=C script -fqt 2> log.time >(awk '{print strftime("%F %T ") $0}{fflush() }'>> log.session)

ログ再生時

scriptreplay -t log.time <(cut -c 21- log.session)

2. ログ再生時にタイムスタンプが付与された状態にする場合

こっちが、冒頭で書いた点について気にしないといけないのでちょっと難しい。 少々長くなるのだが、ここでは以下のようにawkでタイミングごとの文字数を取得し、tailとheadでログファイルを指定された文字数の範囲を抽出して行数を計算することで対応している。 ログ取得時のコマンドは同じなので割愛。

ログ再生時

scriptreplay -t <(awk 'BEGIN{i=0}{cmd="cat log.session|cut -c 21-|tail -c +"i" |head -c "$2"|wc -l";cmd|getline c;i+=$2;print $1,$2+c*20}' log.time) log.session

とりあえずこんな感じだろうか。 これで、何時頃にどのようなコマンドを実行したのかを確認しつつ、操作時の挙動についても再生ができるはずだ。(vimとかの操作はちょっと厳しいかもしれない…)

なお、ターミナルログ自体はちゃんとタイムスタンプ付きで読める状態(vimとか使ったらわからないが…)になっている。

[root@BS-PUB-CENT7-01 ~]# cat log.session
2017-05-20 21:09:17 Script started on 2017年05月20日 21時09分17秒
2017-05-20 21:09:17 [root@BS-PUB-CENT7-01 ~]#
2017-05-20 21:09:17 [root@BS-PUB-CENT7-01 ~]#
2017-05-20 21:09:19 [root@BS-PUB-CENT7-01 ~]# ls -la
2017-05-20 21:09:19 total 120
2017-05-20 21:09:19 dr-xr-x---.  8 root root  4096  5月 20 21:09 .
2017-05-20 21:09:19 dr-xr-xr-x. 17 root root  4096  1月 20 00:01 ..
2017-05-20 21:09:19 -rw-------.  1 root root 18862  5月 20 21:09 .bash_history
2017-05-20 21:09:19 -rw-r--r--.  1 root root    18 12月 29  2013 .bash_logout
2017-05-20 21:09:19 -rw-r--r--.  1 root root   176 12月 29  2013 .bash_profile
2017-05-20 21:09:19 -rw-r--r--.  1 root root   176 12月 29  2013 .bashrc
2017-05-20 21:09:19 drwxr-xr-x.  4 root root    31  5月 16 10:03 .config
2017-05-20 21:09:19 drwxr-xr-x.  6 root root    89  5月 20 11:29 .cpan
2017-05-20 21:09:19 -rw-r--r--.  1 root root   100 12月 29  2013 .cshrc
2017-05-20 21:09:19 -rw-------.  1 root root    47  5月 20 16:26 .lesshst
2017-05-20 21:09:19 drwxr-xr-x.  3 root root    18  5月 16 09:59 .local
2017-05-20 21:09:19 drwxr-----.  3 root root    18  5月 16 09:58 .pki
2017-05-20 21:09:19 -rw-r--r--.  1 root root   129 12月 29  2013 .tcshrc
2017-05-20 21:09:19 -rw-------.  1 root root  3602  5月 20 19:27 .viminfo
2017-05-20 21:09:19 -rw-r--r--.  1 root root   618  5月 20 17:08 20170520_170807.log
2017-05-20 21:09:19 -rw-r--r--.  1 root root   295  5月 20 18:50 =time
2017-05-20 21:09:19 drwxr-xr-x. 15 root root  4096  5月 16 10:09 DevAudit
2017-05-20 21:09:19 -rw-r--r--.  1 root root   224  5月 20 17:06 aa
2017-05-20 21:09:19 -rw-------.  1 root root   986  1月  1  2016 anaconda-ks.cfg
2017-05-20 21:09:19 -rw-r--r--.  1 root root   311  5月 20 21:09 log.session
2017-05-20 21:09:19 -rw-r--r--.  1 root root     0  5月 20 21:09 log.time
2017-05-20 21:09:19 -rw-r--r--.  1 root root   258  5月 20 18:45 ls.log
2017-05-20 21:09:19 drwxr-xr-x.  5 root root    36  5月 20 11:29 perl5
2017-05-20 21:09:19 -rw-r--r--.  1 root root   496  5月 20 20:55 q
2017-05-20 21:09:19 -rw-r--r--.  1 root root    99  5月 20 11:26 test.pl
2017-05-20 21:09:19 -rw-r--r--.  1 root root   764  5月 20 18:56 test.session
2017-05-20 21:09:19 -rw-r--r--.  1 root root    91  5月 20 18:56 test.time
2017-05-20 21:09:19 -rw-r--r--.  1 root root    28  5月 18 08:50 test1.txt
2017-05-20 21:09:19 -rw-r--r--.  1 root root    86  5月 18 08:40 test2.txt
2017-05-20 21:09:19 -rw-r--r--.  1 root root    47  5月 20 20:33 test3.txt
2017-05-20 21:09:19 -rw-r--r--.  1 root root   554  5月 20 18:51 time
2017-05-20 21:09:19 -rw-r--r--.  1 root root  2081  5月 20 18:50 typescript
2017-05-20 21:09:19 [root@BS-PUB-CENT7-01 ~]#
2017-05-20 21:09:19 [root@BS-PUB-CENT7-01 ~]#
2017-05-20 21:09:20 [root@BS-PUB-CENT7-01 ~]#
2017-05-20 21:09:21 [root@BS-PUB-CENT7-01 ~]# pwd
2017-05-20 21:09:21 /root
2017-05-20 21:09:21 [root@BS-PUB-CENT7-01 ~]#
2017-05-20 21:09:22 [root@BS-PUB-CENT7-01 ~]#
2017-05-20 21:09:22 [root@BS-PUB-CENT7-01 ~]#
2017-05-20 21:09:22 [root@BS-PUB-CENT7-01 ~]#
2017-05-20 21:09:25 [root@BS-PUB-CENT7-01 ~]# exit
2017-05-20 21:09:25 exit