
ある愚か者がchown -R username
、目的のフォルダにいると思い込んで、Web サーバーの /home フォルダで . を実行しました。言うまでもなく、サーバーは多くの問題を引き起こしています。
当社には 200 を超える Web サイトがあり、それらすべてを個別に chown したくないので、末尾の / を除いたフォルダー名にすべてのフォルダーの所有者を変更するスクリプトを作成しようとしています。
今のところはこれですべてです。/ を削除できれば問題ありませんが、ファイルに . が含まれているかどうかも確認し、含まれていない場合はコマンドを実行し、含まれている場合は次のコマンドに進みます。
#!/bin/bash
for f in *
do
test=$f;
#manipluate the test variable
chown -R $test $f
done
どんな助けでも大歓迎です!
前もって感謝します!
答え1
仮定して全て/home/ ディレクトリ内のフォルダーはユーザー名を表すため、以下を使用できます。
for dir in /home/*/; do
# strip trailing slash
homedir="${dir%/}"
# strip all chars up to and including the last slash
username="${homedir##*/}"
case $username in
*.*) continue ;; # skip name with a dot in it
esac
chown -R "$username" "$dir"
done
事前にテスト ループを実行して、ユーザー名が実際にホーム ディレクトリと一致するかどうかを確認することをお勧めします。
この AWK コマンドは、指定されたユーザーのホーム ディレクトリを取得します。
awk -F: -v user="$username" '{if($1 == user){print $6}}' < /etc/passwd
この結果を既存のホーム ディレクトリと比較することは、読者の課題となります。
答え2
あなたはベース名パスの最後のコンポーネントを提供するコマンド
for dir in /home/*
do
if [ -d "$dir" ]
then
username=$(basename "$dir")
chown -R "$username" "$dir"
fi
done
私は当初、
for dir in /home/*
do
if [ -d "$dir" ]
then
username=$(basename "$dir")
echo "chown -R $username $dir"
fi
done
それが正気であることを確認するためです。