Uncategorized

Linuxで任意のコマンドをシェルスクリプトで一括実行してログを採取する方法

概要

この記事では、Linux環境で任意のコマンドをリストファイルに記述し、シェルスクリプトを使って一括で実行し、その結果をログファイルに保存する方法について解説します。この手法は、以下のシーンで活用できます:

  • 既存システムの情報採取: 大量のサーバから必要な設定情報を効率的に収集します。
  • 設定確認や単体テスト: 新たに構築したLinuxサーバの設定状態を素早く確認します。

シェルスクリプトの説明

スクリプト本体 Linuxinfo.sh

#!/bin/bash
################################################
#   入力ファイル      :  cmd.list
#   引数              :  なし
################################################

#==============
# 変数定義
#==============
EXEC_USER="root"

# スクリプトの実行ディレクトリを取得
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"

# 外部ファイルのパス
CMD_LIST_FILE="${SCRIPT_DIR}/cmd.list"

#==============
# メイン
#==============

# rootユーザチェック
if [[ $(whoami) != "${EXEC_USER}" ]] ; then
	echo 'rootユーザーで実行してください'
    exit 1  # エラー時にスクリプトを終了
fi

# 入力ファイルチェック
if [[ ! -e ${CMD_LIST_FILE} ]] ; then
	echo '入力ファイルがありません'
    exit 1  # エラー時にスクリプトを終了
fi

# 外部ファイルからコマンドを読み込み、ログファイルを初期化
while IFS=',' read -r output_file command; do
    LOG_FILE="${SCRIPT_DIR}/${output_file}"   # ログファイルの名前を取得
    > "$LOG_FILE"                            # ログファイルを初期化(既存のファイルを上書き)
done < "$CMD_LIST_FILE"

# 外部ファイルからコマンドを読み込み、実行してログに追記
while IFS=',' read -r output_file command; do
    LOG_FILE="${SCRIPT_DIR}/${output_file}"   # ログファイルの名前を取得

    echo "**********" >> "$LOG_FILE"         # 区切り行を追加
    echo "Command: $command" >> "$LOG_FILE"
    echo "" >> "$LOG_FILE"                   # 空白行を追加

    # コマンドを実行して結果をログファイルに追記
    eval "$command" >> "$LOG_FILE" 2>&1 | tee -a "$LOG_FILE"

    echo "" >> "$LOG_FILE"                   # 空白行を追加
done < "$CMD_LIST_FILE"

echo "ログファイルは以下の場所に出力されました:"
ls "${SCRIPT_DIR}/"*".txt"

リストファイル cmd.list

リストファイルには、保存したいログファイル名と実行したいコマンドをカンマ区切りで記載します。次のコマンドは新しい行に記述します。

rhel_1.txt, cat /etc/redhat-release
rhel_2.txt, rpm -qa
rhel_3.txt, crontab -l root
rhel_3.txt, cat /root/.bashrc

ログファイル名は、rhel_3.txtのように複数のコマンドに割り当ててもOKです。

実行例

[root@localhost work]# ls -l
合計 8
-rwxr-xr-x. 1 root root 1849  8月 20 18:30 Linuxinfo.sh
-rw-r--r--. 1 root root  114  8月 20 18:30 cmd.list

[root@localhost work]# ./Linuxinfo.sh
ログファイルは以下の場所に出力されました:
/work/rhel_1.txt  /work/rhel_2.txt  /work/rhel_3.txt

[root@localhost work]# cat /work/rhel_1.txt
**********
Command: cat /etc/redhat-release

Red Hat Enterprise Linux Server release 7.9 (Maipo)

まとめ

このシェルスクリプトを使用することで、異なるサーバからも同様に情報を効率的に採取できます。cmd.listファイルをカスタマイズすることで、様々なシステムに対応した情報収集が可能です。例えば、セキュリティ設定のチェックや特定のアプリケーションのインストール状況の確認にも応用できます。ぜひ、あなたの環境でも参考にしてみてください。