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

举报
jcLee95 发表于 2024/05/29 23:51:40 2024/05/29
【摘要】 本文介绍Linux中创建、删除、修改用户和用户组,查看用户相关进程、查询用户历史操作等内容。
运维系列
Linux下的用户管理

- 文章信息 -
Author: 李俊才 (jcLee95)
Visit me at CSDN: https://jclee95.blog.csdn.net
My WebSitehttp://thispage.tech/
Email: 291148484@163.com.
Shenzhen China
Address of this article:https://blog.csdn.net/qq_28550263/article/details/139262803
HuaWei:https://bbs.huaweicloud.com/blogs/428280

本文介绍Linux中创建、删除、修改用户和用户组,查看用户相关进程、查询用户历史操作等内容。

在这里插入图片描述


目 录





Linux系统中,用户是指能够登录系统并使用资源的个体。每个用户都有一个唯一的用户名和对应的数字型用户IDUID)。用户可以属于一个或多个用户组。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服务器(如ApacheNginx)的默认用户,syslog用于系统日志服务,messagebus用于D-Bus消息总线系统。

  1. 实际用户:

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


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

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

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

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

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

vim /etc/group

其内容结构如:
在这里插入图片描述


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


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 命令会打印一组有用的用户信息。


示例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


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:打印程序版本。

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

getent passwd

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

在这里插入图片描述

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

getent passwd root

在这里插入图片描述


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

getent group

在这里插入图片描述
也可以指定用户组名以查询特定用户组,如:

getent group utmp

在这里插入图片描述

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

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


在前面的例子中,我们已经初步在各种零散的命令中接触了/etc/passwd/etc/group文件。/etc/passwd/etc/group/etc/shadow等文件共同构成了Linux系统中用户和组管理的基础。

系统管理员可以通过修改这些文件来添加、删除、修改用户和组的信息,但通常建议使用专门的命令(如useraddusermodgroupadd等)来进行这些操作,以确保数据的一致性和完整性。


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

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

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



/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

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


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


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

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

/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日开始的天数)。

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



在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下新增了用户主目录:
在这里插入图片描述


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

sudo passwd [username]

当运行此命令时,系统会提示你输入新密码,并要求再次输入以确认。
现在为为新创建的用户test1test2设置密码:

在这里插入图片描述
可见,当运行此命令时,系统会提示你输入新密码,并要求再次输入以确认。


在创建用户时,可以指定用户的初始登录组(主组)和附加组。这可以通过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

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

su [options] [username]

其中常用选项:

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

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

如切换到root用户:

su

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

su - test2

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


删除用户在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用户创建时没有对应建立,这不影响。)


有时候,管理员可能需要修改现有用户的信息,如更改用户名、用户组、登录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,并设置附加组为 group1  group2

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

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

sudo usermod -aG additionalgroup username

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


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

ps -u username

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

ps -u test1

在这里插入图片描述
可看到,输出将包括进程ID、终端、运行时间和命令名称等信息。


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

使用 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


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


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

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

cat ~/.bash_history

在这里插入图片描述

或者者使用history命令:

history

在这里插入图片描述

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


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


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是一个标签,用于在报告中识别这条规则。


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

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

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


sudo ausearch -k keyname

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


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


用户组的主要作用包括:

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

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

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


在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,第四个字段是属于该组的用户列表(为空表示没有用户)。
通过合理地创建和管理用户组,可以方便地对用户进行分类和权限控制,提高系统的安全性和可管理性。

在这里插入图片描述


在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

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

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


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选项,它专门用于从组中删除用户。


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


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

在这里插入图片描述

【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。