批量创建用户并设置初始密码
目录:
1.脚本功能介绍
2.脚本制作技术需求
2.1 useradd命令
2.2 id命令
2.3 passwd命令
2.4 随机密码
2.5 while循环+case+select
3.脚本编写案例
一、脚本功能介绍
在企业中生产或运维中,经常会遇到×××服务器、企业网盘、企业邮箱、云桌面私有账号等等一系列的服务器。当批量新员工入职时,经常需要批量账号分配给新员工,若此类账号存储在数据库时,管理员可根据公司账号命名规范通过专有图形化系统进行录入账号,若账号存储在系统本地,此时通过脚本实现更为方便。
如企业账号规范:用户名规范为取员工名字中姓的全拼且首字母大写,名字的首字母,如有重复自动加重复用户名次数+1。密码规范为取字母数字中8位长度的任意字符。
二、脚本制作技术需求
2.1 useradd命令
useradd命令的功能作用就是修改/etc/passwd文件中预定义的7个字段的内容,语法结构:useradd [option] login,常用用法如下:
useradd user1 #添加用户user1 useradd -u 120 user1 #修改用户user1的UID为120 useradd -g grouptest user1 #修改用户的默认组为grouptest useradd -d /app/home/user1 user1 #修改指定user1的家目录为/app/home/user1 useradd -s /sbin/nologin user1 #修改用户的shell |
2.2 id命令
id命令的功能作用就是查看当前用户的id信息,包括UID、GID和默认组,如果不存在账户时,则提示不存在,$?返回值大于0
[root@centos7 ~]#id root &>/dev/null #判断用户root是否存储 [root@centos7 ~]#echo $? 0 #返回值为0,用户存在 [root@centos7 ~]#id rootbad &>/dev/null [root@centos7 ~]#echo $? 1 #返回值大于0,用户不存在 |
2.3 passwd命令
passwd命令的功能作为就是修改/etc/shadow文件中预定义的9个字段的内容,其中/etc/shadow的语义格式为:
bin : * : 16659 : 0 : 99999 : 7 : : : 字段1 字段2 字段3 字段4 字段5 字段6 字段7 字段8 字段9 字段1:表示用户名,与/etc/passwd中的账号相匹配 字段2:默认是加密后的字符,如果为*或!!表示没有秘密,如果为!!(加密字符)表示此账号加锁 字段3:表示上一次修改密码的时间 字段4:表示密码最短存活时间,其含义就是多久内不能修改密码 字段5:表示密码最长存活时间,其含义就是密码最长有效期 字段6:表示密码提前多少天开始提醒用户账号快到期 字段7:表示密码到期后多少天宽限期,哲学含义就是容忍度是有限的,不要碰触底线 字段8:表示密码彻底失效,哲学含义就是已经触犯底线,将密码禁止 字段9:表示保留字段,目前尚未使用 |
最长用的就是修改锁定密码和修改账号,具体用法如下:
passwd -l user1 #锁定某个账号,将shadow文件中第二个字段!!(加密字符)字样; passwd -u user1 #解锁某个账号,将shadow文件中第二个字段中的!!去掉 passwd --stdin user1 #设置密码通过标准输入进行设置 [root@centos7 ~]#echo "centos123"|passwd --stdin xiaoxue [root@centos7 ~]#echo "centos123"|passwd --stdin xiaowang &>/dev/nul |
2.4 随机密码
在系统中随机密码有多种方式,其中优先使用专有的密码生成工具mkpasswd,mkpasswd工具来自expect的rpm包,因此使用mkpasswd时,必须先安装expect包,具体使用如下:
mkpasswd [option] -l 指定密码生成的长度,默认是9 -d 指定密码生成时至少包含几个数字,默认是3个 -c 指定密码生成时至少包含几个小写字母,默认为2个 -C 指定密码生成时至少包含几个大写字母,默认2个 -s 指定密码生成时至少包含几个字符,默认1个 X4ep9[mCyr [root@centos7 ~]#mkpasswd -l 10 -C 2 70w(OAggno |
其次当系统中不方便安装mkpasswd工具时,使用系统随机字母字符生成器设备/dev/urandom,利用他生成随机数后进行过滤字母、数字,注意特殊字符过多,不一定连续,因此使用/dev/urandom时取特殊字符不好控制,建议使用mkpasswd,urandom具体使用如下:
[root@centos7 ~]#a=`cat /dev/urandom |tr -dc "a-zA-Z0-9"|head -c8` [root@centos7 ~]#echo $a mFPAW5Tn [root@centos7 ~]#a=`cat /dev/urandom |tr -dc "a-zA-Z0-9"|head -c8` |
2.5 while+case+break+select
while循环执行某些指令动作,case实现选择性执行某些指令,break实现遇到某些指令后执行跳出循环,seletc是自动生成菜单,因此在脚本的结构中while+case+break+select实现
三、脚本案例
脚本实现两种方式安装,菜单中选择1表示手工安装,手工安装适合批量较少时,无需自动化安装,菜单中选择2时表示自动化安装,适合批量增加用户,如新进大批员工,从人力资源获取相关信息后,根据人力资源提供的姓名创建大批用户,具体脚本如下:
#!/bin/bash addlog=/var/log/useradd.log execlog=/var/log/userexec.logDtime=`date +%F-%T` #在定义日志时,可以加如时间 ########################Define function to see whether a parameter is valid Valid_Parameter (){ local i=0 until [[ $name =~ ^[a-zA-Z]+$ ]];do let i++ if [ i -gt 3 ];then echo "you need to input correct parameter(eg:Wangyj)" fi done } ########################Define function to add user############ Add_User (){ local setpasswd j num Name setpasswd=`mkpasswd -l 10` #判断开头是否包含变量name所含的字段,从而判断是否有名字缩写的重复 Name01="$name"01 if [ $num -gt 1 ];then ####if $name is exist,than num >=1 useradd "$Name" &>/null if [ $? == 0 ];then echo $setpasswd |passwd --stdin "$Name" &>/null echo "User $Name and password set successful" echo "USER:$Name PASSWORD:$setpasswd" >> $addlog else echo "$Name add failed!" fi else #if $name is not exist,then num=1,exec this statement useradd $Name01 &>/null if [ $? == 0 ];then echo $setpasswd |passwd --stdin "$Name01" &>/null echo "User "$Name01" and password set successful" #if add success echo "USER:"$Name01" PASSWORD:$setpasswd" >> $addlog else echo ""$Name01" add failed!" fi fi } ########################Define function to manul user######### Manul (){ echo -e "\033[1;31mnote:if you input exit,then exit manal adding\033[0m" while true;do read -p "please input username: " name [ $name == exit ]&& break touch $addlog Valid_Parameter Add_User done } ########################Define function to auto config######## auto_config (){ echo -e "\033[1;31mAuto adding user begin\033[0m" while read name;do Add_User done < /etc/autoadd.config echo "adding finished" } ######################Define main function main (){ PS3="`echo please input the num you want: `" select var in "manaul" "auto-config" "exit" do case "$REPLY" in 1) Manul ;; 2) auto_config ;; 3) echo exit successful exit 0 ;; *) echo "intput error" esac done } main |
转载于:https://blog.51cto.com/wbxue/1963806