批量创建用户的需求在生产环境中用的不多,但是面试题中经常会看到。
要求:
1)批量增加100个用户
2)用户名为user_01-user_100
3)给所有用户都设定一个随机密码,密码长度12位,需要包含大小写字母以及数字
4)并把用户的密码保存到/data/user_passwd文件中
5)这100个用户同属于users组
知识点一:系统用户管理
1)增加用户
useradd user1
这样会增加user1这个用户,如果不指定它所属组,则会创建和用户名同名的一个组。要想指定组,那么该组首先已经存在,增加组的命令是:
groupadd grp1
增加用户的时候再指定组:
useradd -g grp1 user2
除了指定组,还可以指定uid,-u选项:
useradd -u 1100 user3
指定用户的家目录:
useradd -d /data/123 user4
指定用户的shell:
useradd -s /sbin/nologin user5
2)删除用户
最简单的方法:
userdel user5
连家目录及邮件目录一起删除,加上-r选项,如;
userdel -r user5
3)更改用户属性
命令是usermod,用法和useradd几乎一样,命令的选项及代表的含义都是相同的。如,更改用户uid:
usermod -u 1109 user3
更改用户家目录:
usermod -d /home/user4 user4
更改所属组:
usermod -g grp2 user2
-G选项,指定用户的扩展组,可以有多个:
usermod -G grp1,grp2 user1
知识点二:seq命令
seq命令的最简单用法:
# seq 1 5 1 2 3 4 5
seq可以打印一个序列出来,通常在shell脚本中把它作为遍历的对象。如:
# for i in `seq 1 5`; do echo "the number is $i"; done the number is 1 the number is 2 the number is 3 the number is 4 the number is 5
seq后面有两位数,第一个是起始数字,第二个是结束数字,规范写法应该在中间加上步长数值,表示每次增加多少,如果不写步长,默认就是1,来看下面的例子:
# seq 1 2 10 1 3 5 7 9
也可以写倒序,上面步长是2,下面步长为-3:
# seq 10 -3 1 10 7 4 1
另外还有一个常用选项-w,如下:
# seq -w 05 10 05 06 07 08 09 10
本案例中,要求我们增加的用户名并不是简单的user1,user2,user3...;user_01,user_02,user_03...;所以在使用for循环遍历的时候,需要加上-w。
知识点三:随机字符串
给用户设置密码,有一个命令叫做mkpasswd,安装的Linux默认是没有这个命令的,需要安装一个expect软件包。
直接运行mkpasswd命令会生成一个9位的随机字符串,包含大小写字母、数字以及特殊符号,例如:
# mkpasswd e54aLhaS~
还可以给它增加一些选项,生成自定义的随机字符串,如:
# mkpasswd -l 12 -c 2 -d 5 -s 0 5jo7zq48Jo1G
-l:指定密码长度;
-c:指定密码中小写字母最少的位数,默认是2位;
-C:指定密码中大写字母最少的位数,默认是2位;
-d:指定密码中数字最少的位数,默认是2位;
-s:指定密码中特殊字符最少的位数,默认是1位。
知识点四:给用户设定或修改密码
系统添加完用户后,默认用户是没有设置密码的,所以就无法登录。
给用户设定密码的命令是passwd,后面跟用户名,如果省略掉用户名就是给用户自己设定或更改密码。passwd命令修改密码需要和用户交互,如下:
# passwd user1 更改用户user1的密码。 新的 密码: 重新输入新的 密码: passwd:所有的身份验证令牌已经成功更新。
这种形式在shell脚本中是不可取的,因为没人为我们输入密码,解决这个问题有2个方案。
1)模拟用户输入两次密码
echo -e "your-passwd\nyour-passwd\n" |passwd
说明:echo -e可以把\n识别为回车,这样就相当于连续输入了两次“your-passwd”字符串。
2)使用passwd命令的--stdin选项
echo "your-passwd" |passwd --stdin
--stdin可以从标准输入读取令牌(只有根用户才能进行此操作)。
本案例参考脚本
#!/bin/bash ##批量添加100个用户,user_01-user_100 ##作者: ##日期: ##版本:v0.1 #检查是否有mkpasswd命令 #如果没有该命令,需要安装expect包 if ! which mkpasswd &> /dev/null then echo "没有mkpasswd命令安装该命令:" yum install -y expect fi #判断/data/user_passwd文件是否存在 #若存在,应该先删除 [ -f /data/user_passwd ] && rm -f /data/user_passwd #因为100是三位数,所以只能遍历到99 for n in `seq -w 1 99` do pass=`mkpasswd -l 12 -c 5 -d 5 -s 0` echo "添加用户user_$n" useradd -g users user_$n echo "给用户user_$n设定密码" echo $pass |passwd --stdin user_$n #将对应的用户及密码存到文件中 echo "user_$n $pass" >>/data/user_passwd done pass=`mkpasswd -l 12 -c 5 -d 5 -s 0` echo "添加用户user_100" useradd -g users user_100 echo "给用户user_100设定密码" echo $pass |passwd --stdin user_100 echo "user_100 $pass" >>/data/user_passwd
说明:
[ -f /data/user_passwd ] && rm -f /data/user_passwd这条命令,相当于:
if [ -f /data/user_passwd ] then rm -f /data/user_passwd fi
shell脚本中的&&和||,往往替代if判断。
小建议:加一个判断用户是否存在的逻辑,这样就完美了。