Linux用户管理和组管理

Linux ginotang 669℃ 0评论

账号管理

用户和组

如今的操作系统都是多用户操作系统,允许同时被多个用户访问和使用操作系统上面的资源。用户类型有系统用户和普通用户,而组也有系统组和普通组的分别。不同用户的权限可以不同,在unix-like的系统中,root用户拥有最高权限;组用于把具有相同权限的用户划分到一起,以便分配系统资源和管理它们的权限。

用户ID和组ID

通常我们都是通过用户名和密码登录系统,但实际上,unix-like操作系统并不使用用户名识别一个用户,而是通过一个数字ID来区分,组也一样。

通过id命令,可以查看用户的id和用户所在组的id。假如有用户名normal,使用id命令查看这个用户的id和组id:

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文件的一些内容

passwd文件以行为单位保存用户资料,每一行有7列,使用(:)冒号分隔,它们分别代表:

  1. 用户名:      用户登录系统是所使用的名称
  2. 密码:          用户密码,一般使用星号*或者x表示,作用只是一个占位符
  3. 用户id:      用户的唯一id
  4. 组id:          用户所在组的id
  5. 账户描述: 这一列是可选的,作为账户的一些描述性信息存在
  6. 用户目录: 用户的家目录,默认是/home/用户名
  7. shell:         用户的登陆shell,如果在tty登录,则指定tty使用的shell,如果使用gui登陆,则用于指定终端shell

历史上,加密过的用户密码也是保存在passwd文件中的,即第二列。由于这个文件是任何人都是可读的,安全得不到保证,因此,现在密码被转存到/etc/shadow文件中。

shadow配置文件

shadow主要是保存用户的密码,以及一些对密码的相关限制。shadow也是以行为单位,通过冒号分割每一列,共9列, 包括:

  1. 用户名:                          和passwd中的用户名对应
  2. 密码:                             加密过的密码,真正的密码保存于此
  3. 上次修改密码的日期:密码最近被更改的日期。0表示下次用户登录的时候必须更改密码。
  4. 密码最短使用周期:    用户在这个时间内不得更改密码
  5. 密码最长使用周期:    过了这个时间后用户必须更改密码
  6. 密码过期前警告时间:密码过期前多少天给用户发出警告
  7. 密码失效缓冲期:        密码过期后缓冲期内,用户依旧可以使用旧密码登录,但登录后必须马上修改密码
  8. 账号失效时间:            过了这个时间,账号不可登录系统,0表示永不过期。
  9. 保留字段:                    第九个字段是一个保留字段,现在暂时没用

passwd命令和chage命令

passwd命令除了可以用来修改密码外,它还可以用来修改shadow文件中指定的列。chage命令的作用也有类似的作用。一般来说,不建议直接对passwd文件和shadow文件进行修改,如果坚持这样做,请使用vipw命令。更建议的做法是,通过passwd命令或者chage命令。

group配置文件

group文件用于定义系统上的组,以及组成员,每个组一行,共4列,每列用冒号分隔,group文件格式如下

  • 组名称:组密码:组id:组成员列表

其中组成员列表中可以有多个成员,每个成员之间使用逗号分隔。密码和组成员字段可空。典型的group配置文件如下:

有效用户组和初始用户组

一个用户可以加入到多个组中,这就涉及到有效用户组和初始用户组的概念。前面说过,当用户账号创建的同时,系统会自动把账号加入到同名的组下面,这个同名的组就是初始用户组;而有效用户组影响的行为主要是:用户创建一个文件的时候,这个文件所属的组是谁。

例如:

可以看到,test文件所属的用户和组都是normal,即normal用户当前的有效用户组是normal。

查看有效用户组

当然,我们并不需要通过创建文件的方式来查看有效用户组,使用groups命令即可;groups命令可以列出当前用户所属的所有组,排在第一个的就是有效用户组

有效用户组的切换

有时候,我们需要切换有效用户组,使用newgrp命令即可。

当切换有效用户组后,新创建的文件现在属于wheel组。使用newgrp命令有一些小问题要注意:newgrp命令运行在一个新的shell环境下面,没有(-)横杠选项的newgrp命令保留父shell中的环境变量和当前工作目录。有横杠的newgrp命令会把环境变量切换到组的环境中。

组管理员

一般情况下,组只能被root用户或具有root权限的用户管理,但是,为了方便管理,root用户可以通过特定的方式放权出去,使一般用户也拥有管理组的权限。

gshadow配置文件和gpasswd命令

/etc/gshadow文件的格式如下:

  • 组名称:密码:组管理员:成员列表

如果第三列为空,则证明该组没有组管理员;gpasswd命令不仅可以用于设置组密码,还可以添加组管理员,一个组可以有多个管理员。

如果有多个组管理员需要添加,-A参数后面使用逗号隔开多个用户即可,例如:-A jack,tom

gpasswd命令也可以把多个用户添加进这个组,通过-M参数即可。

用户和组管理

虽然可以以直接编辑配置文件的方式管理用户和组,但是一般不建议这样做,系统提供了一系列的命令给我们进行这些操作,它们是:useradd、usermod、userdel和groupadd、groupmod、groupdel。

用户管理

添加用户

使用useradd命令添加用户

不带参数的useradd命令做了下面的事情

  1. 设置用户id
  2. 设置组id
  3. 创建用户家目录

如果不希望使用默认的值,可以为useradd命令添加一些参数

-u参数用于指定用户的uid,而-g参数则是设置用户的所属组。

实际上,useradd命令有一些默认的设置,使用useradd -D命令可以查看这些设置,其实,它们保存在/etc/default/useradd文件中:

关于私有群组和公共群组:

  • 私有群组机制:忽略GROUP=100,只有用户自己能进入自己的主文件夹 ,因此权限是700
  • 公共群组机制:使用GROUP=100 这个设置值作为新建账号群组,因此每个账号都属于users,默认主文件夹大家都可以访问

删除用户

不带额外参数的userdel命令只删除用户账号本身,用户的家目录和邮件目录中的文件不会被删除。

如果希望删除该用户在其他地方的文件,需要手动搜索并删除。

修改用户

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             取消账号的锁定

组管理

新建组

和useradd一样,groupadd也可以不带参数,使用默认的方式处理新建的组

删除组

相对于其他命令,groupdel的使用非常简单,只需要指定要删除的组名即可。

修改组

groupmod命令的参数和groupadd的参数非常接近,因为groupmod只是对组的一些微调。常见参数如下:

-g, –gid    修改组的gid
-n, –new-name   修改组的名称

查看组成员

如果希望查看组里面有什么成员,可以使用groupmems命令。例如,查看wheel里面的成员:

 

转载请注明:Pure nonsense » Linux用户管理和组管理

喜欢 (0)
0 0 投票数
文章评分
订阅评论
提醒
guest
0 评论
内联反馈
查看所有评论
0
希望看到您的想法,请您发表评论x
()
x