서버에 있는 특정 사이트의 권한과 소유권을 변경하는 작은 도우미 스크립트를 작성하려고 합니다.
이제 하나의 사이트를 전달할 수도 있고 매개변수를 건너뛰어 모든 작업을 수행할 수도 있습니다.
서버의 여러 사이트에 적용할 수 있어야 하지만 전부는 아니어야 한다는 것을 알았기 때문에 다음을 통해 배열을 전달해 보았습니다.
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를 사용하는 습관을 버리십시오. 쉘 사용으로만 제한하십시오.