この記事を読むと・・・ |
---|
シェルスクリプトでコマンドログを自動取得する方法が理解できる |
ログを取得するシェルスクリプト
以下スクリプトは/var/log/operation
に操作ログを出力するスクリプトです。
#!/bin/bash
# ログディレクトリの設定
LOG_DIR="/var/log/operation"
# ログディレクトリが存在しない場合は作成
if [ ! -d "$LOG_DIR" ]; then
mkdir -p -m 755 "$LOG_DIR"
fi
# 現在の日時を取得
TIMESTAMP=$(date +"%Y%m%d_%H%M%S")
# ログファイル名の設定
LOG_FILE="${LOG_DIR}/operation_${TIMESTAMP}.log"
# ログイン方法の判定と接続元情報取得
if [ -n "$SSH_CONNECTION" ]; then
LOGIN_TYPE="SSH"
IP_ADDRESS=$(echo $SSH_CONNECTION | awk '{print $1}')
else
LOGIN_TYPE="Local"
IP_ADDRESS="localhost"
fi
# ログ情報の収集(ここでログファイルに書き込む)
echo "--------------------------" >> "$LOG_FILE"
echo "Login Time: $(date)" >> "$LOG_FILE"
echo "Login Type: $LOGIN_TYPE" >> "$LOG_FILE"
echo "IP Address: $IP_ADDRESS" >> "$LOG_FILE"
echo "Hostname: $(hostname)" >> "$LOG_FILE"
echo "--------------------------" >> "$LOG_FILE"
# scriptコマンドをバックグラウンドで実行
# -f オプションでリアルタイムでのフラッシュを有効にします。
# -q オプションで起動メッセージを抑制します。
# -a オプションでログに追記する
script -f -q -a "$LOG_FILE"
実際に操作ログを取得した結果例は以下です。
# cat /var/log/operation/operation_20250215_144047.log
--------------------------
Login Time: 2025年 2月 15日 土曜日 14:40:47 JST
Login Type: SSH
IP Address: 192.168.1.1
Hostname: TESTSRV1
--------------------------
Script started on 2025-02-15 14:40:47+09:00 [TERM="xterm" TTY="/dev/pts/1" COLUMNS="80" LINES="24"]
[root@TESTSRV1 ~]#
[root@TESTSRV1 ~]#
[root@TESTSRV1 ~]#
[root@TESTSRV1 ~]# pwd
/root
[root@TESTSRV1 ~]#
[root@TESTSRV1 ~]#
[root@TESTSRV1 ~]#
[root@TESTSRV1 ~]# exit
exit
Script done on 2025-02-15 14:40:54+09:00 [COMMAND_EXIT_CODE="0"]
[root@TESTSRV1 operation]#
ログを自動取得する設定方法
操作ログを取得したいユーザの~/.bashrc
にログを取得するシェルスクリプトを実行させるように設定します。
他にも~/.bash_profile
などのログイン時に動作するファイルであれば設定可能です。
シェルスクリプトを利用してログ取得する設定
$SHLVL
は、現在のシェルセッションのシェルの深さを示す環境変数です。シェルの深さとは、現在実行中のシェルが何回目のシェルであるかを表します。
シェルの深さ は、シェルがどのくらい「階層的」に入れ子になっているかを示します。例えば、最初にログインシェルを開いたときは深さが「1」になります。そのシェルからさらに別のシェルを起動すると深さが「2」になり、さらにその中で新たにシェルを起動すると深さが「3」になります。こうしてシェルを起動するたびに、深さが増加します。
そのままscriptコマンドを実行するシェルスクリプトを設定すると、scriptコマンドを起動するシェルも、さらにscriptコマンドを実行し…と無限ループしてしまいます。そのため、if文で1番上の階層のシェルの場合のみ実行できるようにしています。
~/.bashrc
の末尾に以下の記載を追加すれば、ログイン時に自動で作業ログを取得することができます。
※script
コマンドがログイン時に実行されるためログアウト時にscript
コマンドを終了するためのexit
コマンドを実行する必要があるため、ターミナルから抜けるexit
コマンドと合わせて、2度exit
コマンドを実行する必要があります。
# cat /root/.bashrc
### 末尾に追加 ###
if [ "$SHLVL" = "1" ] ; then
/script/operation_log.sh
fi
scriptコマンドを直接実行してログ取得する設定
~/.bashrc
の末尾に以下の記載を追加すれば、ログイン時に自動で作業ログを取得することができます。script -f -q -a /var/log/operation/operation_$(date +"%Y%m%d_%H%M%S").log
コマンドを直で記載してログイン時の作業ログを取得しています。
# cat /root/.bashrc
### 末尾に追加 ###
if [ "$SHLVL" = "1" ] ; then
script -f -q -a /var/log/operation/operation_$(date +"%Y%m%d_%H%M%S").log
fi
実際に操作ログを取得した結果例は以下です。
# cat /var/log/operation/operation_20250215_150640.log
Script started on 2025-02-15 15:06:40+09:00 [TERM="xterm" TTY="/dev/pts/1" COLUMNS="80" LINES="24"]
[root@SRV1 ~]# pwd
/root
[root@SRV1 ~]#
[root@SRV1 ~]#
[root@SRV1 ~]#
[root@SRV1 ~]# exit
exit
Script done on 2025-02-15 15:06:46+09:00 [COMMAND_EXIT_CODE="0"]