sun's longitude:261 08 12 
· 자유게시판 · 묻고답하기 · 알파문서 · RPMS list
· 사용자문서 · 팁/FAQ모음 · 리눅스Links · 자료실
· 서버정보 · 운영자 · Books/FAQ · FreeBSD
 
   

질문과 답변 게시판입니다.

현재 실시간으로 이곳 서버의 설정파일(몇개)를 보여주고 있습니다.
서버의 설정내용에 관한 질문은 먼저 이곳 서버의 설정내용을 참고하시길 바랍니다.

[*** 쓰기 금지단어 패턴 ***]
글 본문 중간에 업로드할 이미지를 추가하는 방법 : @@이미지이름@@
ex) @@foo.gif@@
2906 번 글의 답장글: Re: 산이님, 쉘스크립트 질문입니다.
글쓴이: 산이 [홈페이지] 글쓴날: 2011년 10월 03일 16:03:58 월(오후) 조회: 959

[김인영]님이 남기신 글:

>-----------------------------------------
>답변자가 기본적으로 참고할 내용입니다.
>- 배포판(옵션)    : 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 +@

산이님, 쉘스크립트 질문입니다. 안녕하세요 유저 명령어 및 접속제한 관련문의드려요
인쇄용 


apache lighttpd linuxchannel.net 
Copyright (c) 1997-2017, linuxchannel.net

Page loading: 0.02(server) + (network) + (browser) seconds