Linux-用户管理命令
目录
用户的分类(CentOS7)
用户UID | 系统含义 |
---|---|
0 | 超级用户(拥有系统的最高权限) |
1-200 | 系统用户,由系统分配给系统进程使用 |
201-999 | 系统用户,运行服务,不需要登录系统的 |
1000+ | 普通用户 |
注意:在CentOS7之前,创建用户,都是1-499 是系统用户,500+是普通用户,第一个创建的用户,不指定uid,一定是500。
用户信息相关文件
创建一个用户,一般会影响四个文件:
1./etc/passwd # 存放用户信息
2./etc/shadow # 存放用户密码信息
3./etc/group # 存放用户组信息
4./etc/gshadow # 存放用户组密码信息
/etc/passwd 文件
[root@localhost ~]# cat /etc/passwd
wqh: x:777:1001:此列为注释信息: /home/wqh:/bin/bash
/etc/shadow 文件
[root@localhost ~]# cat /etc/shadow
root:$6$iM1LuZaUuwyZrIg.$2X2Upu4KHmQoD1hzKHCzsmJqxPri9PlVDm5MYw/XdQsYgRpJaLIy1xWw0aDXLPePZNAcNRmfrYJrJgb6dmbu/.::0:99999:7:::
列数 | 名称 | 详情 |
---|---|---|
1 | 用户登陆名 | 用户的账号名称 |
2 | 加密后的密码 | 用户密码,这是加密过的口令,未设密码时为 * 或 !! , * 是1-200的系统进程, !! 是201-999的服务进程 |
3 | 最近一次密码更改时间 | 从1970年到最近一次更改密码时间之间过了多少天 |
4 | 密码最少使用几天 | 密码最少使用几天才可以更改密码(0表示无限制) |
5 | 密码最长使用几天 | 密码使用多少天需要修改密码(默认99999永不过期) |
6 | 密码到期前警告期限 | 密码过期前多少天提醒用户更改密码(默认过期提前7天警告) |
7 | 密码到期后保持活动的天数 | 在此期限内, 用户依然可以登陆系统并更改密码, 指定天数过后, 账户被锁定 |
8 | 账户到期时间 | 从1970年起,账户在这个日期前可使用,到期后失效。 |
9 | 标志 | 保留备用 |
用户创建过程中的配置文件
我们执行二进制文件 useradd 的时候,会调用哪些配置文件?
/etc/login.defs 文件
[root@wqh06 tmp]# ll /sbin/useradd
-rwxr-x---. 1 root root 118232 Oct 31 2018 /sbin/useradd
[root@localhost ~]# cat /etc/login.defs
[root@localhost ~]# grep -i '^[a-z]' /etc/login.defs
# 指定创建用户后的邮件文件存放位置
MAIL_DIR /var/spool/mail
# 密码,最长天数
PASS_MAX_DAYS 99999
# 密码最小天数
PASS_MIN_DAYS 0
# 密码最小长度
PASS_MIN_LEN 5
# 密码过期前7天 ,提示,密码要过期了,给老子改
PASS_WARN_AGE 7
# 普通用户的uid 最小值1000
UID_MIN 1000
# 普通用户的最大uid 60000
UID_MAX 60000
# -r创建的系统用户,201 - 999
SYS_UID_MIN 201
SYS_UID_MAX 999
# 普通用户组的最小gid
GID_MIN 1000
# 普通用户组的最大gid
GID_MAX 60000
# -r创建的系统用户组,201 - 999
SYS_GID_MIN 201
SYS_GID_MAX 999
# 默认创建家目录
CREATE_HOME yes
# 家目录umask
UMASK 077
0777 0777
- 0022 0077
------- ------
0755 0700
# 在删除用户的时候,是否捆绑,把用户组也删除
USERGROUPS_ENAB yes
# 用户密码加密算法
ENCRYPT_METHOD SHA512
/etc/default/useradd 文件
[root@localhost ~]# ll /etc/default/useradd
-rw-r--r-- 1 root root 119 11月 5 2016 /etc/default/useradd
[root@localhost ~]# cat /etc/default/useradd
# 依赖于/etc/login.defs的USERGRUUPS_ENAB参数,如果为no,则在此处控制
GROUP=100
# 默认普通用户的家目录
HOME=/home
# 是否启用账号过期停权,-1表示不启用
INACTIVE=-1
# 账号终止日期(没有设置)
EXPIRE=
# 创建用户的默认shell
SHELL=/bin/bash
# 当用户,误删除了自己家目录下的环境变量。
SKEL=/etc/skel
-bash-4.2$ cp /etc/skel/.bash* ~/
# 创建用户的同时,是否创建邮件文件
CREATE_MAIL_SPOOL=yes
用户管理命令
增加用户
useradd
adduser # useradd 的软链接
Usage:useradd [选项] [用户名]
默认情况下,在创建用户的时候,会创建一个和用户同名的组,并且把该用户加入该组
[root@localhost ~]# useradd wqh
-u:(uid)指定uid
-g:(gid)指定gid,也可以指定组名,需要存在这个组名
-G:(Group)指定附加组,如果加入多个附加组则用,逗号隔开
[root@wqh06 ~]# useradd wqh -g root -G bin,dba,sa
-d:(directory)指定用户的家目录
[root@wqh06 ~]# useradd kkkk -d /tmp/kkkk
-s:(shell)指定登录的shell,可登录用户:/bin/bash,不可登录用户:/sbin/nologin
-c:(comment)添加注释
-M:不创建家目录
-r:帮我们创建一个uid范围是201-999的系统用户(默认可以登录),不创建家目录
删除用户
userdel
Usage:userdel [选项] [用户名]
# 注意: 默认情况下,在删除用户的同时会把同名的用户组也删除,但是如果组内有其他用户,则不会删除组,只删除用户
-r:删除用户的同时,删除用户的家目录,和用户的其他 邮件目录... (删干净)
修改用户
usermod
Usage:usermod [选项] [用户名]
-u:修改uid
-g:修改gid
-G:修改附加组(一般配合-a使用) # 直接用会把从组修改没,添加一个新的组,一般都会加-a,会在后面继续添加从组
-d:指定修改后的家目录(需要加 -m 才可用)
-s:修改登录的shell
-c:修改注释
-l:修改登录的用户名,如:usermod wqh -l wqh01
-L:锁定用户(封号),LOCK
-U:解锁用户(解封),UNLICK
-a:配合-G,在修改附加组的时候,起到追加效果(append)
-m:修改(迁移)家目录,必须配合 -d
查看用户
id # 查看当前登录用户
Usage:id [用户名]
-u:查看UID
-g:查看GID
-G:查看附加组
w # 查看当前登录终端的设备以及用户
who # 查看当前登录的用户,以及远程连接的IP地址
用户密码管理命令
passwd # 修改当前登录用户的密码
#使用交互式的方式设置密码
[root@localhost ~]# passwd wqh
# 使用非交互的方式设置密码给指定用户
[root@localhost ~]# echo '123' | passwd --stdin wqh
md5sum # 加密算法,并且做校验,相同的一串字符每次md5加密结果相同
[root@wqh06 ~]# echo 123 |md5sum
ba1f2511fc30423bdbb183fe33f3dd0f -
mkpasswd # 随机生成密码命令,需要安装expect包
[root@wqh06 ~]# yum install -y expect //需要安装扩展包
[root@wqh06 ~]# mkpasswd -l 10 -d 2 -c 2 -C 2 -s 4
|K&13bR)i/
批量创建用户并给予密码(面试题)
面试题:请你创建出来100个用户,并且设置100个随机密码,并且记录密码,每个用户都可以登录,密码记录的格式如username:password
:
[root@wqh06 ~]# cat /tmp/1.txt
wqh001:123456
wqh002:kzsuhiuh1
awk方法:
# 利用mkpasswd生成密码,把格式固定,输入到文件中,再cut出 ":" 后的密码,交给passwd:
[root@wqh06 ~]# seq -w 100|awk '{print "useradd usr"$1,"&& echo usr"$1":`mkpasswd -l 10` |tee -a /root/wangqihan.pass|awk -F \"[:]\" \"{print $2}\"| passwd --stdin usr"$1 }' |bash
# 利用变量解决:
[root@wqh06 ~]# seq -w 100|awk '{print "useradd cls"$1,"&&","pass=`echo $RANDOM|md5sum|cut -c 1-10`","&&","echo $pass|passwd --stdin cls"$1,"&& echo cls"$1":$pass >> /tmp/2.pass"}'|bash
sed方法:
[root@wqh06 ~]# seq -w 100|sed -nr 's#(.*)#useradd wls\1 \&\& pass=`echo $RANDOM|md5sum|cut -c 1-10` \&\& echo $pass |passwd --stdin wls\1 \&\& echo wls\1:$pass >> /tmp/wls.pass#gp'|bash
for方法:
[root@wqh06 ~]# for n in `seq -w 100`;do useradd lls$n;pass=`echo $RANDOM|md5sum|cut -c 1-10`;echo $pass |passwd --stdin lls$n;echo lls${n}:$pass >> /tmp/lls.pass;done
写一个交互式的脚本文件:
#!/bin/bash
read -p "请输入需要创建的用户名 :" username
read -p "请输入需要创建用户的数量:" usercount
for n in `seq -w $usercount`;do
useradd $username$n
pass=`echo $RANDOM|md5sum|cut -c 1-10`
echo $pass |passwd --stdin $username$n
# 下一条语句中的${n},加{}的目的是与后面的`:`分隔开,这里也可以不加,只是作区分用,不等同与命令行的$()的调用功能
echo $username${n}:$pass >> /tmp/$username.pass
done
awk方法结果:
脚本:
上图中实际上就是将命令行中的for命令内容,堆起来,每一行用 && 连接,依然可行:
我们也可以搞一个交互式的脚本:
记录成长过程