运维系列.Linux下的用户管理

本文涉及的产品
密钥管理服务KMS,1000个密钥,100个凭据,1个月
简介: 运维系列.Linux下的用户管理

1. 用户和用户组的概念

1.1 Linux中的用户

在Linux系统中,用户是指能够登录系统并使用资源的个体。每个用户都有一个唯一的用户名和对应的数字型用户ID(UID)。用户可以属于一个或多个用户组。Linux系统使用用户和用户组来管理对系统资源的访问权限,以确保系统的安全性和稳定性。

用户可以分为以下几类:

  1. 超级用户root):拥有系统的最高权限,可以执行任何操作。
  2. 系统用户:由系统创建的用户,通常用于运行特定的服务或程序,如www-dataWeb服务器用户)、mysqlMySQL数据库用户)等。
  3. **普通用户:**由管理员创建的用户,用于日常工作和管理。
    用户的信息存储在以下两个文件中:
文件名 描述
/etc/passwd 存储用户的基本信息,如用户名、UID、主目录、默认Shell等
/etc/shadow 存储用户的密码信息(加密后的密码)

/etc/passwd如:

可以看出,在Linux系统中,/etc/passwd文件列出的用户不仅包括实际的人类用户,还包括许多系统用户。这些系统用户主要用于运行和管理系统服务,而不是用于常规的登录和交互。这里是一些关键点来帮助你理解这些用户的存在和目的:

  1. 系统用户:

这些用户通常用于特定的系统服务和守护进程(如web服务器、数据库服务等)。


系统用户通常不允许登录系统(即它们的shell通常设置为/usr/sbin/nologin或/bin/false),这是为了安全性,防止这些用户被用于普通的登录。


例如,www-data是web服务器(如Apache或Nginx)的默认用户,syslog用于系统日志服务,messagebus用于D-Bus消息总线系统。

  1. 实际用户:

实际用户是指那些可以登录系统并进行交互的用户账户。这些用户的shell通常设置为/bin/bash或其他有效的shell。

1.1 用户组的概念

用户组是 具有相似 属性 或 权限 的用户的集合。每个用户组也有一个 唯一的组名 和 对应的 数字型组ID(GID)。 用户组的存在简化了对用户的管理,可以方便地对一组用户进行权限控制。

用户组可以分为以下两类:

  1. 主要组(Primary Group):用户的默认组,在创建用户时指定。用户创建的文件的所属组默认为该用户的主要组。
  2. 附属组(Secondary Group):用户可以属于多个附属组,以获得对应组的权限。
    用户组的信息存储在以下文件中:
文件名 描述
/etc/group 存储用户组的基本信息,如组名、GID等

通过合理地规划和管理用户及用户组,可以有效地控制用户对系统资源的访问,提高系统的安全性和可管理性。

你可以使用vim打开/etc/group文件(也可以用cat命令简单查看):

vim /etc/group

其内容结构如:

2. 用户信息查询

Linux 系统中,可以使用id命令查询用户的信息。该命令可以显示指定用户或当前用户的 用户IDUID)、组IDGID)以及所属的用户组信息。

2.1 id命令的用法简介

id命令的基本语法如下:

id [OPTION]... [USER]...

以下是id命令的常用选项:

选项 描述
-a 忽略此选项,仅用于与其他版本兼容
-Z, --context 仅打印进程的安全上下文
-g, --group 仅打印有效的组ID
-G, --groups 打印所有的组ID
-n, --name 配合-ugG选项使用,打印名称而不是数字ID
-r, --real 配合-ugG选项使用,打印真实ID而不是有效ID
-u, --user 仅打印有效的用户ID
-z, --zero 使用NUL字符而不是空格分隔条目,在默认格式中不允许使用
–help 显示帮助信息并退出
–version 显示版本信息并退出

如果不指定任何选项,id 命令会打印一组有用的用户信息。

2.1 id命令的用法示例

示例1:查看当前用户的信息:

id

输出形如:

uid=1000(jclee95) gid=1000(jclee95) groups=1000(jclee95),4(adm),20(dialout),24(cdrom),25(floppy),27(sudo),29(audio),30(dip),44(video),46(plugdev),116(netdev),1001(docker)

示例2:查看指定用户的信息

$ id root

输出:

uid=0(root) gid=0(root) groups=0(root)

示例3:仅显示当前用户的UID

$ id -u
1000

示例4:显示当前用户所属的所有组的名称

$ id -Gn
john adm cdrom sudo dip plugdev lpadmin sambashare

2.1 getent命令

2.1.1 getent用法解析

getent 命令是一个用于查询系统数据库的工具,它可以从不同的系统数据库中获取条目,如用户账户、组、主机名等。这个命令非常有用,因为它不仅可以访问传统的 /etc/passwd 或 /etc/group 文件,还可以查询由 nsswitch.conf 配置的其他数据源,例如 LDAP。

基本的 getent 命令格式如下:

getent [options] database [key ...]

其中:

  • database:指定要查询的数据库名称;
  • key:指定要查询的键值,例如用户名、组名等。

getent 支持多种数据库,这些数据库包括但不限于:

  • passwd:用于获取用户账户信息。
  • group:用于获取用户组信息。
  • hosts:用于获取主机名和IP地址映射。
  • services:用于服务和它们对应的端口号及协议。
  • networks:网络名称和网络号。
  • protocols:网络协议信息。
  • shadow:用户密码信息(通常需要超级用户权限)。
  • netgroup:网络组信息。

getent 提供了几个选项来修改其行为:

  • -i, --no-idn:禁用国际化域名编码。
  • -s, --service=CONFIG:指定服务配置。
  • -?, --help:显示帮助信息。
  • --usage:显示简短的使用信息。
  • -V, --version:打印程序版本。

2.1.2 示例:查询用户

getent命令可以用来获取条目的数据库,如密码或组数据库。要列出所有用户,可以使用:

getent passwd

这将列出/etc/passwd文件的内容,其中包含了系统上每个用户的信息:

也可以指定用户组名以查询特定用户组,如:

getent passwd root

2.1.2 示例:查询用户组

下面的命令将显示指定用户名的用户信息。

getent group

也可以指定用户组名以查询特定用户组,如:

getent group utmp

当然,该命令还可以查询其它的信息如查询特定服务可以用getent services ssh,这将显示SSH服务的端口和协议信息,感兴趣的读者可以自己试一试,这不是本文介绍的要点,因此不做展开。

getent 命令非常适合在多种数据源环境中工作,例如在使用 LDAP(轻量级目录访问协议,Lightweight Directory Access Protocol)或其他网络服务进行用户和组管理的系统中。它提供了一种统一的方法来查询这些信息,无论它们实际存储在何处。


3. /etc下的 passwd、group、shadow文件

在前面的例子中,我们已经初步在各种零散的命令中接触了/etc/passwd、/etc/group文件。/etc/passwd、/etc/group、/etc/shadow等文件共同构成了Linux系统中用户和组管理的基础。系统管理员可以通过修改这些文件来添加、删除、修改用户和组的信息,但通常建议使用专门的命令(如useradd、usermod、groupadd等)来进行这些操作,以确保数据的一致性和完整性。


3.1 三大用户文件简介

在Linux系统中,/etc/目录下有几个重要的文件用于存储用户和组的信息。这些文件包括:

文件名 作用
passwd 存储用户账户信息,包括用户名、UID、GID、主目录、登录Shell等。
shadow 存储用户密码的加密哈希值以及密码策略信息。
group 存储用户组信息,包括组名、GID和属于该组的用户列表。

这些文件共同构成了Linux系统的用户和权限管理的基础。

3.2 passwd文件

3.2.1 passwd文件的结构

/etc/passwd文件是Linux系统中的一个重要文件,它包含了系统中所有用户账户的信息。每一行代表一个用户,每行有7个字段,字段之间用冒号(:)分隔。例如:

其格式可以归纳为:

username:password:UID:GID:GECOS:directory:shell

这些字段的含义如下:

  1. username:用户名。
  2. password:密码字段,在现代Linux系统中通常为x,实际的密码哈希存储在/etc/shadow文件中。
  3. UID:用户ID(User Identifier)。
  4. GID:用户的主组ID(Group Identifier)。
  5. GECOS:用户的全名或注释字段。
  6. directory:用户的主目录。
  7. shell:用户的默认登录Shell。

比如:

root:x:0:0:root:/root:/bin/bash

3.2.2 UID(User Identifier)

UID(用户标识符)是一个非负整数,用于在系统内部标识每个用户。在Linux系统中,UID为0的用户是超级用户(root),拥有最高权限。普通用户的UID通常从1000开始分配(在某些系统中可能从500开始)。

3.2.3 GID(Group Identifier)

GID(用户组标识符)是一个非负整数,用于在系统内部标识每个用户组。在/etc/passwd文件中,GID字段表示用户的主组ID。用户可以属于多个组,但只能有一个主组。

3.2 group文件

/etc/group文件存储了系统中所有用户组的信息。每行代表一个组,字段之间用冒号(:)分隔,主要字段包括:

groupname:password:GID:user_list
  1. groupname:组名。
  2. password:组密码字段,通常为x,表示使用/etc/gshadow文件中的密码。
  3. GID:组ID(Group Identifier)。
  4. user_list:属于该组的用户列表,用户名之间用逗号(,)分隔。

3.3 shadow文件

/etc/shadow文件存储了用户密码的加密哈希值以及密码策略信息。这个文件的权限通常比较严格(只有root可读写),以保护用户密码的安全。每行代表一个用户,字段之间用冒号(:)分隔,例如:

可以看到一个用户行中,主要字段包括:

username:encrypted_password:last_change:min_days:max_days:warn_days:inactive_days:expiration_date

其中:

  1. username:用户名。
  2. encrypted_password:加密后的密码哈希值。
  3. last_change:上次修改密码的日期(从1970年1月1日开始的天数)。
  4. min_days:两次修改密码之间所需的最小天数。
  5. max_days:密码的最长有效期(天数)。
  6. warn_days:密码过期前多少天开始警告用户。
  7. inactive_days:密码过期后多少天禁用账户。
  8. expiration_date:账户的过期日期(从1970年1月1日开始的天数)。

4. 用户的创建、切换、删除

在Linux系统中,用户的创建和删除是日常管理任务的一部分。这些操作通常通过命令行工具进行,以确保系统的用户管理是适当和安全的。

4.1 用户的创建

4.1.1 创建用户

在Linux中,创建新用户通常使用useradd命令。这个命令允许管理员添加新用户并设置用户的初始配置,如用户的主目录、登录Shell等。其基本命令格式为:

sudo useradd [options] username

常用选项:

  • -m, --create-home:创建用户的主目录。
  • -d, --home-dir HOME_DIR:指定用户的主目录。
  • -s, --shell SHELL:指定用户的登录Shell。
  • -g, --gid GROUP:指定用户的初始登录组。
  • -G, --groups GROUPS:指定用户的附加组。
  • -u, --uid UID:为用户指定UID。

最简单的新增用户如:

sudo useradd test1

使用cat /etc/passwd命令可以查看到新增的一个名为test1的用户:

例如创建一个名为test2的用户,并通过-m选项为其创建主目录,通过-s选项指定bash(/bin/bash)为登录的Shell

sudo useradd -m -s /bin/bash test2

通过指定-m参数,在home下新增了用户主目录:

4.1.2 设置密码(passwd)

在Linux系统中,创建用户后,通常需要为新用户设置密码以确保账户的安全性。密码可以通过passwd命令来设置。基本命令格式:

sudo passwd [username]

当运行此命令时,系统会提示你输入新密码,并要求再次输入以确认。

现在为为新创建的用户test1test2设置密码:

可见,当运行此命令时,系统会提示你输入新密码,并要求再次输入以确认。

4.1.3 创建时指定用户组(-g、-G)

在创建用户时,可以指定用户的初始登录组(主组)和附加组。这可以通过useradd命令的-g(指定主组)和-G(指定附加组)选项来实现。

sudo useradd -g [主组] -G [附加组1,附加组2,...] [username]
  • -g 选项后跟用户的主组ID或名称。
  • -G 选项后跟一个或多个附加组ID或名称,用逗号分隔。

例如,先创建一个名为wheel的用户组,再创建一个名为test3的用户,将其主组设置为users,并将其添加到wheelaudio两个附加组:

sudo groupadd wheel 
sudo useradd -m -s /bin/bash -g users -G wheel,audio test3

4.2 用户的切换

在Linux系统中,切换用户是一个常见的操作,特别是当你需要以不同用户的权限执行任务时。这可以通过使用su(substitute user或switch user)命令来实现。其基本命令格式为:

su [options] [username]

其中常用选项:

  • --l--login:以登录shell启动,这意味着会切换到用户的主目录,加载用户的环境变量等。
  • -c--command:作为指定用户运行单个命令,命令执行完毕后返回原用户。

如果不指定用户名,su命令默认切换到超级用户(root)。当执行su命令时,系统通常会要求输入目标用户的密码。

如切换到root用户:

su

切换到普通用户(例如test2):

su - test2

这将切换到用户test2,并加载test2的用户环境。如果设置了密码,则需要输入

4.3 用户的删除

删除用户在Linux中通常使用userdel命令。这个命令允许管理员从系统中删除用户账户。其基本命令格式为:

sudo userdel [options] username

其中常用选项:

  • -r, --remove:表示删除用户的同时,删除用户的主目录和邮件目录。

对于test1用户,可以直接删除它:

sudo userdel test1

可以看到用户test1被正常删除了。

如果删除刚刚创建的名为test1的用户及其主目录时使用 -r 选项:

sudo userdel -r test1

将有错误提示:


userdel: test1 mail spool (/var/mail/test1) not found

userdel: test1 home directory (/home/test1) not found

这是因为,创建 test1 用户时没有使用 -m 选项(或者相应的配置没有设置为自动创建主目录),则不会为该用户创建主目录。同样,邮件系统没有为该用户配置或创建邮件目录,该目录也不会存在。因此有上面的错误信息。

不过这不会妨碍用户的正常删除。

由于创建用户test2时使用了-m选项,如果我们希望删除用户时将对应的用户目录也一块删除,则删除用户时需要增加一个 -r 选项:

sudo userdel -r test2

这里使用 cat /etc/passwd | grep test2 过滤掉了其它用户行。可见删除后test2用户目录也删除了。(另外,/var/mail/test2 在test2用户创建时没有对应建立,这不影响。)

5. 用户信息修改

有时候,管理员可能需要修改现有用户的信息,如更改用户名、用户组、登录Shell或主目录等。这些操作通常通过命令行工具 usermod 来完成。该命令的基本命令格式为:

sudo usermod [options] username

其中选项有:

  • -l, --login NEW_LOGIN:更改用户的登录名。
  • -d, --home HOME_DIR:更改用户的主目录。
  • -m, --move-home:移动用户的主目录内容到新位置。
  • -s, --shell SHELL:更改用户的登录Shell。
  • -g, --gid GROUP:更改用户的主组。
  • -G, --groups GROUPS:更改用户的附加组。
  • -a, --append:将用户添加到补充组,而不移除其它组。
  • -u, --uid UID:更改用户的UID。
  1. 更改用户名
    将用户名从 oldname 更改为 newname:
sudo usermod -l newname oldname
  1. 更改用户主目录:

更改用户 username 的主目录到 /new/home/dir 并移动现有内容:

sudo usermod -d /new/home/dir -m username
  1. 更改登录Shell

更改用户 username 的登录Shell为 /bin/zsh

sudo usermod -s /bin/zsh username
  1. 更改用户的主组和附加组

更改用户 username 的主组为 newgroup,并设置附加组为 group1group2

sudo usermod -g newgroup -G group1,group2 username
  1. 添加用户到附加组而不移除现有组

将用户 username 添加到 additionalgroup 组,同时保留其在其他组的成员资格:

sudo usermod -aG additionalgroup username

6. 用户相关进程

管理和查询特定用户的进程是常见的系统管理任务,比如当你删除一个用户时,就需要关闭这个用户跑起来的进程。管理和查询特定用户的进程还可以帮助管理员监控资源使用情况、终止不需要的进程或调试用户级的应用问题。

6.1 查询指定用户的所有进程

使用 ps 命令结合适当的选项可以列出特定用户的所有进程:

ps -u username

例如查看当前用户test1对应的所有进程:

ps -u test1

可看到,输出将包括进程ID、终端、运行时间和命令名称等信息。

6.2 终止指定用户的所有进程

如果需要终止某个用户的所有进程,可以使用 pkillkillall 命令。

使用 pkill

sudo pkill -u username

这个命令将发送SIGTERM信号到所有属于指定用户的进程,请求它们正常退出。

默认情况下,pkill 发送的是 SIGTERM 信号,这是一个“温和”的终止信号,允许进程进行清理操作后再退出。然而,并非所有进程都会响应 SIGTERM 信号,比如:。

可以使用kill进一步删除,如:

kill -s 9 7913

使用 killall

sudo killall -u username

这个命令的作用类似于 pkill,也是发送SIGTERM信号来终止用户的所有进程。


默认情况下,pkill 和 killall 发送的是SIGTERM信号,该信号允许进程进行清理操作后再退出。如果进程没有响应,你可能需要发送更强制的信号,如SIGKILL(使用 -9 选项),例如 sudo pkill -9 -u username。

7. 用户操作

在Linux系统中,查询用户的历史操作通常涉及到查看用户的命令行历史记录。这可以帮助系统管理员了解用户在系统上执行了哪些命令,对于审计、监控或故障排查等场景非常有用。

7.1 查看命令历史

Linux系统通常使用.bash_history文件来存储用户的命令行历史。这个文件位于用户的主目录下。

查看当前用户的命令历史可以使用下面的方法:

cat ~/.bash_history

或者者使用history命令:

history

可见,它们都将列出当前用户会话中执行的命令历史。

7.2 审计日志

对于更详细的用户活动跟踪,可以使用Linux的审计系统(auditd)。auditd是一个强大的工具,可以配置来记录更详细的用户活动,包括文件访问、系统调用等。

7.1 安装审计守护进程

sudo apt-get install auditd    # Debian/Ubuntu
# 或者
sudo yum install audit         # CentOS/RHEL

配置审计规则:

例如,要审计所有用户对特定文件的访问:

sudo auditctl -w /path/to/file -p war -k keyname

这里-w指定要监控的文件路径,-p指定要监控的操作(写入w、读取r、属性更改a),-k是一个标签,用于在报告中识别这条规则。

7.2 配置审计规则

例如,要审计所有用户对特定文件的访问:

sudo auditctl -w /path/to/file -p war -k keyname

这里-w指定要监控的文件路径,-p指定要监控的操作(写入w、读取r、属性更改a),-k是一个标签,用于在报告中识别这条规则。

7.3 查看审计日志

sudo ausearch -k keyname

这将显示所有标记为keyname的相关活动。

8. 用户组

在Linux系统中,用户组是一种将多个用户组织在一起的机制,以便于对这些用户的权限进行统一管理。每个用户都属于至少一个用户组,称为用户的主组(Primary Group),同时可以属于零个或多个附加组(Secondary Groups)。

8.1 用户组的作用

用户组的主要作用包括:

  • 文件和目录的访问控制:通过为文件和目录设置组权限,可以控制属于该组的用户对这些文件和目录的访问。
  • 资源的共享:属于同一个组的用户可以方便地共享某些资源,如某个目录下的文件。
  • 权限的统一管理:通过将具有相似权限的用户放在同一个组中,可以方便地对这些用户的权限进行统一的管理。

8.2 用户组的类型

在Linux系统中,用户组可以分为以下两种类型:

  • 主组(Primary Group):每个用户都有且仅有一个主组。当用户创建文件时,文件的组所有权默认为用户的主组。主组信息存储在/etc/passwd文件的第四个字段。
  • 附加组(Secondary Groups):用户可以属于零个或多个附加组。附加组信息存储在/etc/group文件中。

8.3 用户组的管理

8.3.1 添加用户组

在Linux系统中,可以使用groupadd命令创建新的用户组。groupadd命令的基本语法如下:

groupadd [options] GROUP

其中,GROUP表示要创建的用户组的名称。

groupadd命令常用的选项包括:

  • -g, --gid GID:指定新用户组的组ID(GID)。如果不指定,系统会自动分配一个未使用的GID。
  • -r, --system:创建一个系统用户组。系统用户组的GID通常在系统保留的范围内(如1-999),这些组通常用于系统服务和进程。
  • -f, --force:如果指定的组已经存在,不要报错退出,而是成功返回。
  • -o, --non-unique:允许创建GID重复的用户组。默认情况下,groupadd会拒绝创建GID重复的组。
  • -p, --password PASSWORD:为新用户组设置密码。通常不建议为用户组设置密码,这里的密码是加密后的密码,可以使用perl -e 'print crypt(“password”, “salt”),“\n”'生成。
  • -R, --root CHROOT_DIR:指定chroot目录。
  • -P, --prefix PREFIX_DIR:指定prefix目录,默认为/usr/local。

下面是一些使用groupadd命令创建用户组的示例:

  1. 创建一个名为team1的普通用户组:
sudo groupadd team1
  1. 创建一个名为sysadmins的系统用户组:
sudo groupadd -r sysadmins
  1. 创建一个名为developers的用户组,并指定GID为1500:
sudo groupadd -g 1500 developers
  1. 创建一个名为managers的用户组,如果该组已存在,不要报错:
sudo groupadd -f managers

建用户组后,可以使用以下命令查看系统中的用户组:

  • cat /etc/group:查看/etc/group文件的内容,该文件存储了系统中所有用户组的信息;
  • getent group:获取所有用户组的信息,包括/etc/group文件和其他网络数据库(如LDAP)中的用户组信息。

例如,要查看刚刚创建的team1组的信息,可以使用以下命令:

getent group team1

输出结果类似于:

team1:x:1005:

其中,第一个字段是组名,第二个字段是组密码(通常为x),第三个字段是GID,第四个字段是属于该组的用户列表(为空表示没有用户)。

通过合理地创建和管理用户组,可以方便地对用户进行分类和权限控制,提高系统的安全性和可管理性。

8.3.2 删除用户组

在Linux系统中,可以使用groupdel命令删除已有的用户组。groupdel命令的基本语法如下:

groupdel [options] GROUP

其中,GROUP表示要删除的用户组的名称。

groupdel命令常用的选项包括:

-h, --help:显示帮助信息并退出。

-R, --root CHROOT_DIR:指定chroot目录。

-P, --prefix PREFIX_DIR:指定prefix目录,默认为/usr/local。

-f, --force:即使该组是某个用户的主组,也强制删除该组。默认情况下,如果要删除的组是某个用户的主组,groupdel会拒绝删除。

下面是一些使用groupdel命令删除用户组的示例:

删除一个名为team1的用户组:

sudo groupdel team1

删除一个名为developers的用户组,即使该组是某个用户的主组也强制删除:

sudo groupdel -f developers

删除用户组时需要注意以下几点:


只有root用户或者具有sudo权限的用户才能删除用户组。

不能删除系统中已经存在的用户的主组。如果要删除一个用户的主组,需要先将该用户的主组- 修改为其他组,或者删除该用户。

删除一个组并不会自动删除属于该组的用户。如果要删除属于某个组的所有用户,需要先逐个删除这些用户,然后再删除该组。

删除用户组后,可以使用以下命令查看系统中的用户组:


cat /etc/group:查看/etc/group文件的内容,该文件存储了系统中所有用户组的信息。

getent group:获取所有用户组的信息,包括/etc/group文件和其他网络数据库(如LDAP)中的用户组信息。

例如,要查看系统中是否还存在team1组,可以使用以下命令:

getent group team1

如果该组已经被删除,将不会有任何输出结果。

通过适当地删除不再需要的用户组,可以保持系统中的用户组结构清晰和精简,提高系统的可管理性。同时,在删除用户组时,要注意评估对现有用户和系统服务的影响,以免造成不必要的问题。

8.3.3 修改用户组

groupmod的用法

在Linux系统中,可以使用groupmod命令修改已有用户组的属性,如组名、GID等。groupmod命令的基本语法如下:

groupmod [options] GROUP

其中,GROUP表示要修改的用户组的名称。

groupmod命令常用的选项包括:

-g, --gid GID:修改用户组的GID。

-n, --new-name NEW_GROUP:将用户组的名称改为NEW_GROUP。

-o, --non-unique:允许使用重复的(非唯一的)GID。

-p, --password PASSWORD:将用户组的密码更改为PASSWORD(通常不建议为用户组设置密码)。

-R, --root CHROOT_DIR:指定chroot目录。

-P, --prefix PREFIX_DIR:指定prefix目录,默认为/usr/local。

基本示例

下面是一些使用groupmod命令修改用户组属性的示例:

修改team1组的GID为2000:

sudo groupmod -g 2000 team1

将developers组的名称改为devs:

sudo groupmod -n devs developers

managers组的GID修改为3000,即使该GID已经被其他组使用:

sudo groupmod -g 3000 -o managers

修改用户组属性时需要注意以下几点:


只有root用户或者具有sudo权限的用户才能修改用户组属性。

修改用户组的 GID可能会影响文件的属主和权限。因为文件的组所有权是根据GID来确定的,而不是组名。因此,在修改组的GID后,属于该组的文件的组所有权也会相应地改变。

将用户组的名称改为另一个已存在的组名时,groupmod会报错并拒绝修改。

修改用户组密码通常不是一个好的做法。因为用户组密码是对组中的所有用户生效的,而不是针对单个用户。这可能会带来安全风险。

修改用户组属性后,可以使用以下命令查看修改后的结果:


cat /etc/group:查看/etc/group文件的内容,该文件存储了系统中所有用户组的信息。

getent group:获取所有用户组的信息,包括/etc/group文件和其他网络数据库(如LDAP)中的用户组信息。

用户的熟悉的修改

例如,要查看修改后的team1组的信息,可以使用以下命令:

getent group team1

输出结果类似于:

team1:x:2000:

可以看到,team1组的GID已经被修改为2000。

通过合理地修改用户组的属性,可以适应组织结构和安全策略的变化,提高系统的灵活性和可维护性。同时,在修改用户组属性时,要充分评估对现有用户、文件权限和系统服务的影响,以免造成意外的问题。

用户的添加和移除

除了修改用户组的属性外,groupmod命令还可以用于将用户添加到附加组或从附加组中移除用户。这通常是通过usermod命令的-G选项来实现的。例如:

将用户john添加到devs组:

sudo usermod -aG devs john

将用户johnmanagers组中移除:

sudo gpasswd -d john managers

这里使用了gpasswd命令的-d选项,它专门用于从组中删除用户。

8.3.4 常用用户组命令合集

1. 查看所有用户组
getent group

或者:

compgen -u
2. 查看当前用户的用户组
groups
3. 查看指定用户组的用户
groups groupsname
4. 查看指定用户所属的用户组
groups username

或者使用id命令查看更多信息:

id username
5. 将用户移除出用户组
gpasswd -d username groupname
6. 为指定用户组添加指定现有用户
usermod -aG groupname username

9. 其它命令

compgen命令

compgen 是一个 Bash 内建命令,用于生成命令、文件名、变量名等的自动补全列表。它通常用于脚本中,以便生成可能的补全选项。其语法格式为:

compgen [选项] [word]

其常用选项包括:


-a:列出所有可能的别名(alias)。

-b:列出所有可能的 shell 内建命令(builtin)。

-c:列出所有可能的命令(包括可执行文件和别名)。

-d:列出所有可能的目录名。

-e:列出所有可能的环境变量名。

-f:列出所有可能的文件名。

-g:列出所有符合 glob 模式的文件名。

-j:列出所有可能的作业(job)。

-k:列出所有可能的关键字(keyword)。

-s:列出所有可能的 shell 函数。

-u:列出所有可能的用户。

-v:列出所有可能的变量名。

-A action:指定要列出的动作(如 alias、builtin、command、directory、file、function、job、keyword、running、service、setopt、shopt、signal、stopped、user、variable)。

-G globpat:列出所有符合 glob 模式的文件名。

-W wordlist:从指定的单词列表中生成补全选项。

-F function:使用指定的函数生成补全选项。

-C command:使用指定的命令生成补全选项。

-X filterpat:使用指定的过滤模式过滤补全选项。

-P prefix:在每个补全选项前添加指定的前缀。

-S suffix:在每个补全选项后添加指定的后缀。

compgen命令有一个 -u 选项可以快速列出所有用户:

compgen -u

 

目录
相关文章
|
21天前
|
运维 监控 网络协议
|
7天前
|
缓存 运维 监控
【运维必备知识】Linux系统平均负载与top、uptime命令详解
系统平均负载是衡量Linux服务器性能的关键指标之一。通过使用 `top`和 `uptime`命令,可以实时监控系统的负载情况,帮助运维人员及时发现并解决潜在问题。理解这些工具的输出和意义是确保系统稳定运行的基础。希望本文对Linux系统平均负载及相关命令的详细解析能帮助您更好地进行系统运维和性能优化。
24 3
|
1月前
|
运维 Java Linux
【运维基础知识】Linux服务器下手写启停Java程序脚本start.sh stop.sh及详细说明
### 启动Java程序脚本 `start.sh` 此脚本用于启动一个Java程序,设置JVM字符集为GBK,最大堆内存为3000M,并将程序的日志输出到`output.log`文件中,同时在后台运行。 ### 停止Java程序脚本 `stop.sh` 此脚本用于停止指定名称的服务(如`QuoteServer`),通过查找并终止该服务的Java进程,输出操作结果以确认是否成功。
35 1
|
3月前
|
存储 运维 监控
运维.Linux下执行定时任务(中:Cron的常用替代方案)
本文是关于Linux下执行定时任务系列的第二部分,主要探讨除了Cron之外的常用替代方案。介绍了Systemd Timers、Anacron及at命令三种工具,它们分别适用于不同场景下的定时任务需求。文章详细分析了每种工具的特点、工作原理、基本使用方法及其高级功能,并对比了它们各自的优缺点,帮助读者根据实际情况选择最适合的定时任务解决方案。此外,还提供了指向具体实例和进一步阅读材料的链接。
127 4
运维.Linux下执行定时任务(中:Cron的常用替代方案)
|
3月前
|
移动开发 运维 网络协议
运维必备 | Linux netstat命令详解
运维必备 | Linux netstat命令详解
|
3月前
|
运维 监控 Unix
运维必看,Linux 远程数据同步工具详解。
运维必看,Linux 远程数据同步工具详解。
|
4月前
|
存储 运维 Linux
|
4月前
|
Linux 测试技术 数据安全/隐私保护
阿里云Linux os copilot 运维助手初体验
阿里云Linux os copilot 初体验
407 1
阿里云Linux os copilot 运维助手初体验
|
4月前
|
弹性计算 运维 自然语言处理
阿里云OS Copilot测评:重塑Linux运维与开发体验的智能革命
阿里云OS Copilot巧妙地将大语言模型的自然语言处理能力与操作系统团队的深厚经验相结合,支持自然语言问答、辅助命令执行等功能,为Linux用户带来了前所未有的智能运维与开发体验。
|
3月前
|
存储 运维 Shell
运维.Linux.bash学习笔记.数组及其使用
运维.Linux.bash学习笔记.数组及其使用
36 0