【Linux】ログイン後の操作ログを自動取得する方法

ログイン後の操作ログを自動取得する方法
この記事を読むと・・・
シェルスクリプトでコマンドログを自動取得する方法が理解できる
目次

ログを取得するシェルスクリプト

以下スクリプトは/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"]
よかったらシェアしてね!
  • URLをコピーしました!
目次