2013-05-01 2 views
0

현재이 특정 bash 스크립트를 실행할 때 특정 사람에게 메뉴를 제공하는 스크립트를 작성하려고합니다. 메뉴에서 나는 세 가지 옵션 (1. 사용자 추가, 2. 사용자 삭제 및 3. 종료)을 허용했습니다. 사용자 추가 옵션과 관련하여 사용자가 새 사용자의 세부 정보를 수동으로 입력하거나 텍스트 파일을 통해 여러 사용자를 추가 할 수 있도록하는 두 가지 옵션이 있어야합니다. 내가/txt 파일을 통해 사용자를 삭제 수동으로 많은 사용자를위한 작업의 본문/본문을 만들 수 없습니다 비록 메뉴/옵션을 위에서 설명한대로 만들 수있었습니다.Bash Script 사용자를 추가, 삭제 하시겠습니까?

내 코드에 도움이된다면 도움이 될 것입니다. 고마워요!

#!/bin/bash 
clear 
echo "########## MENU ############\n" 
options=("add_user" "delete_user" "exit") 
select opt in "${options[@]}" 
do 
case $opt in 
    "add_user") 
     clear 
    while [ 1 ] 
do 
    clear 
    echo "1. Add user manually" 
    echo "2. Add user via TXT file" 
    read -p "Enter your choice" ch 
    case $ch in 
     1) 
     read -p "Enter user name : " useradd 
     read -p "Enter user password:" passwd 
    echo -e "Successfully added the user" 
    ;; 
    2) 
    if [ $(id -u) -eq 0 ]; then 
    for row in `more $1` 
    do 
    username=${row%:*} 
    password=${row#*:} 

egrep "^$username" /etc/passwd >/dev/null 

if [ $? -eq 0 ]; then 
    echo "$username exists!" 
    exit 1 
else 
    pass=$(perl -e 'print crypt($ARGV[0], "password")' $password) 
    useradd -m -p $pass $username 
    [ $? -eq 0 ] && echo "User has been added to system!" || echo "Failed to add a 
user!"  
fi 
done 
else 
    echo "Only root may add a user to the system" 
    exit 2 
fi  
esac 
done 
    ;; 
    "delete_user") 
     read -p "Enter a User name to delete "UNAME 
     passwd 
     deluser $UNAME 
     echo "User $UNAME has been deleted"   

     ;; 
    "exit") 
     break 
     ;; 

    esac 
done 
+0

많은 문제가 있습니다. 몇 가지 권고 사항 : 1) 개발/디버깅을위한 최선의 방법은 개발자가 루트가 아니라는 것입니다 (기본 로직이 작동하면 루트 체크 추가) 2.) 중첩 된'select's (추가 사용자 용)를 사용할 수 있습니다. 3.) 네이버 셀렉트 프롬프트에서 PS3를 설정하십시오, 4.) 오류 메세지를 깨끗이 지우십시오. 그래서 오류 메시지 이후에 스크립트를 사용하지 않거나 일시 정지 시키십시오. 5) 왜 'more'대신에? 'cat' 또는 while-read 루프로의 간단한 리다이렉션? 6) 마침내 가장 중요한 점은 스크립트를 bash-function으로 분해하여 관리 효율성을 높이는 것입니다. – jm666

+0

답장을 보내 주셔서 감사합니다. 나는 당신이 멍청한 놈이라고 부를 때 당신이 의미하는 바를 전적으로 이해하지 못합니다. 괜찮으 시다면 개선 된 스크립트로 답장 해주십시오. 최대한 빨리. 의미심장합니다, 감사합니다. – user2265307

답변

0

얼마나 작은 부분으로 큰과 스크립트를 중단하는 아이디어를 얻는 경우 :

여기에 지금과 같은 내 스크립트입니다. 다음은 까지 좋은 코드의이지만 생각을 계속할 수 있습니다.

#!/bin/bash 

setps3() { 
    PS3="$1 (press enter for choices)>" 
} 
setmainprompt() { 
    setps3 "Main menu" 
} 
setaddprompt() { 
    setps3 "ADD USER menu" 
} 

pressenter() { 
    read -p "Press enter to continue:" _tmp 
} 

err() { 
    echo 1>&2 ${CMDNAME} ERROR: $* 
    return 1 
} 
msg() { 
    echo ${CMDNAME} NOTICE: $* 
    return 0 
} 

badchoice() { 
    err "Bad choice!"; 
    return 1 
} 

do_add_one_user() { 
    _name="$1" 
    _pass="$2" 
    echo "add code here for adding one user: ${_name} ${_pass}" 
    pressenter 
} 

do_manual_add() { 
    read -p "Username:" _username 
    read -sp "Passowrd:" _password 
    echo 
    do_add_one_user "${_username}" "${_password}" 
} 

do_txt_add() { 
    read -p "Filename:" _filename 
    [[ -z "${_filename}" ]] && return 
    echo "add code here for adding users from ${_filename}" 
    echo "The code should call do_add_one_user function for every line" 
    pressenter 
} 

do_adduser() { 
    setaddprompt 
    _arr_add=("Add manually" "Add via TXT" "return to main menu" "exit program") 
    select add_action in "${_arr_add[@]}" 
    do 
     case "$REPLY" in 
      1) do_manual_add ;; 
      2) do_txt_add ;; 
      3) return ;; 
      4) exit 0 ;; 
      *) badchoice ;; 
     esac 
     setaddprompt 
    done 
} 

do_deleteuser() { 
    echo "enter code for deleting user here" 
    pressenter 
} 

uidcheck() { 
    owner=${owner:-$(/usr/bin/id -u)} 
    if [ "$owner" != "0" ]; then 
     err 'Must be root' 
     exit 1 
    fi 
} 

## MAIN PROGRAM 

CMDNAME=$(basename $0) 
#uidcheck #uncomment when need 

_arr_main=("Add user" "Delete user" "Exit program") 
setmainprompt 
select main_action in "${_arr_main[@]}" 
do 
    case "$REPLY" in 
     1) do_adduser ;; 
     2) do_deleteuser ;; 
     3) exit 0 ;; 
     *) badchoice ;; 
    esac 
    setmainprompt 
done 
+0

sooo는 정말로 감사합니다. 많은 분께 감사드립니다. 좋은 분, 환호 – user2265307

+0

안녕하세요, 한 번만 더 질문드립니다. 내가 갇혀있는 유일한 지점입니다 do_add_one_user 메서드에 대한 코드를 작성하는 방법을 잘 모르겠다. 고마워요. – user2265307

+0

사용자 추가는 시스템에 따라 다릅니다. 그것을 휴대용으로 쓰는 것이 불가능합니다 ... 그것이 바로 당신이해야 할 부분입니다 ... – jm666