#!/bin/bash
:<<COMMENT
Author:huangyandong
Date:11/13/11 release 1
Web:http://huangyandong.blog.51cto.com
Use Commands:useradd userdel usermod groupadd
Usage:./control_user.sh
说明:
这个脚本以询问的方式来列出已有用户名,增加用户,删除用户,修改用户信息
让不熟悉useradd,usermod,userdel,groupadd等命令的用户能够快速学会管理用户,该脚
本的每个步骤都会要求用户确认后才真正开始操作,比较安全。
COMMENT
#函数定义
#列出指定的单个用户的信息
list_allow_login_users()
{
local user=${1:?Usage:list_allow_login_users User}
local delim=${2:-'\t'}
local listuser=$(cat /etc/passwd|grep "^${user}:")
if [ -n "${listuser}" ];then
local username=$(echo $listuser|cut -d: -f1)
local uid=$(echo $listuser|cut -d: -f3)
local gid=$(echo $listuser|cut -d: -f4)
local fullname=$(echo $listuser|cut -d: -f5)
local homedir=$(echo $listuser|cut -d: -f6)
local bash=$(echo $listuser|cut -d: -f7)
local group=$(grep ":${gid}:" /etc/group|cut -d: -f1)
echo -e "${username} ${delim} ${uid} ${delim} ${group} ${delim} ${fullname} ${delim} ${bash} ${delim} ${homedir} ${delim}" 
fi
}
#列出所有可以登陆系统的用户的信息(也就是shell/bin/bash的用户,这里有个bug会出现将/bin/csh/bin/sh等用户排除在外)
listUsers()
{
echo -e "UserName\tUserID\tGroupName\tFullName\tLoginShell\tHomeDirectory" 
for i in $(cat /etc/passwd|grep '/bin/bash$'|cut -d: -f1);do
list_allow_login_users $i 
done
}
#判断创建的用户或群组是否已存在,是返回y,否返回n
isinvaild()
{
local findfile=${1}
local findthing=${2}
msg='n'
d=$(cat /etc/${findfile} |grep "^${findthing}:")
if [ -n "$d" ];then
msg='y'
fi
echo $msg
}

#增加用户
AddUser()
{
read -p "User Name:" username
#判断用户名是否存在,存在则重新输入一个用户名
until [ $(isinvaild passwd $username) == 'n' ];do
echo "用户:$username已存在,请重输入一个用户名"
read -p "User Name:" username
done
read -p "Full Name:" fullname
read -p "Password:"  password
read -p "Confirm Password:" confirmpasswd
read -p "Login Shell(Default:/bin/bash):" loginshell
if [ -z "$loginshell" ];then
loginshell='/bin/bash'
fi
#是否创建用户主目录,若创建则设置选项-m,若不创建则判断是否指定一个已存在的目录作为用户主目录,若指定则设置选项-d
read -p 'Create Home Directory?(Y/N):' iscreate
case $iscreate in
Y|y)   homediropt='-m'
;;
*) read -p "是否指定一个已存在的目录为用户主目录:" issethomedir
case $issethomedir in
Y|y)  read -p "输入一个合法的目录作为用户主目录(完整路径)" shomedir
if [ -e "${shomedir}" ];then
until [ -d "${shomedir}" ];do
echo "指定的$shomedir不是一个目录,请重新指定:"
read -p "用户目录:" shomedir
done
else
mkdir -pv "${shomedir}"
fi
sethomeopt="-d $shomedir"
esac
;;
esac
#是否为该用户创建一个私有群组
read -p 'Create a private group for the user?(y/N):' isgroup
case $isgroup in
Y|y)  read -p "GroupName:" groupname
isexists=$(isinvaild group "$groupname")
if [ $isexists == 'n' ];then
        groupadd $groupname
fi
grpopt="-g $groupname"
;;
esac
#是否为该用户手动指定一个UID
read -p 'Specify user ID manually?(Y/N):' isuid
case $isuid in
    Y|y) read -p "UID:" uid
 uidopt="-u $uid"
;;
esac     
#判断两次输入的密码是否一样,直到输入的密码一样为止
until [ x"${password}" == x"${confirmpasswd}" ];do
echo "两次输入的密码不相同:"
read -p "Password:"  password
                read -p "Confirm Password:" confirmpasswd
done
isexistsuser=$(isinvaild passwd "${username}")
#若创建的用户原来不存在才真正的创建新用户
if [ $isexistsuser == 'n' ];then
#创建用户
  echo "你要创建的新用户信息如下:"
  echo -e "用户名:$username \t 完整用户名:$fullname "
echo -e "密码:$password \t 登陆Shell:$loginshell "
read -p "确认创建?(Y/N):" isreallycreate
case $isreallycreate  in 
Y|y)
useradd -c "$fullname" -s "$loginshell" -p "${password}" $homediropt $sethomeopt $grpopt $uidopt $username
;;
*)
echo "你取消创建用户$username"
;;
esac 
else
#提示用户要创建的用户已存在
echo "用户$username 已存在"
fi
}