运维系列.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中创建、删除、修改用户和用户组,查看用户相关进程、查询用户历史操作等内容。

在这里插入图片描述

目 录


1. 用户和用户组的概念

1.1 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。

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系统中用户和组管理的基础。

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

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信号来终止用户的所有进程。

默认情况下,pkillkillall 发送的是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

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/848354.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LabVIEW FPGA开发NI sbRIO-9607高精度数字滤波器

使用NI sbRIO-9607硬件平台,通过LabVIEW FPGA模块实现一个高精度数字滤波器。该应用不需要额外的实时操作系统 (RT),所有控制与数据处理均在sbRIO-9607的FPGA上完成,充分利用其并行处理能力,实现低延迟、高性能的数据滤波。这种滤…

最新 Navicat Data Modeler 4 | 产品介绍

在过去的几周里,我们已经介绍了 Navicat 版本 17,现在我们来把注意力转移到另外两个值得关注的产品上,即 Navicat Data Modeler 和 Navicat BI(之前称为 Navicat Chart Creator)。今天的博客将介绍 Navicat Data Model…

AI Agent:人类工作范式的颠覆者还是人机协作新范式?

编者按: 当前大热的大语言模型和检索增强生成模型,虽然在语言理解和内容生成方面取得了突破性的进展,但仍然存在诸多限制。它们缺乏根据目标导引行为、持续学习和与环境交互的能力,难以应对复杂多变的现实场景需求。 今天为大家带…

代理IP科普:IP黑名单与IP白名单的机制与作用

在IP代理使用中,我们经常听到黑名单与白名单两个名词,它们不仅提供了强大的防御机制,还可以灵活应对不同的安全威胁。本文将详细探讨IP黑名单和白名单在网络安全中的双重屏障作用。 一、IP黑名单和白名单定义 IP黑名单与IP白名单是网络安全中…

事务管理AOP

通过事务操作 删除部门的时候,同时删除员工,那么如果其中有异常,那么就进行事务回滚 使用注解Trance Transactional-propagation(传播行为)

基于协同过滤算法的东北特产销售系统的设计

基于协同过滤算法的东北特产销售系统的设计 管理员账户功能包括:系统首页,个人中心,管理员管理,基础数据管理,公告管理,新闻信息管理,商品管理 农户账户功能包括:系统首页&#xf…

vue3学习(七)

前言 接上一篇学习笔记,今天主要是分享上次学习完了,还没来得及记录,趁今天晚上换换脑子的时间记录下。 今天主要是记录的vuex文件的拆分,因为毕竟如果只在一个index.js文件写,文件会随着业务的复杂性上升&…

从0-1实现大模型

目录 输入数据准备 滑动窗口造数据 Data sampling with a sliding window 数据加载器的输出DataLoader 位置编码Encoding word positions 自注意力机制 点积的原理 QKV的原理 实现代码 Multi-head Attention 线性层 github: LLMs-from-scratch/ch02/01_main-chapte…

MySQL之查询性能优化(六)

查询性能优化 查询优化器 9.等值传播 如果两个列的值通过等式关联,那么MySQL能够把其中一个列的WHERE条件传递到另一列上。例如,我们看下面的查询: mysql> SELECT film.film_id FROM film-> INNER JOIN film_actor USING(film_id)-> WHERE f…

四川汇聚荣聚荣科技有限公司综合实力怎么样?

在科技日新月异的今天,企业的综合实力成为衡量其市场竞争力的重要指标。四川汇聚荣聚荣科技有限公司作为一家在行业内具有一定影响力的企业,其综合实力如何,自然成为外界关注的焦点。以下将从多个维度深入分析该公司的实力。 一、公司概况与核…

模型测试优化

针对怼螺丝孔场景交叉测试 文章目录 修改一:修改二: 基于训练场景,进行修改,用以验证泛化性 模型说明:训练所用的物体模型上,有两个孔位,其中左侧为1号孔位,右侧为2号孔位 现状&…

QtCharts使用

1.基础配置 1.QGraphicsView提升为QChartView#include <QtCharts> QT_CHARTS_USE_NAMESPACE #include "ui_widget.h"2. QT charts 2.柱状图 2.1QBarSeries //1.创建Qchart对象QChart *chart new QChart();chart->setTitle("直方图演示");//设…

数据结构复习指导之归并排序、基数排序、计数排序

目录 1.归并排序 1.1二路归并操作的功能 1.2算法思想 1.3代码分析 1.4性能分析 2.基数排序 2.1算法思想 2.2基数排序的中间过程的分析 2.3性能分析 3.计数排序 3.1算法思想 3.2代码分析 3.3性能分析 知识回顾 1.归并排序 1.1二路归并操作的功能 归并排序与上述基…

HarmonyOS鸿蒙-DevEco Studio工具

一、官网下载DevEco Studio工具地址 文章内容: 1、下载工具 2、运行项目 3、安装启动器 https://developer.harmonyos.com/cn/develop/deveco-studio/https://developer.harmonyos.com/cn/develop/deveco-studio/ 下载不同平台工具目录 : 二、 安装DevEco Studio工具 安装的配置…

如何令谷歌浏览器搜索时,子页面使用新窗口,而不是迭代打开

1 问题描述 工作相关需要常用谷歌浏览器&#xff0c;但是现在设置就是每次搜索后&#xff0c;点击搜索结果进去之后&#xff0c;都会覆盖掉原来的父页面&#xff0c;也就是如果我看完了这个子页面的内容&#xff0c;关掉的话&#xff0c;我就需要重新google.com来一遍。。。很…

Dinky MySQLCDC 整库同步到 MySQL jar包冲突问题解决

资源&#xff1a;flink 1.17.0、dinky 1.0.2 问题&#xff1a;对于kafka相关的包内类找不到的情况 解决&#xff1a;使用 flink-sql-connector- 胖包即可&#xff0c;去掉 flink-connector- 相关瘦包&#xff0c;解决胖瘦包冲突 source使用 flink-sql-connector- 胖包&#…

Java【springBoot和springCould引入外部jar包】

在项目的研发过程中&#xff0c;我们经常需要导入外部系统提供的jar包&#xff0c;并且这种jar包并没有上传到开源的maven仓库&#xff0c;属于内部环境的包&#xff0c;那么应该如何添加呢&#xff1f; springBoot 1、首先&#xff0c;将你的 JAR 文件拷贝到项目的 resource…

基础数学-求平方根(easy)

一、问题描述 二、实现思路 1.题目不能直接调用Math.sqrt(x) 2.这个题目可以使用二分法来缩小返回值范围 所以我们在left<right时 使 mid (leftright)/21 当mid*mid>x时&#xff0c;说明right范围过大&#xff0c;rightright-1 当mid*mid<x时&#xff0c;说明left范…

使用Qt对word文档进行读写

目录 开发环境原理使用的QT库搭建开发环境准备word模板测试用例结果Gitee地址 开发环境 vs2022 Qt 5.9.1 msvc2017_x64&#xff0c;在文章最后提供了源码。 原理 Qt对于word文档的操作都是在书签位置进行插入文本、图片或表格的操作。 使用的QT库 除了基本的gui、core、…

JavaWeb1 Json+BOM+DOM+事件监听

JS对象-Json //Json 字符串转JS对象 var jsObject Json.parse(userStr); //JS对象转JSON字符串 var jsonStr JSON.stringify(jsObject);JS对象-BOM BOM是浏览器对象模型&#xff0c;允许JS与浏览器对话 它包括5个对象&#xff1a;window、document、navigator、screen、hi…