该脚本做为练习只用,修改sudo文件还请使用visudo命令,防止修改错误形成安全事故!算法
--------------------------------------------shell
练习实如今/etc/sudoers文件中交互式的添加内容,要求能根据用户需求建立所需的组安全
写的很纠结~错误百出。而且是实现的算法有的太复杂了,先贴上原始的一;后期在进行修改了再附加。过程很少解释。bash
方法(1)app
- #!/bin/bash
- #Author: Mo
- #Date & Time: 2011-01-02-20:55:40
- #Description:
- #Version : 1.0.1
- runas=root
- machine=ALL
- ualias=' '
- halias=' '
- mytrap(){
- echo -e "\nQuit...\n Clean all your input messsage..."
- exit 1
- }
- trap 'mytrap' SIGINT
- # user functions... #########################
- testuser() {
- if cut -d: -f1 /etc/passwd | grep "^$1$" &>/dev/null; then
- return 0
- else
- echo "No user $1,please check ."
- return 99
- fi
- }
- adduser(){
- while [ -z ${user} ] ;do
- read -p "Please input sudo user: " user
- testuser ${user}
- [ $? -eq 99 ] && user=''
- done
- uarray[${#uarray[*]}]=${user}
- user=' '
- }
- useralias() {
- read -p "Enter user alias name(upper):" ualias
- if echo $ualias | grep "[^a-zA-Z]" &>/dev/null ;then
- echo "Wrong input!"
- exit 1
- else
- ualias=`echo ${ualias} | tr 'a-z' 'A-Z'`
- fi
- flag1=y
- while [ "${flag1}" = "y" ] ;do
- adduser
- read -p "Wish to add another user(y/n): " flag1
- flag1=${flag1:=y}
- if echo "${flag1}"|grep "[YNyn]" &>/dev/null ;then
- [ "${flag1}" = "y" ] && uarray[${#uarray[*]}]="${user}," || uarray[${#uarray[*]}]=${user}
- else
- echo "Wrong Select!"
- exit 1
- fi
- done
- }
- # host funcitons...#######################
- addhost(){
- host=' '
- while [ -z ${host} ] ;do
- read -p "Please input host: " host
- done
- harray[${#harray[*]}]=${host}
- }
- hostalias() {
- read -p "Enter host alias name(upper):" halias
- if echo ${halias} | grep "[^a-zA-Z]" &>/dev/null ;then
- echo "Wrong Name!"
- exit 1
- else
- halias=`echo ${halias}| tr 'a-z' 'A-Z'`
- fi
- flag2=y
- while [ "${flag2}" = "y" ] ;do
- addhost
- read -p "Wish to add another host(y/n): " flag2
- flag2=${flag2:=y}
- if echo "${flag2}" | grep "[YNyn]" &>/dev/null ;then
- [ "${flag2}" = "y" ] && harray[${#harray[*]}-1]=${host}, || harray[${#harray[*]}-1]=${host}
- else
- echo "Wrong Select!"
- exit 1
- fi
- done
- }
- #command function...#######################
- addcomm(){
- while [ -z ${comm} ] &>/etc/null ;do
- #how to read a command line?
- read -p "Please input a sudo command: " comm1 comm2
- comm=`echo "${comm1} ${comm2}"`
- done
- carray[${#carray[*]}]=${comm}
- comm=' '
- }
- commalias() {
- read -p "Enter command alias name(upper):" calias
- if echo ${calias} | grep "[^a-zA-Z]" &>/dev/null ;then
- echo "Wrong input!"
- exit 1
- else
- calias=`echo ${calias} | tr 'a-z' 'A-Z'`
- fi
- flag3=y
- while [ "${flag3}" = "y" ] ;do
- addcomm
- read -p "Wish to add another command(y/n): " flag3
- flag3=${flag3:=y}
- if echo "${flag3}"|grep "[YNyn]" &>/dev/null ;then
- [ "${flag3}" = "y" ] && carray[${#carray[*]}]=${comm}, || carray[${#carray[*]}]=${comm}
- else
- echo "Wrong Select!"
- exit 1
- fi
- done
- }
- # user add... #############################
- cat <<EOF
- 1) Create user alias;
- 2) Add a single user;
- EOF
- read -p "Enter your select: " select1
- case ${select1} in
- 1)
- useralias
- ;;
- 2)
- adduser
- ;;
- *)
- echo "Wrong select!"
- exit 1
- ;;
- esac
- # host add... ###############################
- cat <<EOF
- 1) Create host alias;
- 2) Add a single host;
- EOF
- read -p "Enter your select: " select2
- case ${select2} in
- 1)
- hostalias
- ;;
- 2)
- addhost
- ;;
- *)
- echo "Wrong select!"
- exit 1
- ;;
- esac
- # command add...#################################
- cat <<EOF
- 1) Create command alias;
- 2) Add a single commond;
- EOF
- read -p "Enter your select: " select3
- case ${select3} in
- 1)
- commalias
- ;;
- 2)
- addcomm
- ;;
- *)
- echo "Wrong select!"
- exit 1
- ;;
- esac
- # appent thess informatin to file:/etc/sudoers
- # US HO = (root) COM
- if [ ${#uarray[*]} -gt 1 ];then
- echo "User_Alias ${ualias} = ${uarray[*]} " >> /etc/sudoers
- fi
- if [ ${#harray[*]} -gt 1 ];then
- echo "Host_Alias ${halias} = ${harray[*]} " >> /etc/sudoers
- fi
- if [ ${#carray[*]} -gt 1 ];then
- echo "Comm_Alias ${calias} = ${carray[*]} " >> /etc/sudoers
- fi
- LINE="`[ ${#uarray[*]} -gt 1 ] && echo -n "${ualias}" || echo -n "${uarray[*]}" `"
- LINE="${LINE} `[ ${#harray[*]} -gt 1 ] && echo -n "${halias}" || echo -n "${harray[*]}" ` "
- LINE="${LINE}=(root) "
- LINE="${LINE} `[ ${#carray[*]} -gt 1 ] && echo -n "${calias}" || echo -n "${carray[*]}" ` "
- echo "${LINE}" >> /etc/sudoers
- echo -e "\033[32mAll Done!\033[0m"
附注:如何从键盘读入一行数据而且赋值给变量。ide
read用法:
read [ -p ][ -r ][ -s ][ -u [ n ] ] [ VariableName ]
read 命令从标准输入中读取一行,并把输入行的每一个字段的值指定给 shell 变量,用 IFS(内部字段分隔符)变量中的字符做为分隔符。VariableName 参数指定 shell 变量的名称,shell 变量获取输入行一个字段的值。由VariableName 参数指定的第一个 shell 变量指定给每个字段的值,由 VariableName 参数指定的第二个 shell 变量指定给第二个字段的值,以此类推,直到最后一个字段。若是标准输入行的字段比相应的由 VariableName 参数指定的 shell 变量的个数多,把所有余下的字段的值赋给指定的最后的 shell 变量。若是比 shell 变量的个数少,则剩余的 shell 变量被设置为空字符串。ui
若是输入的一个串中间有空格,read一个变量,该变量显然只能截取并获得串中第一个空格前的子串。未解决丢失,read时,用两个变量,则第一个变量会获取第一个空格前的子串,第二个变量会获取其后的全部串。而后将两个变量衔接便可spa
例如97行:orm