teratermだと機能としてログを取得してくれますが、WindowsでSSHで繋いで~ってことができない場合にこんな方法をご紹介します。
やりたいこと
ログインしたら、exitするまでにコンソールに出力される値をログとしてファイルに書き込みます。
そのままだとコンソールに出力する際の色情報等々エディタで見るときに邪魔なキャラクターが沢山入ってきてしまうので、それの除去もしておきます。
実装
record-operation-log.sh
#!/bin/bash
#
# this script require package "colorize-log".
# So do next command: "sudo apt install colorized-log" if you not installed this package.
# And place this file in "/etc/profile.d/".
#
function formatLogFile() {
target=${logdir}/$1
if [ ! -d ${formatdir} ];then
mkdir ${formatdir}
fi
cat ${target} | ansi2txt | iconv | col -b >> ${formatdir}/formated_${filename}
}
if [ ! -d ~/log ];then
mkdir ~/log
fi
if [ ! -d ~/log/formated ];then
mkdir ~/log/formated
fi
filename="`date +%Y%m%d_%H-%M-%S`_operation.log"
logdir="${HOME}/log"
formatdir=${HOME}/log/formated
touch ${logdir}/${filename}
script ${logdir}/${filename} && formatLogFile ${filename} && exit
Ubuntu20.04で/etc/profile.dに上記スクリプト置いとけばなんの意識もせずにログファイルが取得できるようになります。
解説
使用しているコマンド
・cat… 言わずと知れたヤツ
・script… 端末操作のログを取得
・ansi2txt… コンソールに表示される形式からプレーンテキストに変換
・col… エスケープの文字を削除。colorized-logパッケージをインストールすると使用できる。
配置するディレクトリ
・/etc/profile.d… Ubuntuの場合、ログインする際に読み込むスクリプトを配置するディレクトリ
scriptコマンドは、サブシェルを立ち上げてその中で実行したコマンドやその出力を引数で指定したファイルに、ユーザーがログアウト(exit)した後に書き込んでくれます。
そして、その文字列はコンソールを見やすくするための色情報などのエスケープシーケンスがそのまま出力されてしまうのです。
そこで、ログイン時に実行されるスクリプト(record-operastion-log.sh)にscriptコマンドを書いて実行することで、最初からロギングされるわけです。
そして、オペレーションが終わってexitされた瞬間、scriptコマンドがログファイルに今までの出力を書き込んでプロセスを終了します。
scriptの後に&&で繋がれている関数(formatLogFile)は、scriptがログファイルに書き込みを正常終了させた後に実行されます。
やっていることは、cat → ansi2txt → col とscriptコマンドが作成したログファイルの中身を渡して言っているだけです。
cat <scriptコマンドが作成したログファイル> | ansi2txt | iconv | col -b >> <成型したログファイル>
最後に注意点として、
/etc/profile.d にexitを実行するスクリプトを置いてはいけない
という点について言及しておきます。
今回上に載せたコードでは、最後にexitを書いていますが、これはscriptコマンドと関数が&&でつながっているため、ユーザーがターミナル上でexitを実行しないと実行されないとわかっているからです。怖い人はexit消して使ってください。
何が起きるかというと、ログインした瞬間にexitされるので一生そのサーバーを操作できなくなる可能性があるということです。(1敗)
rm -rf / の次くらいに危険です。
なお、WSLで実行しているLinuxであれば、/etc/profile.dにexitを実行してしまうスクリプトを置いていても対処可能です。
その方法は次回の記事にします。
コメント