サーバー上の特定のサイトの権限と所有権を変更する小さなヘルパースクリプトを作成しようとしています。
1つのサイトを渡すことも、パラメータをスキップしてすべての操作を実行することもできます。
サーバー上のさまざまなサイトに適用できるはずですが、すべてではないはずだとわかったので、次のように配列を渡してみました。
SLIST=("my.site.com" "your.site.com")
./website-perms 644 755 kevin "${SLIST[@]}"
ただし、配列の最初の項目のみを実行します。my.site.com
さまざまなサイトを通過できるように、この問題をどのように解決しますか?
完全なコード
#!/bin/bash
# Done nightly, and copied to /usr/bin/
if [[ $EUID -ne 0 ]]; then
echo "This script must be run as root" 1>&2
exit 1
fi
if [ $# -eq 0 ]; then
echo "usage: ./website-perms.sh fileperm folderperm owner (1|2) (1=kevin,2=www-data) (optional) Site Array"
exit 1
fi
function chg_perms() {
echo "find $1 -type f -exec chmod $2 {} \\";
echo "find $1 -type d -exec chmod $3 {} \\";
find $1 -type f -exec chmod $2 {} \;
find $1 -type d -exec chmod $3 {} \;
echo "-- chg_perms done";
}
function chg_owner() {
echo "chown -R $2:www-data $1";
chown -R $2:www-data $1;
echo "-- chg_owner done";
}
SITES=$4;
if [ -z $SITES ]; then
for dir in /var/www/httpdocs/*/
do
dir=${dir%*/}
chg_perms "/var/www/httpdocs/${dir##*/}" $1 $2
chg_owner "/var/www/httpdocs/${dir##*/}" $3
done;
else
for dir in "${SITES[@]}" #ONLY DOES THE FIRST ITEM
do
chg_perms "/var/www/httpdocs/$dir" $1 $2
chg_owner "/var/www/httpdocs/$dir" $3
done
fi;
答え1
良いスクリプトです。通常、残りのすべてのパラメータをサイトのリストとして使用します。次のようなものです(まだこのモードをテストしていません)。
if [ $# -lt 3 ]; then
echo >&2 "usage: $0 fileperm folderperm owner [site ...]"
exit 1
fi
[。 。 。 ]
fileperm="$1"
folderperm="$2"
owner="$3"
shift 3 # shift first 3 args off of list
if [ $# -eq 0 ]; then
for dir in /var/www/httpdocs/*/ #stackexchange syntax coloring fix*/
do
dir="${dir%/*}"
chg_perms "/var/www/httpdocs/${dir##*/}" "$fileperm" "$folderperm"
chg_owner "/var/www/httpdocs/${dir##*/}" "$owner"
done;
else
for dir # step through positional args ($1,$2,...,$N)
do
chg_perms "/var/www/httpdocs/$dir" "$fileperm" "$folderperm"
chg_owner "/var/www/httpdocs/$dir" "$owner"
done
fi
答え2
私はRobertLのアプローチを好みますが、少し異なります。
sites=( "${@:4}" )
# ...
for dir in "${sites[@]}"; do ...
- 配列を宣言するには、括弧を使用する必要があります。
"${@:4}"
$ 4で始まり、$ 4で終わる位置パラメータを取得します。- ALLCAPSVARNAMESを使用する習慣を捨ててください。シェルの使用のみに制限してください。