ファイルとディレクトリセットの権限を取得するスクリプトを作成しようとしています。次に、各権限が正しく設定されていることを確認してください。
権限が正しく設定されていない場合は、権限が正しく設定されていないディレクトリまたはファイルグループをエコーできます。
これまでは、「find」を使用してディレクトリ内のすべてのファイルとディレクトリを再帰的に検索し、統計を実行して現在の権限を返しました。次に、返された権限の一覧で if-then ステートメントを使用して、ファイルまたはディレクトリに予期された権限と異なる権限があることを確認します。これは!=演算子とパターンマッチングによって行われます。したがって、すべてのファイルの権限は444に設定され、ディレクトリの権限は555に設定する必要があります。何も返されない場合、権限は間違っています。
for site in $(echo /var/www/*)
do
permcheckfile=$(find $site -type f -exec stat -c '%a' '{}' +)
permcheckdir=$(find $site -type d -exec stat -c '%a' '{}' +)
if [[ $permcheckfile != *444 ]]
then
echo "$site file permissions are wrong"
else
echo "$site file permissions are correct"
fi
if [[ $permcheckdir != *555 ]]
then
echo "$site directory permissions are wrong"
else
echo "$site directory permissions are correct"
fi
done
上記のスクリプトで見つかった問題は、時々偽の肯定を返しますが、その理由がわかりません。
私がどこに間違っているのか知っている人はいますか?私が達成したいことを達成するためのより良い方法はありますか?どんな助けやアドバイスにも感謝します。時間をかけて助けてくれてありがとう。
答え1
permcheckfileとpermcheckdirの配列を繰り返す必要があります。
for site in $(echo /var/www/*)
do
for file in $(find $site -type f -exec stat -c '%a' '{}' +)
do
if [[ $file != *444 ]]
then
echo "$site/$file permissions are wrong"
else
echo "$site/$file permissions are correct"
fi
done
for dir in $(find $site -type d -exec stat -c '%a' '{}' +)
do
if [[ $dir != *555 ]]
then
echo "$site directory permissions are wrong"
else
echo "$site directory permissions are correct"
fi
done
done
答え2
以下のように必要なすべての機能を取得するには、「find」を一度だけ呼び出すだけです。より最適化できますが、明確さは犠牲になります。
#!/bin/sh
p=$(type -P printf)
site='/var/www'
cd "$site" && \
find . \
\( -type f -perm 444 -exec $p "$site/%s file permissions are correct.\n" {} + \) -o \
\( -type f ! -perm 444 -exec $p "$site/%s file permissions are wrong.\n" {} + \) -o \
\( -type d ! -name . ! -perm 555 -exec $p "$site/%s directory permissions are wrong.\n" {} + \) -o \
\( -type d ! -name . -perm 555 -exec $p "$site/%s directory permissions are correct.\n" {} + \)