运维系列.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

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

[RK3588-Android12] 关于BQ25703充电IC+CW2017电量计调试

问题描述 BQ25703充电ICCW2017电量计调试 解决方案&#xff1a; 附上dts配置文件 &i2c6 {clock-frequency <400000>;status "okay";// CONFIG_BATTERY_CW2017cw2017: cw201763 {status "okay";compatible "cellwise,cw2017";re…

数字影像产业园的三大赋能:科技、创新与无限可能

数字影像产业园作为文创产业的重要载体&#xff0c;以科技为核心驱动力&#xff0c;不断推动产业的技术革新和升级。 园区内汇聚了最前沿的数字技术资源&#xff0c;高清摄影设备、虚拟现实技术、人工智能应用等尖端科技在这里得到广泛应用&#xff0c;不仅提升了生产效率&…

如何一键批量下载淘宝高清主图、详情图、sku及视频信息

图片对电商至关重要&#xff0c;因为它们是商品展示的主要方式&#xff0c;直接影响消费者的购买决策。高质量的图片能够吸引顾客注意&#xff0c;提升产品吸引力&#xff0c;增加点击率和转化率。此外&#xff0c;好的图片还有助于建立品牌形象&#xff0c;提高客户信任度。 …

算法金 | 10 大必知的自动化机器学习库(Python)

大侠幸会&#xff0c;在下全网同名[算法金] 0 基础转 AI 上岸&#xff0c;多个算法赛 Top [日更万日&#xff0c;让更多人享受智能乐趣] 一、入门级自动化机器学习库 1.1 Auto-Sklearn 简介&#xff1a; Auto-Sklearn 是一个自动机器学习库&#xff0c;基于 Python 的 scikit…

IP黑名单与IP白名单是什么?

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

AI技能培训课程知识付费小程序的作用是什么

AI近些年逐渐走入工作生活中&#xff0c;如AI创作/绘图/视频/配音/渲染等&#xff0c;妙用AI可以节约大量时间和带来灵感&#xff0c;不少平台或个人也在围绕其开展生意&#xff0c;技术在不断进步&#xff0c;对此感兴趣及想要应用的用户/单位也不少&#xff0c;但苦于不掌握不…

linux信号集与信号掩码-保护信号处理程序,确保进程正确运行

在Linux环境下&#xff0c;当进程收到信号时&#xff0c;如何优雅地处理并确保程序的正常运行?这就需要借助信号集和信号掩码的功能。本文将为你揭开信号集和信号掩码的神秘面纱&#xff0c;并通过生动的代码示例&#xff0c;让你彻底掌握在C程序中使用它们的技巧。 一、信号集…

【雷丰阳-谷粒商城 】【分布式基础篇-全栈开发篇】【06】【商品服务】接口文档地址_三级分类_SPU_SKU

持续学习&持续更新中… 学习态度&#xff1a;守破离 【雷丰阳-谷粒商城 】【分布式基础篇-全栈开发篇】【06】【商品服务】接口文档地址_三级分类_SPU_SKU 接口文档地址三级分类效果图建表后台组建数据的树形结构在人人(后台管理系统)中实现管理商品的三级分类路径规则使用…

开关电源基本原理1

目录 内容概述 关于电感 认识电感 电感充电 电感储能 电感充电 电感参数 电感放电 利用电感升压 电感电流波形 伏秒法则 电流纹波率 电感电流三种导电模式 电流纹波率与频率的关系 电流纹波率与电感值的关系 电感值与电感体积 电路纹波率r的最优值 电感值与电…

出行预测:端午打车需求将上涨31%,滴滴发放超2亿司机补贴

作为上半年的“收官”小长假&#xff0c;端午假期接棒“五一”的出行热度&#xff0c;中短途周边游持续升温&#xff0c;海滨旅行、龙舟民俗体验成为新的出行看点。 滴滴出行预测&#xff0c;端午节当天&#xff08;6月10日&#xff09;打车需求将同比去年上涨约31%。今年端午…

[数据集][图像分类]十二生肖分类数据集8492张12类别

数据集类型&#xff1a;图像分类用&#xff0c;不可用于目标检测无标注文件 数据集格式&#xff1a;仅仅包含jpg图片&#xff0c;每个类别文件夹下面存放着对应图片 图片数量(jpg文件个数)&#xff1a;8492 分类类别数&#xff1a;12 类别名称:["dog","dragon&q…

【RISC-V】站在巨人的肩膀上——看开源芯片、软件生态、与先进计算/人工智能/安全的结合

目录 会议议程专题二&#xff1a;RISC-V与先进计算基于RISC-V的后量子密码芯片设计&#xff0c;刘冬生&#xff0c;华中科技大学存算一体集成芯片&#xff0c;刘琦&#xff0c;复旦大学面向端侧大模型计算的RISC-V矩阵扩展架构&#xff0c;复旦大学&#xff0c;韩 军 专题五&am…

电子电气架构 —— 刷写模式:并行刷写

电子电气架构 —— 刷写模式:并行刷写 我是穿拖鞋的汉子,魔都中坚持长期主义的工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 人们会在生活中不断攻击你。他们的主要武器是向你灌输对自己的怀疑:你的价值、你的能力、你的潜力。他们往往会将此…

云原生架构案例分析_5.某体育用品公司云原生架构的业务中台构建

1.背景和挑战 某体育用品公司作为中国领先的体育用品企业之一&#xff0c;在2016年&#xff0c;某体育用品公司启动集团第三次战略升级&#xff0c;打造以消费者体验为核心的“3”&#xff08;“互联网”、“体育”和“产品”&#xff09;的战略目标&#xff0c;积极拥抱云计算…

基于GFlowNets的蚁群抽样组合优化

本文将基于GFACS论文&#xff0c;探讨其核心思想、技术细节以及在实际应用中的优势。 GFlowNet&#xff1a;摊销MCMC成本的有效工具 GFACS的核心是GFlowNet&#xff0c;它通过训练学习状态转移的概率分布&#xff0c;从而替代传统的MCMC采样方法。GFlowNet的优势在于&#xff1…

Java——循环语句

下面我们介绍循环控制结构。如果您想要同样的操作执行多次&#xff0c;就需要使用循环结构。Java中有三种主要的循环结构&#xff1a; for 循环while 循环do…while 循环 一、for 循环 for循环是一种控制结构&#xff0c;用于反复执行一段代码&#xff0c;直到满足指定的条件…

每天五分钟深度学习PyTorch:Tensor张量的索引和切片

本文重点 有时候当我们拥有一个Tensor张量的时候,我们可能需要获取它某一维度的信息,那么此时我们就需要索引和切片的技术,它们可以帮助我们解决这些问题。 切片操作 a是四维的,然后默认是从第一维开始取,逗号表示取不同的维度 a[:2]表示第一维取0,1,后面三维取所有 …

JAVA小案例-分别计算100以内奇数和偶数的和

JAVA小案例-分别计算100以内奇数和偶数的和 没啥可说的&#xff0c;就是for循环加if分支&#xff0c;也可以用while写。 代码如下&#xff1a; public class Jiouhe {/*** 分别计算100以内奇数和偶数的和* param args*/public static void main(String[] args){int sum10;in…

C语言数据结构快速排序的非递归、归并排序、归并排序的非递归等的介绍

文章目录 前言一、快速排序非递归二、归并排序五、归并排序非递归总结 前言 C语言数据结构快速排序的非递归、归并排序、归并排序的非递归等的介绍 一、快速排序非递归 快速排序非递归的定义 快速排序非递归&#xff0c;需要使用栈来实现。将左右下标分别push到栈中。在栈为…

【ubuntu软件版本管理】利用update-alternatives管理ubuntu软件

​ 我们有的时候希望在安装了新软件之后保留旧版本的软件&#xff0c;比如希望保留旧版本的gcc&#xff0c;以防以前写的C编译出问题&#xff0c;这时候就需要版本管理软件update-alternatives。 ​ 在此之前我们需要先弄清楚&#xff0c;什么是ubuntu的软件&#xff1f;拿C源…