Linux用户和用户组管理

前言

当你需要管理一台容纳多个用户的Linux机器时,比起一些基本的用户管理工具所提供的方法,有时候你需要对这些用户采取更多的用户权限管理方式。特别是当你要管理某些用户的权限时,这个想法尤为重要。

Linux系统是一个多用户多任务的分时操作系统,任何一个要使用系统资源的用户,都必须首先向系统管理员申请一个账号,然后以这个账号的身份进入系统。

用户的账号一方面可以帮助系统管理员对使用系统的用户进行跟踪,并控制他们对系统资源的访问;另一方面也可以帮助用户组织文件,并为用户提供安全性保护。

每个用户账号都拥有一个唯一的用户名和各自的口令。

用户在登录时键入正确的用户和口令后,就能够进入系统和自己的主目录

实现用户账号的管理,要完成的工作主要有如下几个方面:

  • 用户账号的添加,删除与修改
  • 用户口令的管理
  • 用户组的管理

一,Linux系统用户账号的管理

用户账号的管工作涉及到用户账号的添加,修改,删除,查询。

添加用户账号就是在系统中创建一个新的账号,然后为新账号分配用户号,用户组,主目录和登录Shell等资源。刚添加的账号是被锁定的,无法使用。

添加用户账号useradd

其语法格式如下:

1
useradd  选项  用户名
  • 选项:

    • -c comment 指定一段注释性描述
    • -d 目录 指定用户主目录,如果此目录不存在,则同时使用-m选项,可以创建主目录
    • -m 创建目录 指定用户主目录,如果此目录不存在,则同时使用-m选项,可以创建主目录
    • -g 用户组 指定用户所属的主要用户组
    • -G 用户组 指定用户所属的附加组
    • -s Shell文件 指定用户登录的Shell
    • -u 用户号 指定用户的用户号,如果同时有-o选项,则可以重复使用其他用户的标识号。
    • -o 指定用户的用户号,如果同时有-o选项,则可以重复使用其他用户的标识号。
  • 用户名:

    指定新账号的登录名。

实例

1
useradd -s /bin/bash -g test –G adm,root   -d /home/gem  -m   gem

此命令创建了一个用户gem,该用户的登录Shell是/bin/bash ,它属于test组,同时又属于adm和root用户组,其中test用户组是其主组。

这里会新建组#groupadd test && groupadd adm

增加用户账号就是在/etc/passwd文件中为新用户增加一条记录,同时更新其他系统文件如/etc/shadow,/etc/group等。Linux提供了集成的系统管理工具userconf,它可以用来对用户账号进行统一管理。

删除用户账号userdel

如果一个用户的账号不再使用,可以从系统中删除。删除用户账号就是要将/etc/passwd等系统文件中的该用户记录删除,必要时还删除用户的主目录。

其命令格式如下:

1
userdel   选项   用户名
  • 选项:

    • -r 把用户的主目录一起删除。
  • 用户名:

    要删除的用户名

实例

1
userdel  -r  gem

此命令删除用户gem在系统文件中(主要是/etc/passwd,/etc/shadow,/etc/group等)的记录,同时删除用户的主目录。

修改用户账号usermod

修改用户账号就是根据实际情况更改用户的有关属性,如用户号,主目录,用户组,登录Shell等。

其命令格式如下:

1
usermod 选项  用户名
  • 选项:

    • -c comment 指定一段注释性描述
    • -d 目录 指定用户主目录,如果此目录不存在,则同时使用-m选项,可以创建主目录
    • -m 创建目录 指定用户主目录,如果此目录不存在,则同时使用-m选项,可以创建主目录
    • -g 用户组 指定用户所属的主要用户组
    • -G 用户组 指定用户所属的附加组
    • -s Shell文件 指定用户登录的Shell
    • -u 用户号 指定用户的用户号,如果同时有-o选项,则可以重复使用其他用户的标识号。
    • -o 指定用户的用户号,如果同时有-o选项,则可以重复使用其他用户的标识号。
    • -l 新用户名 有些系统可以使用的选项,指定一个新的账号名
  • 用户名:

    指定账号的登录名。

实例

1
usermod  -s /bin/zsh   -d /home/z   -g group   gem

此命令将用户gem的登录shell改为Zsh,主目录改为/home/z ,用户主组为group。

查询用户账号/etc

将用户添加到现有组是Linux管理员的常规活动,因此识别该环境的用户组和用户是非常重要的,所有用户都列在/etc/passwdd中,组列在/etc/group中。因此我们需要的信息直接打开这些文件就行。

什么是/etc/passwd?

/etc/passwd是一个文本文件,其中包含登录Linux系统所必需的每个用户信息。它维护有用的用户信息,如用户名,密码,用户ID,组ID,用户ID信息,家目录和shell。passwd每行包含了用户的详细信息

image-20221226135057592

从上面的例子我们可以看到,/etc/passwd中记录对应着一个用户,每行记录又被冒号(:)分隔为7个字段,其格式和具体含义如下

1
用户名:口令:用户标识号:组标识号:注释性描述:主目录:登录Shell
1)”用户名”是代表用户账号的字符串。

通常长度不超过8个字符,并且由大小写字母和/或数字组成。登录名中不能有冒号(:),因为冒号在这里是分隔符。

为了兼容起见,登录名中最好不要包含点字符(.),并且不使用连字符(-)和加号(+)打头。

2)“口令”一些系统中,存放着加密后的用户口令字。

虽然这个字段存放的只是用户口令的加密串,不是明文,但是由于/etc/passwd文件对所有用户都可读,所以这仍是一个安全隐患。因此,现在许多Linux 系统(如SVR4)都使用了shadow技术,把真正的加密后的用户口令字存放到/etc/shadow文件中,而在/etc/passwd文件的口令字段中只存放一个特殊的字符,例如“x”或者“*”。

3)“用户标识号”是一个整数,系统内部用它来标识用户。

一般情况下它与用户名是一一对应的。如果几个用户名对应的用户标识号是一样的,系统内部将把它们视为同一个用户,但是它们可以有不同的口令、不同的主目录以及不同的登录Shell等。

通常用户标识号的取值范围是0~65 535。0是超级用户root的标识号,1~99由系统保留,作为管理账号,普通用户的标识号从100开始。在Linux系统中,这个界限是500。

4)“组标识号”字段记录的是用户所属的用户组。

它对应着/etc/group文件中的一条记录。

5)“注释性描述”字段记录着用户的一些个人情况。

例如用户的真实姓名、电话、地址等,这个字段并没有什么实际的用途。在不同的Linux 系统中,这个字段的格式并没有统一。在许多Linux系统中,这个字段存放的是一段任意的注释性描述文字,用做finger命令的输出。

6)“主目录”,也就是用户的起始工作目录。

它是用户在登录到系统之后所处的目录。在大多数系统中,各用户的主目录都被组织在同一个特定的目录下,而用户主目录的名称就是该用户的登录名。各用户对自己的主目录有读、写、执行(搜索)权限,其他用户对此目录的访问权限则根据具体情况设置。

7)用户登录后,要启动一个进程,负责将用户的操作传给内核,这个进程是用户登录到系统后运行的命令解释器或某个特定的程序,即Shell。

Shell是用户与Linux系统之间的接口。Linux的Shell有许多种,每种都有不同的特点。常用的有sh(Bourne Shell), csh(C Shell), ksh(Korn Shell), tcsh(TENEX/TOPS-20 type C Shell), bash(Bourne Again Shell)等。

系统管理员可以根据系统情况和用户习惯为用户指定某个Shell。如果不指定Shell,那么系统使用sh为默认的登录Shell,即这个字段的值为/bin/sh。

用户的登录Shell也可以指定为某个特定的程序(此程序不是一个命令解释器)。

利用这一特点,我们可以限制用户只能运行指定的应用程序,在该应用程序运行结束后,用户就自动退出了系统。有些Linux 系统要求只有那些在系统中登记了的程序才能出现在这个字段中。

8)系统中有一类用户称为伪用户(pseudo users)。

这些用户在/etc/passwd文件中也占有一条记录,但是不能登录,因为它们的登录Shell为空。它们的存在主要是方便系统管理,满足相应的系统进程对文件属主的要求。

常见的伪用户如下所示:

1
2
3
4
5
6
7
伪 用 户 含 义 
bin 拥有可执行的用户命令文件
sys 拥有系统文件
adm 拥有帐户文件
uucp UUCP使用
lp lp或lpd子系统使用
nobody NFS使用

什么是/etc/group

/etc/group是一个文本文件,用于定义用户所属的组。我们今天将多个用户添加到单个组中。它允许用户访问其他用户文件和文件夹,因为Linux权限分为三类:用户,组和其他。它维护有关组的有用信息,例如组名,组密码,组ID(GID)和成员列表。每个都在单独的行。组文件中包含了每个组的详细信息。

image-20221226141937792

用户和用户组常用命令

  • groups: 显示一个用户的所有用户组
  • id: 打印指定用户名和组信息
  • lid: 显示用户的组或组的用户
  • getent: 从Name Service Switch 库中获取条目
  • whoami:查看当前登录用户名

用户口令管理passwd

用户管理的一项重要内容是用户口令的管理。用户账号刚创建的时候没有口令,但是被系统锁定,无法使用,必须为其指定口令后才可以使用,即使是指定空指令。

指定和修改用户的口令的Shell命令是passwd。超级用户可以为自己和其他用户指定口令,普通用户只能用它修改自己的口令。命令的格式为:

1
passwd 选项  用户名

可以使用的选项:

  • -l 锁定账号,即禁用账号
  • -u 口令解锁
  • -d 使账号无口令
  • -f 强迫用户下次登录时修改口令。

如果默认用户名,则修改当前用户的口令。

实例

1
passwd  -d  -l gem 

此命令将Sam的口令删除和锁定该账户,于是该账户下次就不能登录了。

二,Linux系统用户组管理

每个用户都有一个用户组,系统可以对一个用户组中的所有用户进行集中管理。不同的Linux系统对用户组的规定有所不同,如Linux下的用户属于与它同名的用户组,这个用户组在创建用户的同时创建。

用户组的管理涉及用户的添加,删除和修改。组的增加,删除和修改实际上就是对/etc/group文件的更新。

增加新的用户组groupadd

其格式如下:

1
groupadd 选项   用户组

可以使用的选项有:

  • -g GID指定新用户的组标符号(GID)
  • -o 一般与-g选项同时使用,表示新的用户组的GID可以与系统已有用户组的GID相同

实例

1
groupadd    -g  101 -o  test

此命令向系统中增加了一个新的用户组test,同时指定新的用户组的ID为101,且可以与已有的GID相同

删除已有的用户组groupdel

其格式如下:

1
groupdel    用户组

实例

1
groupdel   test

此命令用于从系统中删除组test

修改用户组的属性groupmod

其格式如下:

1
groupmod   选项   用户组

常用的选项有:

  • -g GID为用户指定的新的组标符号
  • -o与-g选项同时使用,用户组的新GID可以与系统已有的用户组的GID相同。
  • -n 新的用户组 将用户组的名字改为新的名字

实例

1
groupmod   -g  110  -o   -n  newtest   test

此命令将用户组test的GID改为了110,并且可以与已有的用户组的GID相同,并且更名为newtest。

切换用户组newgrp

如果个用户同时属于多个用户组,那么用户可以在用户组之间切换,以便具有其他用户组的权限。

用户在登录后,使用命令newgrp切换到其他用户组,这个命令的参数就是目的用户组

实例

1
newgrp     root

此命令用户将当前用户的用户组切换到root用户组,前提是root用户组确实是该用户的主组或者附加组。类似于用户账号的管理,用户组的管理也可以通过集成的系统管理工具来完成。

三,更改文件属性

1、chgrp:更改文件属组

语法:

1
chgrp [-R] 属组名 文件名

参数选项

  • -R:递归更改文件属组,就是在更改某个目录文件的属组时,如果加上-R的参数,那么该目录下的所有文件的属组都会更改。

2、chown:更改文件属主,也可以同时更改文件属组

语法:

1
2
chown [–R] 属主名 文件名
chown [-R] 属主名:属组名 文件名

进入 /root 目录(~)将install.log的拥有者改为bin这个账号:

1
2
3
4
[root@www ~] cd ~
[root@www ~]# chown bin install.log
[root@www ~]# ls -l
-rw-r--r-- 1 bin users 68495 Jun 25 08:53 install.log

将install.log的拥有者与群组改回为root:

1
2
3
[root@www ~]# chown root:root install.log
[root@www ~]# ls -l
-rw-r--r-- 1 root root 68495 Jun 25 08:53 install.log

3、chmod:更改文件9个属性

Linux文件属性有两种设置方法,一种是数字,一种是符号。

Linux 文件的基本权限就有九个,分别是 owner/group/others(拥有者/组/其他) 三种身份各有自己的 read/write/execute 权限。

先复习一下刚刚上面提到的数据:文件的权限字符为: -rwxrwxrwx , 这九个权限是三个三个一组的!其中,我们可以使用数字来代表各个权限,各权限的分数对照表如下:

  • r:4
  • w:2
  • x:1

每种身份(owner/group/others)各自的三个权限(r/w/x)分数是需要累加的,例如当权限为: -rwxrwx— 分数则是:

  • owner = rwx = 4+2+1 = 7
  • group = rwx = 4+2+1 = 7
  • others= — = 0+0+0 = 0

所以等一下我们设定权限的变更时,该文件的权限数字就是 770。变更权限的指令 chmod 的语法是这样的:

1
chmod [-R] xyz 文件或目录

选项与参数:

  • xyz : 就是刚刚提到的数字类型的权限属性,为 rwx 属性数值的相加。
  • -R : 进行递归(recursive)的持续变更,以及连同次目录下的所有文件都会变更

举例来说,如果要将 .bashrc 这个文件所有的权限都设定启用,那么命令如下:

1
2
3
4
5
[root@www ~]# ls -al .bashrc
-rw-r--r-- 1 root root 395 Jul 4 11:45 .bashrc
[root@www ~]# chmod 777 .bashrc
[root@www ~]# ls -al .bashrc
-rwxrwxrwx 1 root root 395 Jul 4 11:45 .bashrc

那如果要将权限变成 -rwxr-xr– 呢?那么权限的分数就成为 [4+2+1][4+0+1][4+0+0]=754。