批量创建用户的需求在生产环境中用的不多,但是面试题中经常会看到。

要求:

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判断。

小建议:加一个判断用户是否存在的逻辑,这样就完美了。