用户管理
和Windows一样在Linux中也存在许多用户,可以登陆Linux,和Windows不同的是,在Windows中同一时刻只可以存在一个用户登录系统,而在Linux中是允许多个用户同时登陆进入Linux中的,然后可以同时进行操作。
因为在Linux中一切皆文件,所以说,用户也是以文件的形式存在的,每一个用户在Linux中是一个文件,用一个用户登录进入了系统之后,便进入了那个用户所对应的文件夹中,可以在文件夹中进行操作。
因为在Linux中是允许多用户同时登录进入的,如何避免不同用户之间的操作冲突,这就需要涉及到用户的权限和用户组的概念。
文件 | 含义 |
---|---|
/etc/passwd | 用户基本信息配置文件 |
/etc/shadow | 用户密码信息配置文件 |
/etc/group | 组基本信息配置文件 |
/etc/gshadow | 组管理信息配置文件 |
【1】、用户
一个用户必须至少属于一个组
-
分类
-
超级用户
UID:0
-
普通用户
UID:1000-60000
-
程序用户
UID:201~999
-
-
超级用户和普通用户的区别就是UID的不同,UID也是区分超级用户和普通用户的唯一标准
-
用户对应 /etc/passwd,用户信息文件
-
-
第一列:用户名
-
第二列:这里的密码并不是明文存储的,而是经过加密处理的。在实际的系统中,这个字段通常被设置为x,密码放在/etc/shadow
-
第三列:UID,是一个唯一的数字标识,用于在系统中区分不同的用户
-
第四列:GID,表示用户所属的主组。在Linux系统中,用户可以被分配到不同的组中,每个组都有一组特定的权限。
-
第五列:用户全名或描述信息,通常用于存储用户的真实姓名、联系方式等。
-
第六列:用户家目录的绝对路径,即用户登录后所处的目录。
-
第七列:用户的登录shell,如果时bin/nologin则表示禁止登录,/bin/bash可以登录;用户解释命令的程序
bash:标准解释器
[root@bogon logs]# cat /etc/shells #系统自带的所有的解释器,我们可以进行更改 /bin/sh /bin/bash /usr/bin/sh /usr/bin/bash #/bin/sh #/bin/bash #都是从/usr/bin/sh和/usr/bin/bash下连接过来的
-
-
-
密码对应 /etc/shadow
存放的是用户的密码,要与/etc/passwd一一对应
-
第一列:用户名,与passwd中的用户一一对应
-
第二列:加密后的用户密码。这是密码信息的核心部分,经过哈希计算后得到的密码
$5$ 是用 SHA-256加密的,密文长度43
$6$开头的,表明是用SHA-512加密的,密文长度86
root中的“$70Apx6PdSNNYkv2S$0WKXFO0qYIeuTsF”是salt,也就是“加盐”,防止撞库破解密码
-
第三列:表示的是从1970-1-1(unix元年),到今天修改密码时的天数
-
第四列:指的是两次修改密码之间所需的最小天数。
-
第五列:指的是口令保持有效的最大天数,99999就表示永久有效
-
第六列:“警告时间”字段表示的是从系统开始警告用户到用户密码正式失效之间的天数。(和第五个字段相比)
-
第七列:表示的是用户没有登录活动但账号仍能保持有效的最大天数。(和第五个字段相比)
-
第八列:给出的是一个绝对的天数,如果使用了这个字段,那么就给出相应账号的生存期。期满后,该账号就不再是一个合法的账号
-
第九列:未启用
-
【2】用户组
-
为了方使管理属于同一组的用户, Linux 系统中还引入了用户组的概念,
- 通过使用用户组号码(GID, Group IDentification), 我们可以把多个用户加入到同一个组中, 从而方便为组中的用户统一规划权限或指定任务。
-
Linux在创建用户时,会自动创建一个与其同名的用户组,这个用户只有该用户一个人
-
分类:
-
基本组
每一个用户都要有一个基本组
不能通过groupdel删除
-
附加组
附加组可以使用groupdel删除
每一个用户可以有一个或者多个附加组
-
-
用户组的信息存储在/etc/group中
- 第一列:用户组名
- 第二列:密码占位符,这里的密码并不是明文存储的,而是经过加密处理的
- 第三列:GID
- 第四列:这个组中的用户
【3】、常用命令
1、useradd创建用户
-
useradd username 创建名为username的用户,同时会创建一个名为username的组
-
在创建用户时,会完成三个操作
useradd test1
-
/home/
在创建用户时,会在home下创建一个自己的家目录test1
[root@localhost ~]# ls -a /home/ . .. test1 xuruizhao
-
/etc/skel/
[root@localhost ~]# ls -a /etc/skel/ . .. .bash_logout .bash_profile .bashrc
-
/home/test1
[root@localhost ~]# ls -a /home/test1/ . .. .bash_logout .bash_profile .bashrc
-
/var/spool/mail/
在创建用户时,会在/var/spool/mail/下创建一个以自己命名的邮件
[root@localhost ~]# ls -a /var/spool/mail/ . .. rpc test1 xuruizhao
-
我们会发现/home/test1和/etc/skel目录下的文件相同,在我们创建用户时,会把/etc/skel完全复制到/home/test1下,这样在创建用户时该用户就会有bash了
但是这是存在风险的,如果我们把一个存在风险的文件,放在/etc/skel里,接下来所创建的所有用户的家目录中都会存在该文件,这就导致所有的用户都存在fengx
[root@localhost ~]# cp /opt/aa.txt /etc/skel/ [root@localhost ~]# ls -a /etc/skel/ . .. aa.txt .bash_logout .bash_profile .bashrc [root@localhost ~]# useradd test2 [root@localhost ~]# ls -a /home/test2 . .. aa.txt .bash_logout .bash_profile .bashrc
-
-
参数:
-
-g:指定用户的主组, 不会再创建一个和用户名相同的组了
[root@bogon ~]# useradd -g zzzz nihao [root@bogon ~]# id nihao uid=1003(nihao) gid=1006(zzzz) groups=1006(zzzz)
-
-G :指定用户的附加组,同样会创建一个和用户名相同的组,并且这个用户属于两个组
[root@bogon ~]# useradd -G zzzz lala [root@bogon ~]# id lala uid=1004(lala) gid=1004(lala) groups=1004(lala),1006(zzzz)
-
-u:设置UID
[root@localhost ~]# useradd -u 1100 test3 [root@localhost ~]# id test3 uid=1100(test3) gid=1100(test3) groups=1100(test3)
-
-s :设置用户登录的shell解释器
[root@localhost ~]# useradd -s /sbin/nologin test3 [root@localhost ~]# su - test3 This account is currently not available
-
-d:指定用户的家目录
-d:指定的目录一定要是不存在的
目录不能是嵌套的
-> # useradd -d /opt/xxx xxx root@locahost [11:10:13 AM] [/opt] -> # cd /opt root@locahost [11:10:18 AM] [/opt] -> # ls xxx
-
-M :在创建用户时不创建用户的主目录也就是/home/username
[root@localhost ~]# useradd -M test3 [root@localhost ~]# su - test3 su: warning: cannot change directory to /home/test3: No such file or directory
如何进行修复
缺少/home/下的家目录,我们又知道,家目录是由/etc/skel/复制过来的,那我们就找到了解决办法
[root@localhost ~]# cp -r /etc/skel/ /home/test3 [root@localhost ~]# su - test3 [test3@localhost ~]$
-
2、userdel删除用户
-
userdel username 删除用户
-
su - 可以进行用户切换
[root@localhost ~]# su - test1 [test1@localhost ~]$ su - root Password: [root@localhost ~]# su - test1 [test1@localhost ~]$
-
如果我们多次使用su - 去切换用户,此时就会造成一个进程嵌套,在这种情况下,即便切换回了root用户也不能删除test1用户,我们可以看到test1用户是处于父进程的状态,子进程是不能删除父进程的
├─sshd───sshd───sshd───bash───su───bash───su───bash───su───bash───pstree
我们必须删除多余的进程才可以删除用户
-
-
参数:
-
-r:在删除用户时同时删除/home/下的家目录以及/var/spool/mail/下的邮件
-
如果没有使用-r参数进行删除,用户的信息是能被保留的,如果后面想在创建一个同名的用户虽然可以被创建,但是什么操作都无法进行
[root@localhost ~]# userdel test1 [root@localhost ~]# useradd test1 useradd: warning: the home directory already exists. Not copying any file from skel directory into it. Creating mailbox file: File exists # 他会告诉你,home directory和mailbox file已存在
-
解决方法
强制删除/home/下的家目录以及/var/spool/mail/下的邮件
[root@localhost ~]# rm -rf /var/spool/mail/test1 [root@localhost ~]# rm -rf /home/test1
-
-
3、groupadd创建用户组
-
我们自己创建的组的GID是从1000开始的依次递增的
-
参数:
-
-g :在创建组的时候设置组的GID
[root@localhost ~]# groupadd -g 1500 xu xu:x:1500:
-
4、usermod对用户进行修改
针对已经创建的用户
(1)、-L 加锁,禁止log登录
给用户加锁就是在shadow中用户的密码前面加“!”。加锁对于超级用户是不生效的,只对普通用户生效
[root@localhost opt]# usermod -L test2
[root@localhost opt]# grep -n test2 /etc/shadow
39:test2:!$6$lM9ENRYIsp7Ik7gy$rEfeRt44V4bGY07pOH.6ZHEwfCfZoAz8uSTaKP.SeCaxYLEkEsvfx..UGf2gtbc2LfanVoFFSZ3DFnTrLSnii0:19808:0:99999:7:::
[root@localhost opt]# su - test1
[test1@localhost ~]$ su - test2
Password:
su: Authentication failure
(2)、-U 减锁,允许log登录
[root@localhost opt]# usermod -U test2
[root@localhost opt]# grep -n test2 /etc/shadow
39:test2:$6$lM9ENRYIsp7Ik7gy$rEfeRt44V4bGY07pOH.6ZHEwfCfZoAz8uSTaKP.SeCaxYLEkEsvfx..UGf2gtbc2LfanVoFFSZ3DFnTrLSnii0:19808:0:99999:7:::
[root@localhost opt]#
(3)、-G 用户修改附加组
[root@localhost opt]# usermod -G xu test2
[root@localhost opt]# id test2
uid=1002(test2) gid=1002(test2) groups=1002(test2),1500(xu)
(4)、-g 修改属组
[root@localhost opt]# usermod -g xu test2
[root@localhost opt]# id test2
uid=1002(test2) gid=1500(xu) groups=1500(xu)
(5)、-s 修改用户的shell
[root@localhost opt]# usermod -s /bash/nologin test2
[root@localhost opt]# grep -n test2 /etc/passwd
39:test2:x:1002:1500::/home/test2:/bash/nologin
(6)、-u:修改用户的UID
-> # usermod -u 3000 xuxu
root@locahost [11:33:32 AM] [~xxx]
-> # id xuxu
uid=3000(xuxu) gid=2000(xuxu) groups=2000(xuxu)
(7)、-l:修改用户名字
usermod -l xxxx xuxu
(8)、-d、-m:修改用户的家目录
usermod的-d选项没有创建家目录的功能
如果修改用户的家目录,这个家目录本身是不存在的,那么这个用户的就变成没有家目录的用户
因此一般-d都和-m搭配使用
-m的作用是:在给用户指定新的家目录时,同时将该用户原来的家目录移动过去,并重命名为指定的新的目录的名字,形成新的家目录
root@locahost [11:39:29 AM] [~xxx]
-> # usermod -md /opt/qqq xuxu
root@locahost [11:39:53 AM] [~xxx]
-> # ll /home
total 0
drwx------. 2 xu xu 97 May 29 21:50 xu
root@locahost [11:39:59 AM] [~xxx]
-> # ll /opt
total 0
drwx------. 2 xuxu xuxu 76 May 30 11:07 qqq
drwx------. 2 xxx xxx 76 May 30 11:10 xxx
5、passwd设置用户密码
-
交互式设置密码
[root@localhost ~]# passwd test2 Changing password for user test2. New password: BAD PASSWORD: The password is shorter than 8 characters Retype new password: passwd: all authentication tokens updated successfully.
-
非交互式设置密码,只有超级用户有权限使用
[root@localhost ~]# echo 123123 | passwd --stdin test2 Changing password for user test2. passwd: all authentication tokens updated successfully.
-
给用户加锁,会给出提示信息
[root@localhost opt]# passwd -l test2 Locking password for user test2. passwd: Success [root@localhost opt]# passwd -S test2 test2 LK 2024-03-25 0 99999 7 -1 (Password locked.)
-
给用户减锁
[root@localhost opt]# passwd -u test2 Unlocking password for user test2. passwd: Success [root@localhost opt]# passwd -S test2 test2 PS 2024-03-25 0 99999 7 -1 (Password set, SHA512 crypt.)
-
下次登陆强制修改密码
[root@localhost opt]# passwd -e test2 Expiring password for user test2. passwd: Success
-
显示密码信息
[root@localhost opt]# passwd -S test2 test2 PS 2024-03-25 0 99999 7 -1 (Password set, SHA512 crypt.) [root@localhost opt]# usermod -L test2 [root@localhost opt]# passwd -S test2 test2 LK 2024-03-25 0 99999 7 -1 (Password locked.)
6、chage命令
针对已经创建的用户进行修改
-
chage命令用于密码实效管理,该是用来修改帐号和密码的有效期限。它可以修改账号和密码的有效期
-
option
-
-d: 指定密码最后修改日期
-
-M:密码保持有效的最大天数。
[root@localhost opt]# chage -M 60 test3 [root@localhost opt]# chage -l test3 Last password change : Mar 26, 2024 Password expires : May 25, 2024 Password inactive : never Account expires : never Minimum number of days between password change : 0 Maximum number of days between password change : 60 Number of days of warning before password expires : 7
-
-W:密码过期前,提前收到警告信息的天数。
-
-m:密码可以更改的最小天数。为零代表任何时候都可以更改密码。
-
-l:列出用户以及密码的有效期
[root@localhost opt]# chage -l test3 Last password change : Mar 26, 2024 Password expires : never Password inactive : never Account expires : never Minimum number of days between password change : 0 Maximum number of days between password change : 99999 Number of days of warning before password expires : 7
-
7、groupadd创建组
groupadd groupname
-g 创建组是指定GID
8、groupmod修改组
-g 修改GID
-n 修改组名
9、gpasswd组管理
- 可以将用户添加到组或者从组中删除
- -a 将用户添加到工作组,需要重启或者注销后才可以实现
- -d 将用户从组中删除
【4】、用户登陆分析
1、whoami
-
打印当前UID的名字
[root@bogon ~]# whoami root
2、who
-
查看用户登录的终端信息,pts/0表示ssh远程终端,tty表示虚拟终端
[root@bogon ~]# who root pts/0 2023-12-07 16:43 (192.168.121.1) root :0 2023-12-07 16:47 (:0)
3、w
-
表示当前用户的负载信息
[root@bogon ~]# w 16:53:46 up 12 min, 2 users, load average: 0.00, 0.09, 0.08 USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT root pts/0 192.168.121.1 16:43 2.00s 0.18s 0.04s w root :0 :0 16:47 ?xdm? 1:05 0.66s /usr/libexec/gnome-session-binary
【5】、/etc/login.defs文件
针对后续创建的用户进行的操作
MAIL_DIR /var/spool/mail #他决定了用户创建时要创建一个邮件
16 #MAIL_FILE .mail
17
18 # Default initial "umask" value used by login(1) on non-PAM enabled systems.
19 # Default "umask" value for pam_umask(8) on PAM enabled systems.
20 # UMASK is also used by useradd(8) and newusers(8) to set the mode for new
21 # home directories if HOME_MODE is not set.
22 # 022 is the default value, but 027, or even 077, could be considered
23 # for increased privacy. There is no One True Answer here: each sysadmin
24 # must make up their mind.
25 UMASK 022 #权限掩码
26
27 # HOME_MODE is used by useradd(8) and newusers(8) to set the mode for new
28 # home directories.
29 # If HOME_MODE is not set, the value of UMASK is used to create the mode.
30 HOME_MODE 0700
31
32 # Password aging controls:
33 #
34 # PASS_MAX_DAYS Maximum number of days a password may be used.
35 # PASS_MIN_DAYS Minimum number of days allowed between password changes.
36 # PASS_MIN_LEN Minimum acceptable password length.
37 # PASS_WARN_AGE Number of days warning given before a password expires.
38 #
39 PASS_MAX_DAYS 99999 ##设置创建的用户的密码策略
40 PASS_MIN_DAYS 0
41 PASS_MIN_LEN 5
42 PASS_WARN_AGE 7
47 UID_MIN 1000
48 UID_MAX 60000
49 # System accounts
50 SYS_UID_MIN 201 ##系统UID的范围
51 SYS_UID_MAX 999
52
53 #
54 # Min/max values for automatic gid selection in groupadd
55 #
56 GID_MIN 1000 #组GID范围
57 GID_MAX 60000
58 # System accounts
59 SYS_GID_MIN 201
60 SYS_GID_MAX 999
61
62 #
63 # If defined, this command is run when removing a user.
64 # It should remove any at/cron/print jobs etc. owned by
65 # the user to be removed (passed as the first argument).
66 #
67 #USERDEL_CMD /usr/sbin/userdel_local
68
69 #
70 # If useradd should create home directories for users by default
71 # On RH systems, we do. This option is overridden with the -m flag on
72 # useradd command line.
73 #
74 CREATE_HOME yes # 创建用户时是否创建家目录
75
76 # This enables userdel to remove user groups if no members exist.
77 #
78 USERGROUPS_ENAB yes #创建用户时,是否自动生成一个同名的组
79
80 # Use SHA512 to encrypt password.
81 ENCRYPT_METHOD SHA512 #加密方式
【6】、用户环境变量
-
每一个用户都有自己的变量和环境变量,在用户登录和用户切换的时候对应用户的环境变量也会跟着一起加载
-
在切换用户时有两个命令su和su -,这两个命令的区别就是su命令不能完全切换要登录的用户,su - 命令可以完全切换对应用户的变量
-
su
[root@bogon ~]# su linus [linus@bogon root]$ env | grep root PWD=/root MAIL=/var/spool/mail/root PATH=/home/linus/.local/bin:/home/linus/bin:/usr/share/Modules/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
我们使用su切换用户之后还是可以看到切换之前的用户的信息的
-
su -
[root@bogon ~]# su - linus [linus@bogon ~]$ env | grep root [linus@bogon ~]$
我们使用su - 切换用户之后不能看到切换之前的用户的信息了
-
-
我们可以使用env命令去查看当前用户加载的变量
【7】、用户提权
让普通用户以root身份执行某些程序
-
我们可以使用su命令去切换用户执行命令
-
也可以在普通用户下使用sudo去进行提权,但是对应的用户必须是在/etc/sudoers文件中配置过的用户,或者是有配置了附加组的用户。
-
通过修改/etc/sudoers去设置什么用户可以进行提权操作,用户可以提权哪些命令,也可以设置可以提权的组
在修改/etc/sudoers,一般不去使用vim命令,而是使用visudo,去专门编辑/etc/sudoers文件
99 ## Allow root to run any commands anywhere 100 root ALL=(ALL) NOPASSWD: ALL #最后一个ALL对应着可以提权操作的命令 101 # NOPASSWD表示不需要密码, 102 ## Allows members of the 'sys' group to run networking, software, 103 ## service management apps and more. 104 # %sys ALL = NETWORKING, SOFTWARE, SERVICES, STORAGE, DELEGATING, PROCESSES, LOCATE, DRIVERS 105 106 ## Allows people in group wheel to run all commands 107 %wheel ALL=(ALL) ALL #如果要设置组,需要在组前加%
-
【8】、用户组管理员
用户组管理员,专门用来管理用户组的
组管理员可以属于这个组,也可以不属于这个组
一个用户可以是多个组的组管理员
一个组可以有多个管理员
管理员只可以将用户添加到他所管理的组中,就可以不需要通过root用户完成了,而不能做删除操作
设置组管理员:gpasswd -A
查看组管理员:/etc/gshadow
gpasswd -A a4 team4
gpasswd -A a4 team3
# 可以给一个组设置多个管理员
gpasswd -A "a3,a4" team3
# 当我们想要将一个组中的管理员删除时
gpasswd -A "" team3
【9】、修复用户家目录
当我们不小心将用户的家目录删除后,我们可以进行修复
在用户家目录中,并不是什么文件都没有,而是存在一些隐藏文件
/etc/skel/目录称为用户的模板目录,当我们创建的任意一个用户,都会从/etc/skel/目录下复制一份数据到用户家目录中
解决方式:
方式一:可以将其他用户的家目录复制过来(不推荐,因为其他用户的家目录中可能存在许多干扰文件)
方式二:从/etc/skel目录中复制一份过来(推荐)
上面的两个方式都是为了去得到用户家目录中存在的隐藏文件,使被删除的用户家目录重新出现,但是,此时的用户家目录普通用户还不能使用,由于我们是通过root去复制的,因此在复制完成后家目录虽然已经创建出来了,但是其中的文件属组和属主都是root,普通用户不能去访问,因此最后一步是修改属主和属组
{24-05-31 16:20}locahost:~ root# useradd xu
{24-05-31 16:20}locahost:~ root#
{24-05-31 16:20}locahost:~ root# rm -rf /home/xu
{24-05-31 16:21}locahost:~ root# ls /home
a1
{24-05-31 16:21}locahost:~ root# cp -r /etc/skel /home/xu
{24-05-31 16:21}locahost:~ root# ls /home
a1 xu
{24-05-31 16:21}locahost:~ root# cd /home/xu
{24-05-31 16:21}locahost:/home/xu root# ls -la
total 16
drwxr-xr-x. 2 root root 76 May 31 16:21 .
drwxr-xr-x. 4 root root 26 May 31 16:21 ..
-rw-r--r--. 1 root root 18 May 31 16:21 .bash_logout
-rw-r--r--. 1 root root 141 May 31 16:21 .bash_profile
-rw-r--r--. 1 root root 376 May 31 16:21 .bashrc
-rw-r--r--. 1 root root 658 May 31 16:21 .zshrc
{24-05-31 16:21}locahost:/home/xu root# chown -R xu:xu /home/xu
标签:test2,用户组,系统,用户,etc,Linux,home,root,localhost
From: https://www.cnblogs.com/xuruizhao/p/18277029