主要内容
账号管理
用户和组
如今的操作系统都是多用户操作系统,允许同时被多个用户访问和使用操作系统上面的资源。用户类型有系统用户和普通用户,而组也有系统组和普通组的分别。不同用户的权限可以不同,在unix-like的系统中,root用户拥有最高权限;组用于把具有相同权限的用户划分到一起,以便分配系统资源和管理它们的权限。
用户ID和组ID
通常我们都是通过用户名和密码登录系统,但实际上,unix-like操作系统并不使用用户名识别一个用户,而是通过一个数字ID来区分,组也一样。
通过id命令,可以查看用户的id和用户所在组的id。假如有用户名normal,使用id命令查看这个用户的id和组id:
1 2 |
[normal@study ~]$ id normal #不带参数的id命令显示当前用户的信息 uid=1000(normal) gid=1000(normal) groups=1000(normal),10(wheel) |
uid:即是用户id,normal用户的id是1000
gid:即用户所属组的id,normal组的id同样是1000
实际上,当一个用户被新创建的时候,系统会自动创建一个同名的组,并把该用户划分到这个组下面。
unix-like操作系统的用户id从0开始,现代操作系统内核可以支持最大的uid达到2^32-1;前面说过,root用户拥有最高权限,因此,uid 0(零) 被root拥有。而我们创建的普通用户uid为1000,那是不是系统中已经存在999个用户了?答案是:否。除了0外,1~999实际上是一个保留段位,这些数字留给系统的一些特殊用户(一般不用登陆的用户)使用,例如运行一些服务的用户:apache、nginx、mysql等。虽然0被root占有,但是并不是说只有root可以使用0这个数字,只要你希望一个用户具有root权限,就可以把这个用户的id设置为0,但一般不建议这样做。
类似地,用户id和组id是同时存在的,因此, 组id也存在这样的情况。
结论:普通用户的id和组id都是从1000开始,root账户的用户id和组id都是0。0~1000则被系统保留。
相关配置文件
操作系统把用户信息和组的信息分别保存到不同的文件中。用户信息保存在/etc/passwd和/etc/shadow中,而组信息则保存在/etc/group文件中。
passwd配置文件
使用normal用户的资料为例子,下面是passwd文件的一些内容
1 |
normal:x:1000:1000:normal:/home/normal:/bin/bash |
passwd文件以行为单位保存用户资料,每一行有7列,使用(:)冒号分隔,它们分别代表:
- 用户名: 用户登录系统是所使用的名称
- 密码: 用户密码,一般使用星号*或者x表示,作用只是一个占位符
- 用户id: 用户的唯一id
- 组id: 用户所在组的id
- 账户描述: 这一列是可选的,作为账户的一些描述性信息存在
- 用户目录: 用户的家目录,默认是/home/用户名
- shell: 用户的登陆shell,如果在tty登录,则指定tty使用的shell,如果使用gui登陆,则用于指定终端shell
历史上,加密过的用户密码也是保存在passwd文件中的,即第二列。由于这个文件是任何人都是可读的,安全得不到保证,因此,现在密码被转存到/etc/shadow文件中。
shadow配置文件
shadow主要是保存用户的密码,以及一些对密码的相关限制。shadow也是以行为单位,通过冒号分割每一列,共9列, 包括:
- 用户名: 和passwd中的用户名对应
- 密码: 加密过的密码,真正的密码保存于此
- 上次修改密码的日期:密码最近被更改的日期。0表示下次用户登录的时候必须更改密码。
- 密码最短使用周期: 用户在这个时间内不得更改密码
- 密码最长使用周期: 过了这个时间后用户必须更改密码
- 密码过期前警告时间:密码过期前多少天给用户发出警告
- 密码失效缓冲期: 密码过期后缓冲期内,用户依旧可以使用旧密码登录,但登录后必须马上修改密码
- 账号失效时间: 过了这个时间,账号不可登录系统,0表示永不过期。
- 保留字段: 第九个字段是一个保留字段,现在暂时没用
passwd命令和chage命令
passwd命令除了可以用来修改密码外,它还可以用来修改shadow文件中指定的列。chage命令的作用也有类似的作用。一般来说,不建议直接对passwd文件和shadow文件进行修改,如果坚持这样做,请使用vipw命令。更建议的做法是,通过passwd命令或者chage命令。
group配置文件
group文件用于定义系统上的组,以及组成员,每个组一行,共4列,每列用冒号分隔,group文件格式如下
- 组名称:组密码:组id:组成员列表
其中组成员列表中可以有多个成员,每个成员之间使用逗号分隔。密码和组成员字段可空。典型的group配置文件如下:
1 2 3 4 5 6 7 8 9 10 11 |
[normal@study ~]$ tail -10 /etc/group avahi:x:70: slocate:x:21: postdrop:x:90: postfix:x:89: ntp:x:38: tcpdump:x:72: normal:x:1000:normal redis:x:984: mysql:x:27: nginx:x:983: |
有效用户组和初始用户组
一个用户可以加入到多个组中,这就涉及到有效用户组和初始用户组的概念。前面说过,当用户账号创建的同时,系统会自动把账号加入到同名的组下面,这个同名的组就是初始用户组;而有效用户组影响的行为主要是:用户创建一个文件的时候,这个文件所属的组是谁。
例如:
1 2 |
[normal@study ~]$ touch test; ls -l test #创建文件test并显示test的信息 -rw-rw-r--. 1 normal normal 0 Jan 4 09:45 test |
可以看到,test文件所属的用户和组都是normal,即normal用户当前的有效用户组是normal。
查看有效用户组
当然,我们并不需要通过创建文件的方式来查看有效用户组,使用groups命令即可;groups命令可以列出当前用户所属的所有组,排在第一个的就是有效用户组
1 2 |
[normal@study ~]$ groups normal wheel |
有效用户组的切换
有时候,我们需要切换有效用户组,使用newgrp命令即可。
1 2 3 |
[normal@study ~]$ newgrp wheel #切换有效用户组 [normal@study ~]$ touch test2; ls -l test2 #创建测试文件 -rw-r--r--. 1 normal wheel 0 Jan 4 09:52 test2 |
当切换有效用户组后,新创建的文件现在属于wheel组。使用newgrp命令有一些小问题要注意:newgrp命令运行在一个新的shell环境下面,没有(-)横杠选项的newgrp命令保留父shell中的环境变量和当前工作目录。有横杠的newgrp命令会把环境变量切换到组的环境中。
组管理员
一般情况下,组只能被root用户或具有root权限的用户管理,但是,为了方便管理,root用户可以通过特定的方式放权出去,使一般用户也拥有管理组的权限。
gshadow配置文件和gpasswd命令
/etc/gshadow文件的格式如下:
- 组名称:密码:组管理员:成员列表
如果第三列为空,则证明该组没有组管理员;gpasswd命令不仅可以用于设置组密码,还可以添加组管理员,一个组可以有多个管理员。
1 2 3 4 5 6 7 |
[root@study normal]# gpasswd normal #设置组normal的密码 Changing the password for group normal New Password: Re-enter new password: [root@study normal]# gpasswd -A jack normal #把用户jack设置为normal组的管理员 [root@study normal]# grep normal /etc/gshadow normal:$6$8KYtJ/qytu$Q2h1Z.Vs3dtSwma5fqAP1Lq38iCruWLzl9MHy.mj6ZATDbePWWd29USdIyKqRmp4R93NpAyz3rxz4u.dRMy93.:jack:normal |
如果有多个组管理员需要添加,-A参数后面使用逗号隔开多个用户即可,例如:-A jack,tom
。
gpasswd命令也可以把多个用户添加进这个组,通过-M参数即可。
用户和组管理
虽然可以以直接编辑配置文件的方式管理用户和组,但是一般不建议这样做,系统提供了一系列的命令给我们进行这些操作,它们是:useradd、usermod、userdel和groupadd、groupmod、groupdel。
用户管理
添加用户
使用useradd命令添加用户
1 2 3 |
[root@study normal]# useradd kate #添加用户kate [root@study normal]# id kate #显示kate的信息 uid=1002(kate) gid=1002(kate) groups=1002(kate) |
不带参数的useradd命令做了下面的事情
- 设置用户id
- 设置组id
- 创建用户家目录
如果不希望使用默认的值,可以为useradd命令添加一些参数
1 2 3 4 5 6 7 8 9 |
[root@study normal]# useradd -u 9999 -g normal kate [root@study normal]# id kate uid=9999(kate) gid=1000(normal) groups=1000(normal) [root@study normal]# passwd kate #设置用户的密码 Changing password for user kate. New password: BAD PASSWORD: The password is shorter than 8 characters Retype new password: passwd: all authentication tokens updated successfully. |
-u参数用于指定用户的uid,而-g参数则是设置用户的所属组。
实际上,useradd命令有一些默认的设置,使用useradd -D命令可以查看这些设置,其实,它们保存在/etc/default/useradd文件中:
1 2 3 4 5 6 7 8 9 |
[root@study normal]# cat /etc/default/useradd # useradd defaults file GROUP=100 #centos不使用这个值,因为centos使用的是私有群组的概念 HOME=/home INACTIVE=-1 EXPIRE= SHELL=/bin/bash SKEL=/etc/skel #初始用户的家目录的默认结构 CREATE_MAIL_SPOOL=yes |
关于私有群组和公共群组:
- 私有群组机制:忽略GROUP=100,只有用户自己能进入自己的主文件夹 ,因此权限是700
- 公共群组机制:使用GROUP=100 这个设置值作为新建账号群组,因此每个账号都属于users,默认主文件夹大家都可以访问
删除用户
不带额外参数的userdel命令只删除用户账号本身,用户的家目录和邮件目录中的文件不会被删除。
1 2 |
userdel kate #只删除用户账号 userdel -r kate #连同用户家目录和邮件目录一起删除 |
如果希望删除该用户在其他地方的文件,需要手动搜索并删除。
修改用户
usermod的一些常用参数如下:
-d, –home 修改用户的家目录名称
-e, –expiredate 设置用户账号的过期时间
-a, –append 把用户添加到其他组(不从原来的组中移除)
-l, –login 修改用户的登录名称
-L, –lock 锁定账号的密码
-m, –move-home 和-d参数一起使用,把用户的家目录移到新的目录中
-p, –password 修改用户的密码
-s, –shell 修改用户的登录shell
-u, –uid UID 设置用户的uid
-U, –unlock 取消账号的锁定
1 2 3 |
#将用户kate的登录名称改为newkate #即修改/etc/passwd文件的第一列 [root@study ~]# usermod -l newkate kate |
组管理
新建组
和useradd一样,groupadd也可以不带参数,使用默认的方式处理新建的组
1 2 |
[root@study ~]# groupadd testgrp #使用默认组id [root@study ~]# groupadd -g 9999 testgrp #使用自定义的组id |
删除组
相对于其他命令,groupdel的使用非常简单,只需要指定要删除的组名即可。
1 |
[root@study ~]# groupdel testgrp |
修改组
groupmod命令的参数和groupadd的参数非常接近,因为groupmod只是对组的一些微调。常见参数如下:
-g, –gid 修改组的gid
-n, –new-name 修改组的名称
1 2 |
#把testgrp组的名称更改为testgrp2 [root@study ~]# groupmod -n testgrp2 testgrp |
查看组成员
如果希望查看组里面有什么成员,可以使用groupmems命令。例如,查看wheel里面的成员:
1 |
groupmems -g wheel -l |
转载请注明:Pure nonsense » Linux用户管理和组管理