脚本,sudo文件添加项

 

该脚本作为练习只用,修改sudo文件还请使用visudo命令,防止修改错误造成安全事故!

--------------------------------------------

  练习实现在/etc/sudoers文件中交互式的添加内容,要求能根据用户需求创建所需的组

  写的很纠结~错误百出。并且是实现的算法有的太复杂了,先贴上原始的一;后期在进行修改了再附加。过程不多解释。

 

方法(1)

  1. #!/bin/bash 
  2. #Author: Mo 
  3. #Date & Time: 2011-01-02-20:55:40 
  4. #Description:  
  5. #Version : 1.0.1 
  6.  
  7. runas=root 
  8. machine=ALL 
  9. ualias=' ' 
  10. halias=' ' 
  11.  
  12. mytrap(){ 
  13. echo -e "\nQuit...\n Clean all your input messsage..." 
  14. exit 1 
  15. trap 'mytrap'  SIGINT  
  16.  
  17. # user functions... ######################### 
  18. testuser() { 
  19.  if  cut -d: -f1 /etc/passwd | grep "^$1$" &>/dev/null; then  
  20.    return 0 
  21.   else 
  22.    echo "No user $1,please check ."  
  23.    return 99 
  24.  fi 
  25.   } 
  26.  
  27. adduser(){ 
  28.     while [ -z ${user} ] ;do 
  29.        read -p "Please input sudo user: " user 
  30.        testuser ${user} 
  31.        [ $? -eq 99 ] && user='' 
  32.     done 
  33.     uarray[${#uarray[*]}]=${user} 
  34.     user=' ' 
  35.  
  36. useralias() { 
  37.   read -p "Enter user alias name(upper):" ualias 
  38.   if  echo $ualias | grep "[^a-zA-Z]" &>/dev/null ;then 
  39.       echo "Wrong input!" 
  40.       exit 1 
  41.   else 
  42.      ualias=`echo ${ualias} | tr 'a-z' 'A-Z'
  43.   fi 
  44.  
  45.  flag1=y 
  46.  while [ "${flag1}" = "y" ] ;do 
  47.     adduser 
  48.     read -p "Wish to add another user(y/n): "  flag1 
  49.     flag1=${flag1:=y} 
  50.     if  echo "${flag1}"|grep "[YNyn]" &>/dev/null ;then 
  51.        [ "${flag1}" = "y" ] && uarray[${#uarray[*]}]="${user}," || uarray[${#uarray[*]}]=${user} 
  52.     else 
  53.        echo "Wrong Select!" 
  54.        exit 1 
  55.     fi 
  56.  
  57. done 
  58.  } 
  59. # host funcitons...####################### 
  60. addhost(){ 
  61.     host=' ' 
  62.     while [ -z ${host} ] ;do 
  63.        read -p "Please input host: " host 
  64.     done 
  65.     harray[${#harray[*]}]=${host} 
  66.  
  67. hostalias() { 
  68.   read -p "Enter host alias name(upper):" halias 
  69.   if  echo ${halias} | grep "[^a-zA-Z]" &>/dev/null ;then 
  70.       echo "Wrong Name!" 
  71.       exit 1 
  72.   else 
  73.      halias=`echo ${halias}| tr 'a-z' 'A-Z'
  74.   fi 
  75.  flag2=y 
  76.  while [ "${flag2}" = "y" ] ;do 
  77.     addhost 
  78.     read -p "Wish to add another host(y/n): "  flag2 
  79.     flag2=${flag2:=y} 
  80.     if  echo "${flag2}" | grep "[YNyn]" &>/dev/null ;then 
  81.        [ "${flag2}" = "y" ] && harray[${#harray[*]}-1]=${host}, || harray[${#harray[*]}-1]=${host} 
  82.     else 
  83.        echo "Wrong Select!" 
  84.        exit 1 
  85.     fi 
  86.  done 
  87.  } 
  88.  
  89. #command function...####################### 
  90.  
  91. addcomm(){ 
  92.     while [ -z ${comm} ] &>/etc/null ;do 
  93. #how to read a command line? 
  94.        read -p "Please input a sudo command: " comm1 comm2 
  95.        comm=`echo "${comm1} ${comm2}"
  96.     done 
  97.     carray[${#carray[*]}]=${comm} 
  98.     comm=' ' 
  99.  
  100. commalias() { 
  101.   read -p "Enter command alias name(upper):" calias 
  102.   if  echo ${calias} | grep "[^a-zA-Z]" &>/dev/null ;then 
  103.       echo "Wrong input!" 
  104.       exit 1 
  105.   else 
  106.      calias=`echo ${calias} | tr 'a-z' 'A-Z'
  107.   fi 
  108.  
  109.  flag3=y 
  110.  while [ "${flag3}" = "y" ] ;do 
  111.     addcomm 
  112.     read -p "Wish to add another command(y/n): "  flag3 
  113.     flag3=${flag3:=y} 
  114.     if  echo "${flag3}"|grep "[YNyn]" &>/dev/null ;then 
  115.        [ "${flag3}" = "y" ] && carray[${#carray[*]}]=${comm}, || carray[${#carray[*]}]=${comm} 
  116.     else 
  117.        echo "Wrong Select!" 
  118.        exit 1 
  119.     fi 
  120.  
  121. done 
  122.  } 
  123.     
  124. # user add... ############################# 
  125. cat  <<EOF 
  126.        1) Create user alias; 
  127.        2) Add a single user;  
  128. EOF 
  129. read -p "Enter your select: " select1 
  130.  
  131. case ${select1} in 
  132.  1) 
  133.    useralias 
  134.    ;; 
  135.  2) 
  136.    adduser 
  137.    ;; 
  138.  *) 
  139.    echo "Wrong select!" 
  140.    exit 1 
  141.    ;; 
  142.  esac 
  143.  
  144. # host add... ############################### 
  145. cat  <<EOF 
  146.        1) Create host alias; 
  147.        2) Add a single host; 
  148. EOF 
  149. read -p "Enter your select: " select2 
  150.  
  151. case ${select2} in 
  152.  1) 
  153.    hostalias 
  154.    ;; 
  155.  2) 
  156.    addhost 
  157.    ;; 
  158.  *) 
  159.    echo "Wrong select!" 
  160.    exit 1 
  161.    ;; 
  162.  esac 
  163.  
  164. # command add...################################# 
  165. cat  <<EOF 
  166.        1) Create command alias; 
  167.        2) Add a single commond; 
  168. EOF 
  169. read -p "Enter your select: " select3 
  170.  
  171. case ${select3} in 
  172.  1) 
  173.    commalias 
  174.    ;; 
  175.  2) 
  176.    addcomm 
  177.    ;; 
  178.  *) 
  179.    echo "Wrong select!" 
  180.    exit 1 
  181.    ;; 
  182. esac 
  183.  
  184.  
  185. # appent thess informatin to file:/etc/sudoers 
  186. # US HO = (root) COM 
  187.  
  188. if [ ${#uarray[*]} -gt 1 ];then 
  189.    echo  "User_Alias    ${ualias} = ${uarray[*]} " >> /etc/sudoers 
  190. fi 
  191.  
  192. if [ ${#harray[*]} -gt 1 ];then 
  193.    echo  "Host_Alias    ${halias} = ${harray[*]} " >> /etc/sudoers 
  194. fi 
  195.  
  196. if [ ${#carray[*]} -gt 1 ];then 
  197.    echo  "Comm_Alias    ${calias} = ${carray[*]} " >> /etc/sudoers 
  198. fi 
  199.  
  200. LINE="`[ ${#uarray[*]} -gt 1 ] && echo -n "${ualias}" || echo -n "${uarray[*]}" `" 
  201. LINE="${LINE}   `[ ${#harray[*]} -gt 1 ] && echo -n "${halias}" || echo -n "${harray[*]}" ` " 
  202. LINE="${LINE}=(root)     " 
  203. LINE="${LINE}   `[ ${#carray[*]} -gt 1 ] && echo -n "${calias}" || echo -n "${carray[*]}" ` " 
  204. echo "${LINE}" >> /etc/sudoers 
  205.  
  206. echo -e  "\033[32mAll Done!\033[0m" 

 附注:如何从键盘读入一行数据并且赋值给变量。

read用法:
read [ -p ][  -r ][ -s ][ -u [ n ] ] [  VariableName ]
read 命令从标准输入中读取一行,并把输入行的每个字段的值指定给 shell 变量,用 IFS(内部字段分隔符)变量中的字符作为分隔符。VariableName 参数指定 shell 变量的名称,shell 变量获取输入行一个字段的值。由VariableName 参数指定的第一个 shell 变量指定给每一个字段的值,由 VariableName 参数指定的第二个 shell 变量指定给第二个字段的值,以此类推,直到最后一个字段。如果标准输入行的字段比相应的由 VariableName 参数指定的 shell 变量的个数多,把全部余下的字段的值赋给指定的最后的 shell 变量。如果比 shell 变量的个数少,则剩余的 shell 变量被设置为空字符串。

如果输入的一个串中间有空格,read一个变量,该变量显然只能截取并得到串中第一个空格前的子串。未解决丢失,read时,用两个变量,则第一个变量会获取第一个空格前的子串,第二个变量会获取其后的所有串。然后将两个变量衔接即可

例如97行:

  • read -p "Please input a sudo command: " comm1 comm2 
  • comm=`echo "${comm1} ${comm2}"`

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章