Linux基础07 用户管理, 用户相关命令(创建, 修改, 删除), 用户创建配置文件, 命令提示符, 查看用户登录, 设置用户密码(设置随机复杂密码)
一.用户管理
1.什么用户?
用户指的是能够正常登录Linux或windows系统
2.用户的作用?
1)系统中的进程,都是由用户来运行的
2)管理文件的权限
3)进程能否访问到文件,和用户有关
3.和用户相关的文件
/etc/passwd 用户及其属性信息(名称、UID、主组ID等)
[root@oldboyedu opt]# cat /etc/passwd
login name #登录用户名
password #密码位,x只是表示一个占位符,可为空
UID #用户ID,0 表示超级管理员
GID #所属组ID
GECOS #用户全名或注释,描述信息,可为空
directory #用户家目录,在创建用户时,默认会创建在/home 目录下
shell #用户默认shell,/sbin/nologin 表示不用登录的 shell
用户名称 密码占位符(密码在/etc/shadow) 用户uid 用户gid 注释信息 用户家目录 用户登录shell(sbin/nologin不能登录,sbin/shutdown登录就关机) root: x: 0: 0: root: /root: /bin/bash
#修改用户shell [root@ubuntu2204 ~]# getent passwd jose jose:x:1001:1001::/home/jose:/bin/bash [root@ubuntu2204 ~]# chsh -s /bin/sh jose [root@ubuntu2204 ~]# getent passwd jose jose:x:1001:1001::/home/jose:/bin/sh
/etc/shadow 用户密码及其相关属性
[root@zls ~]# tail -1 /etc/shadow
zls1:!!:16312:0:99999:7:::
[root@zls ~]# tail -1 /etc/shadow zls1:!!:16312:0:99999:7::: // /etc/shadow由 ':' 为分割符, 分为9个字段,每个字段的具体含义如下: 字段名称 注释说明 1.用户登陆名 //用户的账号名称 2.加密后的密码 //用户密码,这是加密过的口令(未设密码时为!!, *) 3.最近一次密码更改时间 //从1970年到最近一次更改密码时间之间过了多少天 4.密码最少使用几天 //密码最少使用几天才可以更改密码(0表示无限制) 5.密码最长使用几天 //密码使用多少天需要修改密码(默认99999永不过期) 6.密码到期前警告期限 //密码过期前多少天提醒用户更改密码(默认过期提前7天警告) 7.密码到期后保持活动的天数 //在此期限内, 用户依然可以登陆系统并更改密码, 指定天数过后, 账户被锁定 8.账户到期时间 //从1970年起,账户在这个日期前可使用,到期后失效。 9.标志 //保留
注:所有伪用户的密码都是 "!!" 或 "*",代表没有密码是不能登录的,新建用户还没设密码时为!!,禁用账 号,可以直接在密码字段前加 !
默认配置文件
/etc/login.defs
/etc/defaults/useradd
环境变量的模板家目录
/etc/skel/
文件操作: getent
针对4个文件: etc/passwd, /etc/shadow, /etc/group, /etc/gshadow
getent passwd|shadow|group|gshadow [uname] #根据用户名查看配置项
4.用户的分类(约定)
0:一定是超级管理员
1-200:是系统用户,系统自建
201-999:是系统用户,咱们创建 # 创建为useradd -r
1000+:普通用户 # 也可以起系统, 只是约定一般不这样
注意: 在CentOS7系统之前, UID1-499用于系统用户, 而UID 500+则用于普通用户
二.用户的相关命令
1)创建用户 useradd # useradd和adduser一样,adduser是useradd的软连接(centos7中才有)
# useradd 用户名 # 创建用户(创建用户就有用户名对应的组,不用groupadd特别创建一个组) -u:指定uid -g:指定组(必须是已存在的组)(组名或者是gid) -s:指定用户登录的shell -c:加注释 -M:不创建家目录 -d:指定家目录 -G:指定附加组 -r:指定系统用户,并且不创建家目录 (该参数没什么用处)
-D|--defaults #显示或更改默认的 useradd 配置,默认配置文件是 /etc/default/useradd # useradd -r mysql -u 203 #创建系统用户, 通过-u指定创建用户id # useradd zls101 -u 366 -g od #通过-g加入od组, -g后面也可以写组id(gid) # useradd php -u 1114 -g od -s /sbin/nologin #创建无法登陆的用户,通过指定shell(既然不能登录,那么家目录也没用) # useradd elk -u 1115 -g od -s /sbin/nologin -c 'elk start service' -M #-c添加注释, -M不添加家目录(不能登录没有意义) # useradd egon -d /opt/egg #指定家目录地址 查看用户的命令
id:查看当前用户
id username # 查看其它用户信息
设置用户密码 passwd
# passwd 用户名 # 设置用户密码
创建组 groupadd
# groupadd 组名称 # 创建组
# 创建zls用户,指定UID5001,基本组students 附加组sa,dba 注释信息:one newB user, 登陆的shell:/bin/bash groupadd student groupadd sa groupadd dba useradd zls -u 5001 -g student -G sa,dba -c 'one newB user' -s /bin/bash 2)修改用户 usermod '-u' 修改用户的UID '-g' 修改用户所属的基本组GID '-G' 修改用户附加组, 使用逗号隔开多个附加组, 覆盖原有的附加组 '-a' 追加更多的附加组, 必须和-G使用: -aG 追加附加组 '-m' 家目录迁移, 必须和-d一起使用, 移动用户的家目录到新的位置 '-d' 指定用户的家目录新位置 '-c' 修改用户的注释信息 '-s' 更改用户使用的shell '-l' 更改用户登录名 '-L' 锁定用户 '-U' 解锁用户 # usermod ldc -s /sbin/nologin #修改ldc用户为不可登录 # usermod zls -G od #把zls用户的附加组改为od # usermod zls -aG od,dba #把zls用户的附加组添加od, dba # usermod zls1 -d /opt/zls1 -m #家目录迁移, 必须和-d一起使用, 移动用户的家目录到新的位置 # usermod ldc -L(使用后,ldc登陆着还能用,断开再连接无论输如任何密码都无法登录) 3)删除用户 userdel -r:删除用户并删除家目录 # userdel -r egon #删除egon用户同时删除其家目录
-f|--force #强制删除,哪怕用户正在登录状态
4) 查看
[root@ubuntu2204 ~]# useradd -u 336 -g mysql -s /sbin/nologin -d /data/mysql -M -r mysql
[root@ubuntu2204 ~]# getent passwd mysql
mysql:x:336:336::/data/mysql:/sbin/nologin
[root@ubuntu2204 ~]# getent shadow mysql
mysql:!!:19168::::::
#显示或更改默认设置 #useradd -D #useradd –D -s SHELL #useradd –D –b BASE_DIR #useradd –D –g GROUP #查看 [root@ubuntu2204 ~]# useradd -D GROUP=100 HOME=/home INACTIVE=-1 EXPIRE= SHELL=/bin/sh SKEL=/etc/skel CREATE_MAIL_SPOOL=no #更改默认 shell [root@ubuntu2204 ~]# useradd -D -s /bin/bash
#批量创建用户 newusers file [root@ubuntu2204 ~]# cat user.txt u1:123456:1024:1024::/home/u1:/bin/bash u2:123456:1025:1025::/home/u2:/bin/bash [root@ubuntu2204 ~]# newusers user.txt [root@ubuntu2204 ~]# id u1 uid=1024(u1) gid=1024(u1) groups=1024(u1) [root@ubuntu2204 ~]# id u2 uid=1025(u2) gid=1025(u2) groups=1025(u2)
#批量修改用户口令 chpasswd < file [root@ubuntu2204 ~]# cat pwd.txt u1:1234567 u2:1234567
#标准输入重定向 [root@ubuntu2204 ~]# chpasswd < pwd.txt
#多行重定向 [root@ubuntu2204 ~]# chpasswd <<EOF > u1:1234567 > u2:1234567 > EOF #管道重定向 [root@ubuntu2204 ~]# echo u1:123456 | chpasswd
三.用户创建配置文件
useradd创建用户时,系统会以/etc/login.defs、/etc/defaults/useradd两个配置文件作为参照物 1./etc/login.defs (grep -vE '^#|^$' /etc/login.defs) #用户的邮件目录 MAIL_DIR /var/spool/mail #密码的最大天数 PASS_MAX_DAYS 99999 #密码最小使用天数 PASS_MIN_DAYS 0 #密码最小长度 PASS_MIN_LEN 5 #剩多少天警告 PASS_WARN_AGE 7 #普通用户最小uid UID_MIN 1000 #普通用户最大uid UID_MAX 60000 #系统用户最小uid SYS_UID_MIN 201 #系统用户最大uid SYS_UID_MAX 999 #普通用户最小gid GID_MIN 1000 #普通用户最大gid GID_MAX 60000 #系统用户最小gid SYS_GID_MIN 201 #系统用户最大gid SYS_GID_MAX 999 #是否创建家目录(如果改为false,即使创建用户-d指定家目录地址也没用) CREATE_HOME yes #创建家目录的权限(目录权限为777-077=700) UMASK 077 #创建用户的同时 创建组,删除用户的同时,删除组 USERGROUPS_ENAB yes #密码的 加密算法 ENCRYPT_METHOD SHA512 2./etc/default/useradd #依赖于/etc/login.defs的USERGRUUPS_ENAB参数,如果为no,则在此处控制(从100开始创建组) GROUP=100 #普通用户家目录 HOME=/home #是否启用账号过期停权 -1表示不启用 INACTIVE=-1 #账号的终止日期 不设置表示不启用 EXPIRE= #默认登录shell SHELL=/bin/bash #用户的家目录 环境变量(如果用户家目录环境变量没了, 命令提示符错误, 可以从这里拷) SKEL=/etc/skel #创建邮件 CREATE_MAIL_SPOOL=yes
命令提示符
#Rocky默认提示符 [root@rocky86 ~]# #Ubuntu默认提示符 root@ubuntu22:~# #查看命令提示符设定 #rocky系统 [root@rocky ~]# echo $PS1 [\u@\h \W]\$ #一一对应,[用户@主机名 路径]提示符(#管理员 $普通用户) #ubuntu系统 mage@ubuntu1:~$ echo $PS1 \[\e]0;\u@\h: \w\a\]${debian_chroot:+($debian_chroot)}\u@\h:\w\$ 实际上是 \u@\h:\w\$ #PS1变量中的常用选项 \d #曰期,格式为"星期 月 日" \H #完整的主机名。如默认主机名"localhost.localdomain"。 \h #简写的主机名。如默认主机名"localhost"。 \t #24小时制时间,格式为"HH:MM:SS"。 \T #12小时制时间,格式为"HH:MM:SS"。 \A #24小时制时间,格式为"HH:MM"。 \@ #12小时制时间,格式为"HH:MM am/pm"。 \u #当前用户名。 \v #Bash版本信息。 \w #当前所在目录的完整名称。 \W #当前所在目录的最后一个目录。 \# #执行的第几条命令。 \$ #提示符。如果是 root 用户,则会显示提示符为"#";如果是普通用户,则会显示提示符为"$" #临时修改(重新登录就失效) [root@rocky ~]# PS1=abce abce #改成红色高亮(便于查找命令) [root@rocky ~]# PS1='\e[31;1m[\u@\h \W]\$ \e[0m' [root@rocky ~]# 如果想让配置项永久生效,写文件 #rocky系统(红色高亮) [root@rocky ~]# echo "PS1='\e[31;1m[\u@\h \W]\\$ \e[0m'" > /etc/profile.d/env.sh #ubuntu系统(粉色高亮) mage@ubuntu:~$ echo "PS1='\[\e[1;35m\][\u@\h \W]\\$\[\e[0m\]'" >> .bashrc
企业级故障案例:
# 在当前用户的家目录下,想要删除所有文件,执行了如下命令 [root@db04 ~]# rm -fr .* # 结果再次登录时,命令提示符不对了 -bash-4.1# # 解决方法 -bash-4.1# cp /etc/skel/.bash* . # 再次登录 即可恢复 [root@db04 ~]#
四.查看用户登录
whoami:查看当前登录的用户 who [root@oldboyedu ~]# who 登录的用户 终端设备 登录时间 登录的IP oldboy1 pts/0 2019-06-27 18:01 (192.168.15.132) root pts/1 2019-06-27 18:01 (10.0.0.1) w [root@oldboyedu ~]# w 系统时间 服务器运行时间(重启重算) 当前登录的用户数 CPU的负载: 1分钟 5分钟 15分钟(按核数计算) 18:14:51 up 0 min, 1 user, load average: 0.75, 0.19, 0.06 10:13:35 up 249 days, 2:09, 1 user, load average: 5.61, 2.03, 0.76 用户 终端设备 连接的IP 登录时间 空闲 CPU使用率 USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT root pts/0 10.0.0.1 18:14 3.00s 0.02s 0.00s w # 查看当前用户终端设备 tty (通过ps杀死对应的终端设备,该终端就关了)
五.设置用户密码(用户没密码无法登录)
passwd --stdin : 非交互设置密码 [root@oldboyedu ~]# passwd 修改当前用户的密码(普通用户只能改自己) [root@oldboyedu ~]# passwd qiudao01 修改指定用户的密码(root) #普通用户(无法修改指定用户密码) [oldboy1@oldboyedu ~]$ passwd oldboy1 passwd: Only root can specify a user name. 修改自己的 还得是输入旧密码 密码要符合 密码的复杂性 [oldboy1@oldboyedu ~]$ passwd 需要注意: 1.普通用户只能更改自己的密码(密码必须满足8位字符) 2.管理员用户能更改任何人的密码(密码长度无限制) 非交互设置密码(#适用于红帽系列的Linux版本) [root@oldboyedu ~]# echo 123 |passwd --stdin(标准输入) 用户名 [root@oldboyedu ~]# echo 123 |passwd --stdin ldc #Ubuntu中 passwd 无 --stdin 选项
#此写法在centos中也支持,更通用
root@ubuntu20:~# echo -e '123456\n123456' | passwd jose
New password: Retype new password: passwd: password updated successfully
设置随机密码 echo $RANDOM :生成随机数 md5sum:给随机数再加密 cut -c 1-10 : 取前10个字符 tee:将原本输出的内容保存到文件中 # -a参数 写入不会覆盖 # 生成随机数加密剪切,存入文件并设置密码给ldc1用户 [root@localhost ~]echo $RANDOM|md5sum|cut -c 1-10|tee pass.txt|passwd --stdin ldc1
设置随机复杂密码(扩展)
# 安装
yum install -y expect mkpasswd -l:密码长度 -d:数字 -c:小写字母 -C:大写字母 -s:特殊字符 [root@localhost ~]# mkpasswd -l 20 -d 2 -c 2 -C 2 -s 14 [root@localhost ~]# mkpasswd -l 20 -d 2 -c 2 -C 2 -s 14|tee pass.txt|passwd --stdin ldc1
密码文件中各时间字段的表示: