2906 번 글의 답장글: Re: 산이님, 쉘스크립트 질문입니다. |
글쓴이: 산이
[홈페이지]
|
글쓴날: 2011년 10월 03일 16:03:58 월(오후) |
조회: 1720 |
[김인영]님이 남기신 글:
>-----------------------------------------
>답변자가 기본적으로 참고할 내용입니다.
>- 배포판(옵션) : CentOS
>- 커널버전(옵션)
: 2.6.18-274.3.1.el5
>-----------------------------------------
>*스팸필터링:한글
11자 이상 없으면 스팸페이지로 이동합니다.
>
>안녕하세요. 산이님 이젠 제법 날씨가 쌀쌀합니다.
>감기에 조심하시구요.
>
>산이님의 도움과 여러 포탈에 있는 정보들을 통해
쉘스크립트에 한걸음씩 접하다가
>
>근래에 그것을 응용하는과정에
와있는데요.
>
>여러 검색을 통해 해결을 해보려고 해도 도저히 안풀리는 게
있어서 산이님의 도움을
>
>청하고자 합니다. ㅠ_ㅠ;
>
>아래는 현재 제가 제작한 계정 및 도메인 삭제 하는 간단한
스크립트입니다.
>
>허접하지만 잘 봐주세요 ^^
>
>----------------------- 여기서부터 스크립트
--------------------------------
>#!/bin/sh
>
>echo "계정을 삭제합니다!"
>echo -n "삭제할 계정명을 입력해주세요:"
>read name
>
>if [ -z $name ] ; then
>echo "반드시 계정명을 입력해주셔야 합니다."
>./test.sh
>
>else
>
>home_path=/home
>vsftpd_path=/etc/vsftpd
>if [ -d $home_path/$name ] ; then
>userdel -r $name
>
>
>sed /$name/d $vsftpd_path/chroot_list > $vsftpd_path/chroot_list_sav
> rm -rf $vsftpd_path/chroot_list
> mv $vsftpd_path/chroot_list_sav $vsftpd_path/chroot_list
>
>echo $name " 계정이 성공적으로 삭제되었습니다."
>else
>echo $name " 계정이 존재하지 않습니다. 계정명을 다시
확인하세요."
>./test.sh
>fi
>fi
>
>echo "도메인을 삭제합니다."
>echo -n "삭제할 도메인명을 입력해주세요:"
>read dname
>
>if [ -z $dname ] ; then
>./test.sh
>
>else
>
>d_name_path=/var/named/chroot/etc/dns/d_name
>BDIR=/var/named/chroot/etc/dns
>
>if [ -f $d_name_path/$dname ] ; then
>
>sed /$dname/d $BDIR/domains.conf >> $BDIR/domains.conf_sav
>rm -rf $BDIR/domains.conf
>mv $BDIR/domains.conf_sav $BDIR/domains.conf
>rm -rf $d_name_path/$dname
>
>echo "도메인" $dname "삭제완료"
>/etc/init.d/named reload
>
>else
>echo $dname "도메인이 이미 삭제되었거나 잘못된 도메인을
입력하셨습니다."
>./test.sh
>fi
>fi
>--------------------------------------------------------------------------------
>
>지금 해결이 안되는것이 스크립트 상단에 보시면
>
>if [ -z $name ] ; then
>echo "반드시 계정명을 입력해주셔야 합니다."
>./test.sh
>
>부분이 있는데 $name 변수가 null 이면 아래의 메시지를 출력하고
현재 스크립트를
>
>다시 불러들이는 편법을 사용하고 있었는데요.
>
>문제는 아래에 도메인 삭제시 값이 null 이면 또다시 tesh.sh 를
실행하게 되면서
>
>이미 맞게 입력했던 계정명을 다시 입력하라고 뜨는
부분입니다.
>
>제가 생각하는 결과값은 계정값이 null 일때 스크립트
최상단의
>
>(여기부분) echo "계정을 삭제합니다!"
> echo -n "삭제할 계정명을 입력해주세요:"
> read name
>
>부터 실행하게끔 할수 있냐는 것입니다. (편법으로 tesh.sh
재호출 하는법 아니구요 ^^;)
>
>
>이게 가능한 방법이 있다면 산이님의 도움을
청해봅니다.
>
>긴 글 읽어주셔서 감사합니다.
========================================
우선 스크립트를 일직선으로 짜지 마시고 반복적인 부분은
함수를 만들어 사용해보세요.
- 계정 체크 루틴
- 계정 삭제 루틴
- 도메인 체크 루틴
- 도메인 삭제 루틴
그리고 표준입력값 체크시 NULL 이면 계속 입력을 받게끔 하려면
while 문을 사용해야 합니다.
계정 삭제 부분만 예를 들어보겠습니다.
도메인도 똑 같은 구조로 짜시면 됩니다.
--------------------------
account_exists()
{
ACCT=$1
test -d ${home_path}/${ACCT}
return $? ## 0 은 성공, 그 외 실패
}
## 아래 삭제 명령어는 한줄짜리입니다.
## 중간 명령어가 실패하면 그곳에서 멈추고 0 이 아닌 숫자를
리턴합니다.
##
delete_account()
{
ACCT=$1
userdel -r ${ACCT} && \
cp -f $vsftpd_path/chroot_list $vsftpd_path/chroot_list.backup && \
sed /$name/d $vsftpd_path/chroot_list > $vsftpd_path/chroot_list_sav && \
mv -f $vsftpd_path/chroot_list_sav $vsftpd_path/chroot_list
return $? ## 0 은 성공, 그 외 실패
}
## 전역변수들 설정 (가능한 변수들은 모두 대문자로
통일하세요)
##
home_path=/home
vsftpd_path=/etc/vsftpd
d_name_path=/var/named/chroot/etc/dns/d_name
BDIR=/var/named/chroot/etc/dns
echo -n "삭제할 계정 입력(S/s skip)? "
while read NAME ; do
DO_DELETE_ACCOUNT='' ## reset
if [ X"${NAME}" = "Xs" -o X"${NAME}" = "Xs" ] ; then
break; ## S 또는 s 입력시 이 루틴을 빠져나갑니다.
elif [ -n "${NAME}" ] ; then
echo -n "account exists: "
account_exists ${NAME}
if [ $? = 0 ] ; then
echo 'OK'
DO_DELETE_ACCOUNT=TRUE
break ## 삭제하라는 변수를 지정하고 루틴에서
빠져나옵니다.
else
echo 'FAIL'
echo -n '없거나 삭제된 계정입니다. retry ... '
fi
fi
done
if [ -n ${DO_DELETE_ACCOUNT} ] ; then
delete_account ${NAME}
if [ $? = 0 ] ; then
echo "계정 삭제 완료"
else
echo "계정 삭제 작업이 실패되었습니다."
exit 1 ## 스크립트 종료후 수동으로 확인후 처리
fi
fi
------------------
|
이전글 : 산이님, 쉘스크립트 질문입니다.
다음글 : 안녕하세요 유저 명령어 및 접속제한 관련문의드려요
|
from 211.212.225.115
JS(Redhands)Board 0.4 +@
|