Bash

サーバ間でディレクトリの存在、所有者、グループ、パーミッションをチェックする

More than 1 year has passed since last update.

ディレクトリを比較すること自体が時代遅れのようにも思いますが。。。。
サーバリプレイスなど、あるサーバに対して別の機器を使って同様の環境をる場合、ディレクトリはプログラムで作成するとして本当に一致しているかチェックするシェルです。数百、数千以上の台数になると構成管理ツールなどで統合管理するべきだと思いますが、数台という規模であれば環境整備のコストと比較して選択肢の一つになり得るのではと思ってます。

作業の流れ
1.サーバAのディレクトリ一覧取得
2.一覧を新たに構築するサーバBに配置
3.チェックスクリプト実行
→標準出力に結果を出力する

チェック仕様
ディレクトリの存在、所有者、グループ、パーミッションをチェックする

ディレクトリ一覧取得
パーミッション、所有者、グループ、フルパスを出力する

$ find /home -type d | xargs stat --format='%a %U %G %n' > test.ls
755 root root /home
700 kusakari kusakari /home/kusakari
700 kusakari kusakari /home/kusakari/Maildir
760 kusakari kusakari /home/kusakari/.pki
700 koji koji /home/koji

実行するチェックスクリプト
本当は構成管理ツールや、Serverspecなど利用すべきだとは思うけど・・・。

check.sh
#! /bin/sh
cat $1 | while read line
do
  PERM=`echo ${line} | cut -d' ' -f 1`
  USER=`echo ${line} | cut -d' ' -f 2`
  GROUP=`echo ${line} | cut -d' ' -f 3`
  DIRPATH=`echo ${line} | cut -d' ' -f 4`
  RESULT=`find ${DIRPATH} -samefile ${DIRPATH} -perm ${PERM} -user ${USER} -group ${GROUP}`
  if [ $? = 0 ]; then
    echo "O ${PERM} ${USER}:${GROUP} ${DIRPATH}"
  else
    echo "X ${PERM} ${USER}:${GROUP} ${DIRPATH}"
  fi
done

実行
OKケース(一致した)

$ ./check.sh test.ls
O 755 root:root /home
O 700 kusakari:kusakari /home/kusakari
O 700 kusakari:kusakari /home/kusakari/Maildir
O 760 kusakari:kusakari /home/kusakari/.pki
O 700 koji:koji /home/koji

NGケース(一致しなかった)

$ ./check.sh test.ls
X 755 root:root /home
X 700 kusakari:kusakari /home/kusakari
X 700 kusakari:kusakari /home/kusakari/Maildir
X 760 kusakari:kusakari /home/kusakari/.pki
X 700 koji:koji /home/koji