Linux中用户与用户组

一、用户介绍

  1. 什么是用户
    用户对硬件资源的操作都需要通过操作系统,⽐如⽤户要读取硬盘中的⼀份关键数据,出于安全考虑,操作系统的开发者们都专⻔开发了安全机制,要使⽤操作系统必须事先输⼊正确的⽤户名与密码, 这便是⽤户的由来。能够正常登录系统的都称作为用户。

  2. 为何要有用户?
    主要就是权限问题。用户就是权限的化身,每个用户都有特定的权限,为了划分权限,增加安全性

    • 系统上的每⼀个进程,都需要⼀个特定的⽤户运⾏,⼀个⽤户拥有特定的权限,该⽤户运⾏的进程与⽤户权限⼀致
      进程===》用户====》权限(作用在文件身上)
    • 通常在公司是使⽤普通⽤户管理服务器,因为root权限过⼤,容易出问题
    • 每启动一个进程都会与一个用户关联
  3. 如何查看用户信息

    [root@localhost ~]# id # 查看当前用户
    uid=0(root) gid=0(root) groups=0(root) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
    
    [root@localhost ~]# whoami # 查看当前用户是谁
    root
    
    [root@localhost ~]# who  # 查看所有登录用户的信息
    root     tty1         2021-06-30 08:09
    root     pts/0        2021-06-30 23:33 (192.168.138.10)
    
  4. Linux系统中用户的角色划分
    在Linux系统中用户分为管理员用户与其他用户,管理员用户拥有最高权限,其他用户根据管理员的分配具有不同权限。
    对于Linux系统来说,用户的角色是通过UID和GID识别的,用户系统账号的名称如(bertwu),是给人(管理员看的),Linux系统识别的仅仅是UID和GID这样的数字。

  5. UID(User Identify)
    用户ID,唯一标识一个系统用户的账号,uid 在系统内是唯一的, uid相当于人的身份证号,用户名就相当于这个人的名字。

  6. GID(Group Identify)
    组ID,如果把操作系统当做一家公司,UID为这个人的员工号,GID为部门号。

centos7系统之前约定
uid: 0   由超级用户或具备超级用户权限的用户创建的用户(贫民老百姓,大臣,布衣/bin/bash)         
uid: 1~499  系统虚拟用户:UID范围1-499,存在满足文件或服务启动的需要。一般不能登录,只是傀儡
uid: 500-65535  普通用户
​
centos7系统约定:
0       超级管理员,最高权限,有着极强的破坏能力
1~200   系统用户,用来运行系统自带的进程,默认已创建
201~999 系统用户,用来运行安装的程序,所以此类用户无需登录系统
1000+   普通用户,正常可以登录系统的用户,权限比较小,能执行的任务有限


ps: 用户和组的关系:
一对一,多对一,一对多,多对多
一个用户可以属于一个组,用户默认就在自己的主组下
一个用户可以属于多个组,主组只有一个,但是可以为用户添加多个附加组
  1. 超级用户
    默认是root用户,其UID和GID均为0。root用户在每台unix/linux操作系统中都是唯一且真实存在的,通过它可以登录系统,可以操作系统中任何文件和命令,拥有最高的管理权限。

    举个例子:
    • 操作系统=》一个国家
    • root用户=》国王
    • root用户的家目录=》皇宫

需要注意的是:

  • 1、在生产环境中,一般会禁止root帐号通过SSH远程连接服务器(保护好皇帝),当然了,也会更改默认的SSH端口(保护好皇宫),以加强系统安全。
  • 2、企业工作中:没有特殊需求,应该尽量不要登录root用户进行操作,应该在普通用户下操作任务,然后用sudo管理普通用户的权限,可以细到每个命令权限分配。
  • 3、在linux系统中,uid为0的用户就是超级用户。但是通常不这么做,如果确实有必要在某一操作上用到管理的权限的话,那就用sudo单独授权,也不要直接用uid为0的用户。
  1. 扩展阅读
# Linux/Unix是一个多用户、多任务的操作系统
# windows是一个单用户多任务操作系统
​
多用户不是说可以创建多个用户,而是指一次可以登录多个用户
多任务指的是可以并发执行多个进程
​
linux发展史:
multics-》unix-》linux,所以linux是多用户的,天然支持多个连机终端,连机终端在没有互联网的情况下是有意义的,
多个人可以用不同的连机终端连到一台机器/服务器上使用,而有了互联网之后,
多个人可通过网络访问服务器,这个时候多用户or单用户的概念就不再那么重要

二、用户与组的相关文件

创建用户后默认会修改如下文件

/etc/passwd
/etc/shadow
/etc/group
/etc/gshadow
  1. /etc/passwd
[root@localhost tmp]# head -1 /etc/passwd  # 查看/etc/passwd 文件的第一行内容
root:x:0:0:root:/root:/bin/bash

Linux中用户与用户组
解释:

以:分割,分为七列。
root:x:0:0:root:/root:/bin/bash                        
第一字段:用户名(也被称为登录名);
第二字段:密码占位符;在例子中我们看到的是一个x,其实密码已被映射到/etc/shadow 文件中;
第三字段:UID ;请参看本文的UID的解说;
第四字段:GID;请参看本文的GID的解说;
第五字段:描述信息,可选
第六字段:用户的家目录所在位置;
第七字段:用户所用SHELL的类型
  1. /etc/shadow
[root@localhost tmp]# head -1 /etc/shadow # 查看/etc/shadow 文件的第一行内容
root:$6$oNadXTBd$c1Wb4b/MPqw87bp/NM1WyAEAOCQztvuUf5eNsgFbcirqrOxb95391R5a1nEQs5hWjkojgDGdH90Vo2YSFeQqO.:18809:0:99999:7:::

Linux中用户与用户组
解释: 以:分割,分割成9列

第一字段:用户名(也被称为登录名),在/etc/shadow中,用户名和/etc/passwd 是相同的,
这样就把passwd 和shadow中用的用户记录联系在一起;这个字段是非空的;​

第二字段:密码(已被加密),如果是有些用户在这段是x,表示这个用户不能登录到系统;
这个字段是非空的;!!表示没有密码​

第三字段:上次修改口令的时间;这个时间是从1970年01月01日算起到最近一次修改口令的时间间隔(天数),
您可以通过passwd 来修改用户的密码,然后查看/etc/shadow中此字段的变化;​

第四字段:两次修改口令间隔最少的天数;如果设置为0,则禁用此功能;也就是说用户必须经过
多少天才能修改其口令;此项功能用处不是太大;默认值是通过/etc/login.defs文件定义中获取,
PASS_MIN_DAYS 中有定义;​

第五字段:两次修改口令间隔最多的天数;这个能增强管理员管理用户口令的时效性,
应该说在增强了系统的安全性;如果是系统默认值,是在添加用户时由/etc/login.defs文件定义中获取,在PASS_MAX_DAYS 中定义;​

第六字段:提前多少天警告用户口令将过期;当用户登录系统后,系统登录程序提醒用户口令将要作废;
如果是系统默认值,是在添加用户时由/etc/login.defs文件定义中获取,在PASS_WARN_AGE 中定义;
​
第七字段:在口令过期之后多少天禁用此用户;此字段表示用户口令作废多少天后,系统会禁用此用户,
也就是说系统会不能再让此用户登录,也不会提示用户过期,是完全禁用;​

第八字段:用户过期日期;此字段指定了用户作废的天数(从1970年的1月1日开始的天数),
如果这个字段的值为空,帐号永久可用; www.hackdig.com​

第九字段:保留字段,目前为空,以备将来Linux发展之用;​
如果更为详细的,请用 man shadow来查看帮助,您会得到更为详尽的资料;
  1. /etc/group 组文件
[root@localhost tmp]# ​​​​​​​​​head -1 /etc/group
root:x:0:

解释: 以为分隔符,分成四列
Linux中用户与用户组
4、/etc/gshadow 组密码文件

[root@10-23-117-188 ~]# head -1 /etc/gshadow
root:::

解释: 以为分隔符,分成四列
Linux中用户与用户组
创建用户时,还会默认创建如下

/etc/skel/    # 用户老家的模板,会将此处的.bash开头的文件拷贝到自己的家目录里
/home/xxx     # 用户家目录
/var/spool/mail/xxx   # 用户邮箱文件

三、用户管理命令

useradd  # 添加用户
usermod  # 修改用户
userdel  # 删除用户

1.添加用户, 用root用户登录即可添加,普通用户没有此权限

选项 功能描述
-u 指定要创建用户的UID,不允许冲突
-g 指定要创建用户的基本组
-G 指定要创建用户附加组,逗号隔开可添加多个附加组
-d 指定要创建用户的家目录路径
-s 指定创建用户的bash shell
-c 指定要创建用户的注释信息
-M 创建用户不创建家目录
-r 创建系统账户,默认无家目录
-e 修改过期时间

1.1.1 示例
创建tom用户,uid为6666,基本组为ops,附加组为dev,注释信息 good man 登录shell /bin/bash

[root@localhost ~]# groupadd ops  # 先创建两个组ops和dev
[root@localhost ~]# groupadd dev
[root@localhost ~]# useradd tom -u 6666 -g ops -G dev -c "good man" -s /bin/shell
[root@localhost ~]# id tom   # 查看tom用户
uid=6666(tom) gid=1000(ops) groups=1000(ops),1001(dev)
[root@localhost ~]# tail -1 /etc/passwd   # 分别查看如下文件
tom:x:6666:1000:good man:/home/tom:/bin/shell
[root@localhost ~]# tail -1 /etc/group
dev:x:1001:tom
[root@localhost ~]# tail -1 /etc/shadow
tom:!!:18829:0:99999:7:::
[root@localhost ~]# tail -1 /etc/gshadow
dev:!::tom
[root@localhost ~]# 

1.1.2 创建 mysql系统用户[201-999] ,该用户不需要家目录,该用户不需要登录系统

[root@localhost ~]# useradd -r mysql -M -s /sbin/nologin
[root@localhost ~]# id mysql
uid=998(mysql) gid=995(mysql) groups=995(mysql)
[root@localhost ~]# 

2.修改用户usermod

若想要修改 Linux 系统普通用户,可以使用 usermod 命令,使用 root 账号登录 Linux 系统之后就可以修改系统普通用户了
Linux中用户与用户组
-G -a 表示添加附加组,不覆盖原来的组

2.1.1 修改tom用户UID为5000,基本组为network,附加组为ops,dev, sa, 注释为student ,用户名为 tom123


[root@localhost ~]# usermod tom -u 5000 -g network -aG ops,sa -l tom123 -c student # -a表示在先前的附加组后继续添加,否则会覆盖原先附加组
[root@localhost ~]# id tom123
uid=5000(tom123) gid=1002(network) groups=1002(network),1000(ops),1001(dev),1003(sa)
[root@localhost bob]# 

3. 删除用户 userdel

若想要删除 Linux 系统普通用户,可以使用 userdel 命令,使用 root 账号登录 Linux 系统之后就可以删除系统普通用户了
例3.1 删除tom123用户,连同家目录和邮箱一起删掉

[root@localhost ~]# userdel -r tom123

[root@localhost ~]# 

例3.2 批量删除系统中此前创建过的所有无用的用户(例如uid>=1000)
先写脚本模拟创建100个用户

#!/bin/bash
for i in {1..100}
do
	useradd tom_$i
	echo "tom_$i is created ok!"
done

1.找出uid>=1000
[root@localhost ~]# awk -F: '$3>=1000' /etc/passwd

2.提取出用户名
[root@localhost ~]# awk -F: '$3>=1000' /etc/passwd | awk -F: '{print $1}'
或者
[root@localhost ~]# awk -F: '$3>=1000{print $1}' /etc/passwd
3.拼接命令
[root@localhost ~]# awk -F: '$3>=1000' /etc/passwd | awk -F: '{print $1}' | sed -r 's#(.*)#userdel -r \1#g' 
4. 删除 
[root@localhost ~]# awk -F: '$3>=1000' /etc/passwd | awk -F: '{print $1}' | sed -r 's#(.*)#userdel -r \1#g' | bash
5.查看是否删除成功
[root@localhost ~]# ls /home

4. 用户设定密码 passwd

创建用户后,如需要使用该用户进行远程登陆系统则需要为用户设定密码,设定密码使用 passwd
1.普通用户只允许变更自己的密码,无法修改其他人密码,并且密码长度必须8位字符
2.管理员用户允许修改任何人的密码,无论密码长度多长或多短。
3.普通用户不可以变更系统的状态(权限不够)
4.如果root将【软件|系统】的部分权限分配给普通用户,普通用户就可以有权限修改或变更。
推荐密码保存套件工具,支持 windows、MacOS、

  • 4.1 交互式设定密码
[root@localhost ~]# passwd        # 给当前用户修改密码
[root@localhost ~]# passwd tom    # 给tom用户修改密码
[root@localhost ~]# passwd root   # 给root用户修改密码


  • 4.2 非交互设定密码
    [root@localhost ~]# echo "123" | passwd --stdin tom # 仅限于root用户可以这样做
    非交互设定随机密码
[root@localhost ~]# yum install -y expect
[root@localhost ~]# echo $(mkpasswd -l 10 -d 2 -c 2 -C 2 -s 4) |tee pass.txt| passwd --stdin tom   # 会在当前目录下pass.txt文件里记录下密码


# 补充:可以利用系统内置变量生成随机字符串来充当密码
[root@localhost ~]# echo $RANDOM|md5sum|cut -c 1-10
70ba11a74b
[root@localhost ~]#

脚本创建用户设定随机密码

[root@localhost ~]# cat useradd_new.sh #!/bin/bash
for i in mg bob alice
do 
pass=$(mkpasswd -l 10 -d 2 -c 2 -C 2 -s 4) 
useradd $i 
echo "$pass" | passwd --stdin $i &>/dev/null
echo "User: $i Pass: $pass" 
echo "User: $i Pass: $pass" >> user_pass.txt
done

手动创建密码方式(了解)

openssl passwd 手动生成密码
引言:在Linux系统中我们要向手动生成一个密码可以采用opensll passwd来生成一个密码作为用户账号的密码。
Linux系统中的密码存放在/etc/shadow文件中,并且是以加密的方式存放的,根据加密方式的不同,所产生的加密后的密码的位数也不同。
​
openssl passwd的作用是用来计算密码hash的,目的是为了防止密码以明文的形式出现。
​
语法格式: openssl passwd [option] passwd
​
openssl passwd常用的选项如下:
​
-1:表示采用的是MD5加密算法。
​
-salt:指定salt值,不使用随机产生的salt。在使用加密算法进行加密时,即使密码一样,salt不一样,所计算出来的hash值也不一样,
除非密码一样,salt值也一样,计算出来的hash值才一样。salt为8字节的字符串。 
​
示例:
​
[tom@localhost ~]$ openssl passwd -1 -salt 'i have a dream'  ##注意'i have a dream' 不是密码而是密码的盐,注意密码的盐里不要有中文
Password:   ##这里输入的是密码 
$1$12345678$1qWiC4czIc07B4J8bPjfC0   ##这是生成的密文密码
​
​
​
##将生成的密码串,手动添加到/etc/shadow中就可用作用户的登陆密码了。

5. 创建用户的流程

useradd创建用户时,会以/etc/login.defs/etc/default/useradd两个配置文件中的配置作为参照物。如果在创建用户时指定了参数则会覆盖系统默认的配置,如果没有指定参数则遵循默认配置建立用户

  • 5.1 /etc/login.defs 主要定义了创建用户时 UID 划分规则,密码加密类型,是否创建家目录等;

[root@localhost ~]# grep -Ev "^#|^$" /etc/login.defs
MAIL_DIR /var/spool/mail
PASS_MAX_DAYS 99999        #密码最大有效期
PASS_MIN_DAYS 0            #两次修改密码的最小间隔时间
PASS_MIN_LEN 5            #密码最小长度,对于root无效
PASS_WARN_AGE 7            #密码过期前多少天开始提示
UID_MIN 1000            #用户ID的最小值
UID_MAX 60000            #用户ID的最大值
SYS_UID_MIN 201            #系统用户ID的最小值
SYS_UID_MAX 999            #系统用户ID的最大值
GID_MIN 1000            #组ID的最小值
GID_MAX 60000            #组ID的最大值
SYS_GID_MIN 201            #系统用户组ID的最小值
SYS_GID_MAX 999            #系统用户组ID的最大值
CREATE_HOME yes            #使用useradd的时候是可以创建用户家目录
UMASK 077                #创建家目录时umask的默认控制权限
USERGROUPS_ENAB yes        #删除用户的时候是否同时删除用户组
ENCRYPT_METHOD SHA512    #密码加密规则
​
  • 5.2
    /etc/default/useradd 主要定义
    1.创建家目录的位置
    2.默认用户shell类型
    3.默认从哪个位置拷贝环境变量
    4.是否创建用户同名邮箱等
[root@localhost ~]# cat /etc/default/useradd
GROUP=100                #依赖于/etc/login.defs的USERGRUUPS_ENAB参数,如果为no,则在此处控制
HOME=/home               #把用户的家目录建在/home中。
INACTIVE=-1             #是否启用账号过期停权,-1表示不启用。
EXPIRE=                 #账号终止日期,不设置表示不启用。
SHELL=/bin/bash         #新用户默认所有的shell类型。
SKEL=/etc/skel          #配置新用户家目录的默认文件存放路径。
CREATE_MAIL_SPOOL=yes   #创建mail文件。
​
​
当使用useradd创建用户时,创建的用户家目录下会存在.bash* 环境变量相关的文件,这些环境变量文件默认
从/etc/skel目录中拷贝。这个默认拷贝环境变量位置是由/etc/default/useradd配置文件中定义的。
​
​
#故障案例,在当前用户家目录下执行了rm -rf .*命令,下次登录系统时出现-bash-4.1$,如何解决!
-bash-4.1$ cp -a /etc/skel/.bash* ./
-bash-4.1$ exit
[root@egon ~]#         #重新连接即可恢复

四、用户组

1. 什么是用户组

组是一种逻辑层面的定义,逻辑上将多个用户归纳至一个组,当我们对组操作,其实就相当于对组中的所有用户进行操作。

2. 组类别

对于普通用户来说,组分为如下几类

  1. 默认组:创建用户时不指定组,则默认创建与用户同名的组;

  2. 基本组:用户有且只能有一个基本组,创建时可通过-g指定(相当于亲爹)

  3. 附加组:用户可以有多个附加组,创建时通过-G指定(相当于干爹)

  4. 组管理命令

    groupadd​ # 添加组
    groupmod​ # 修改组
    groupdel ​ #删除组
    gpasswd  # 设置组密码​
    newgrp  # 切换主组
    

3. 组操作

1.添加 groupadd

若想要添加 Linux 用户组,可以使用 groupadd 命令,使用 root 账号登录 Linux 系统之后就可以添加用户组了
Linux中用户与用户组
例1. 添加一个 salary的组 gid为10000

[root@localhost tom]# groupadd salary -g 10000
[root@localhost tom]# tail -1 /etc/group
salary:x:10000:
[root@localhost tom]# 

例2. 添加一个系统组 test

[root@localhost tom]# groupadd test -r
[root@localhost tom]# tail -1 /etc/group
test:x:994:
[root@localhost tom]# 

2.修改组groupmod

若想要修改 Linux 用户组,可以使用 groupmod 命令,使用 root 账号登录 Linux 系统之后就可以修改用户组了。
Linux中用户与用户组
例1 修改salary组组名为 salary1 GID为5050

[root@localhost tom]# groupmod salary -g 5050 -n salary1
[root@localhost tom]# tail -1 /etc/group
salary1:x:5050:
[root@localhost tom]

3. 删除groupdel

如果组中存在用户是无法删除该组,必先删除用户后在删除组

[root@localhost home]# useradd bertwu1 # 创建用户
[root@localhost home]# groupadd devops  # 创建组
[root@localhost home]# usermod -G devops bertwu1 # 指定用户所属的附加组
[root@localhost home]# id bertwu1  # 查看
uid=2002(bertwu1) gid=5556(bertwu1) groups=5556(bertwu1),5557(devops)
[root@localhost home]# groupdel devops # 附加组可以删除
[root@localhost home]# id bertwu1  # 查看用户,发现附加组的确被删除
uid=2002(bertwu1) gid=5556(bertwu1) groups=5556(bertwu1)
[root@localhost home]# groupdel bertwu1 # 无法删除bertwu1,因为bertwu1属于bertwu1 的主组
groupdel: cannot remove the primary group of user 'bertwu1'
[root@localhost home]# 

4. 组成员管理

对于用户来说,组是分类的

  1. 一类是基本组或称主组,用户只能有一个基本组,创建时可通过-g指定,如未指定则创建一个默认的组(与用户同名)
  2. 附加组,基本组不能满足授权要求,创建附加组,将用户加入该组,用户可以属于多个附加组,加入一个组后就拥有了该组的权限。
    往某一组里添加用户或删除用户 gpasswd
gpasswd -M user1,user2,user3 ,group # 给组group里添加 user0 user02 user03
usermod -a -G group01 ,group02,group03 user # 给user添加附属组 
注意:gpasswd将用户添加到组或从组中删除,只针对已存在的用户
[root@root ~]# gpasswd -a user07 it                 # 将某个用户加入到it组
[root@root ~]# gpasswd -M user02,user03,user04 it   # 将多个用户加入到it组
[root@root ~]# gpasswd -A jjj it # 指定jjj为组it的组长,除了root用户外jjj用户也可以采用第一条命令往it组里添加成员
[root@root ~]# grep 'it' /etc/group                 # 查看it组中的成员
it:x:505:user02,user03,user04
[root@root ~]# gpasswd -d user07 it                 # 删除用户usr07从it组

我们可以为组设置密码,然后让一些非组成员的用户通过命令”newgrp 组”临时切换到组内并输入密码的方式获取用户组的权限和特性

上一篇:初识markdown


下一篇:java 根据对象某个属性进行去重