- 文章信息 - Author: 李俊才 (jcLee95)
Visit me at CSDN: https://jclee95.blog.csdn.net
My WebSite:http://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中创建、删除、修改用户和用户组,查看用户相关进程、查询用户历史操作等内容。
目 录
- 1. 用户和用户组的概念
- 2. 用户信息查询
- 2.1 id命令的用法简介
- 2.1 id命令的用法示例
- 示例1:查看当前用户的信息:
- 示例2:查看指定用户的信息
- 示例3:仅显示当前用户的UID
- 示例4:显示当前用户所属的所有组的名称
- 2.1 getent命令
- 3. /etc下的 passwd、group、shadow文件
- 4. 用户的创建、切换、删除
- 5. 用户信息修改
- 6. 用户相关进程
- 7. 用户操作
- 8. 用户组
- 8.1 用户组的作用
- 8.2 用户组的类型
- 8.3 用户组的管理
- 8.3.1 添加用户组
- 8.3.2 删除用户组
- 8.3.3 修改用户组
- groupmod的用法
- 基本示例
- 用户的熟悉的修改
- 用户的添加和移除
- 8.3.4 常用用户组命令合集
- 1. 查看所有用户组
- 2. 查看当前用户的用户组
- 3. 查看指定用户组的用户
- 4. 查看指定用户所属的用户组
- 5. 将用户移除出用户组
- 6. 为指定用户组添加指定现有用户
- 9. 其它命令
1. 用户和用户组的概念 1.1 Linux中的用户
在Linux系统中,用户是指能够登录系统并使用资源的个体。每个用户都有一个唯一的用户名和对应的数字型用户ID(UID)。用户可以属于一个或多个用户组。Linux系统使用用户和用户组来管理对系统资源的访问权限,以确保系统的安全性和稳定性。
用户可以分为以下几类:
- 超级用户(
root
):拥有系统的最高权限,可以执行任何操作。 - 系统用户:由系统创建的用户,通常用于运行特定的服务或程序,如
www-data
(Web服务器用户)、mysql
(MySQL数据库用户)等。 - **普通用户:**由管理员创建的用户,用于日常工作和管理。
用户的信息存储在以下两个文件中:
文件名 | 描述 |
---|---|
/etc/passwd | 存储用户的基本信息,如用户名、UID、主目录、默认Shell等 |
/etc/shadow | 存储用户的密码信息(加密后的密码) |
/etc/passwd如:
可以看出,在Linux系统中,/etc/passwd
文件列出的用户不仅包括实际的人类用户,还包括许多系统用户。这些系统用户主要用于运行和管理系统服务,而不是用于常规的登录和交互。这里是一些关键点来帮助你理解这些用户的存在和目的:
- 系统用户:
这些用户通常用于特定的系统服务和守护进程(如web服务器、数据库服务等)。
系统用户通常不允许登录系统(即它们的shell
通常设置为/usr/sbin/nologin或/bin/false
),这是为了安全性,防止这些用户被用于普通的登录。
例如,www-data
是web服务器(如Apache或Nginx)的默认用户,syslog
用于系统日志服务,messagebus
用于D-Bus消息总线系统。
- 实际用户:
实际用户是指那些可以登录系统并进行交互的用户账户。这些用户的shell通常设置为/bin/bash或其他有效的shell。
1.1 用户组的概念
用户组是 具有相似 属性 或 权限 的用户的集合。每个用户组也有一个 唯一的组名 和 对应的 数字型组ID(GID)。 用户组的存在简化了对用户的管理,可以方便地对一组用户进行权限控制。
用户组可以分为以下两类:
- 主要组(Primary Group):用户的默认组,在创建用户时指定。用户创建的文件的所属组默认为该用户的主要组。
- 附属组(Secondary Group):用户可以属于多个附属组,以获得对应组的权限。
用户组的信息存储在以下文件中:
文件名 | 描述 |
---|---|
/etc/group | 存储用户组的基本信息,如组名、GID等 |
通过合理地规划和管理用户及用户组,可以有效地控制用户对系统资源的访问,提高系统的安全性和可管理性。
你可以使用vim打开/etc/group文件(也可以用cat命令简单查看):
vim /etc/group
其内容结构如:
2. 用户信息查询
在 Linux 系统中,可以使用id
命令查询用户的信息。该命令可以显示指定用户或当前用户的 用户ID(UID)、组ID(GID)以及所属的用户组信息。
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
这些字段的含义如下:
username
:用户名。password
:密码字段,在现代Linux系统中通常为x
,实际的密码哈希存储在/etc/shadow
文件中。UID
:用户ID(User Identifier)。GID
:用户的主组ID(Group Identifier)。GECOS
:用户的全名或注释字段。directory
:用户的主目录。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
groupname
:组名。password
:组密码字段,通常为x,表示使用/etc/gshadow文件中的密码。GID
:组ID(Group Identifier)。user_list
:属于该组的用户列表,用户名之间用逗号(,)分隔。
3.3 shadow文件
/etc/shadow
文件存储了用户密码的加密哈希值以及密码策略信息。这个文件的权限通常比较严格(只有root可读写),以保护用户密码的安全。每行代表一个用户,字段之间用冒号(:
)分隔,例如:
可以看到一个用户行中,主要字段包括:
username:encrypted_password:last_change:min_days:max_days:warn_days:inactive_days:expiration_date
其中:
username
:用户名。encrypted_password
:加密后的密码哈希值。last_change
:上次修改密码的日期(从1970年1月1日开始的天数)。min_days
:两次修改密码之间所需的最小天数。max_days
:密码的最长有效期(天数)。warn_days
:密码过期前多少天开始警告用户。inactive_days
:密码过期后多少天禁用账户。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]
当运行此命令时,系统会提示你输入新密码,并要求再次输入以确认。
现在为为新创建的用户test1
、test2
设置密码:
可见,当运行此命令时,系统会提示你输入新密码,并要求再次输入以确认。
4.1.3 创建时指定用户组(-g、-G)
在创建用户时,可以指定用户的初始登录组(主组)和附加组。这可以通过useradd
命令的-g
(指定主组)和-G
(指定附加组)选项来实现。
sudo useradd -g [主组] -G [附加组1,附加组2,...] [username]
-
-g
选项后跟用户的主组ID或名称。 -
-G
选项后跟一个或多个附加组ID或名称,用逗号分隔。
例如,先创建一个名为wheel
的用户组,再创建一个名为test3
的用户,将其主组设置为users
,并将其添加到wheel
和audio
两个附加组:
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。
- 更改用户名:
将用户名从 oldname 更改为 newname:
sudo usermod -l newname oldname
- 更改用户主目录:
更改用户 username
的主目录到 /new/home/dir
并移动现有内容:
sudo usermod -d /new/home/dir -m username
- 更改登录Shell:
更改用户 username
的登录Shell为 /bin/zsh
:
sudo usermod -s /bin/zsh username
- 更改用户的主组和附加组:
更改用户 username
的主组为 newgroup
,并设置附加组为 group1
和 group2
:
sudo usermod -g newgroup -G group1,group2 username
- 添加用户到附加组而不移除现有组:
将用户 username
添加到 additionalgroup
组,同时保留其在其他组的成员资格:
sudo usermod -aG additionalgroup username
6. 用户相关进程
管理和查询特定用户的进程是常见的系统管理任务,比如当你删除一个用户时,就需要关闭这个用户跑起来的进程。管理和查询特定用户的进程还可以帮助管理员监控资源使用情况、终止不需要的进程或调试用户级的应用问题。
6.1 查询指定用户的所有进程
使用 ps
命令结合适当的选项可以列出特定用户的所有进程:
ps -u username
例如查看当前用户test1对应的所有进程:
ps -u test1
可看到,输出将包括进程ID、终端、运行时间和命令名称等信息。
6.2 终止指定用户的所有进程
如果需要终止某个用户的所有进程,可以使用 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
。
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命令创建用户组的示例:
- 创建一个名为team1的普通用户组:
sudo groupadd team1
- 创建一个名为sysadmins的系统用户组:
sudo groupadd -r sysadmins
- 创建一个名为developers的用户组,并指定GID为1500:
sudo groupadd -g 1500 developers
- 创建一个名为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
将用户john
从managers
组中移除:
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