Linux 用户管理相关命令与配置文件详解

前言

  最近在搞 Linux 的用户管理,所以将一些知识进行简单的整理,分享给大家,也作为自己的学习笔记!

  passswdshadowgroup配置文件位于/etc目录下,这三个文件记录了系统用户信息以及用户登陆密码,这些文件的生成与修改与adduser、addgroup以及passwd命令相关。
  走读busybox源码可以发现,使用adduser新增用户时,该命令内部是会调用到addgroup以及passwd命令的实现函数的,所以只使用adduser就可以同时生成或修改这三个配置文件。

  如果你理解了这三个文件的内容组成以及含义,也可以手动编辑其中的内容,并不需要依赖这几个命令。

一、用户管理相关命令(busybox成果物)

  在 Linux 操作系统中,用户管理是系统管理的重要部分,涉及用户账户的创建、修改、删除以及权限控制等。

1. adduser

  在 BusyBox 中,adduser 命令用于创建新用户或将现有用户添加到组中。这个命令的用法和选项非常简洁。下面是每个选项的详细解释:

adduser 命令用法

adduser [OPTIONS] USER [GROUP]

选项详解

  • -h DIR:

    • 指定用户的主目录。如果未指定,通常会使用系统默认的主目录路径。
  • -g GECOS:

    • 设置用户的 GECOS 字段(通常用于存储用户的全名和其他信息)。这可以是一个简单的描述或其他用户信息。
  • -s SHELL:

    • 设置用户的登录 Shell。默认情况下,系统会使用 /bin/sh 或其他默认 Shell。
  • -G GRP:

    • 将用户添加到指定的组。如果你在创建用户时指定了这个选项,那么用户将被添加到这个组。
  • -S:

    • 创建一个系统用户。系统用户通常用于系统服务,而不是普通用户,通常具有较低的 UID。
  • -D:

    • 创建用户时不分配密码。用户将没有密码,无法通过正常的身份验证方法登录。
  • -H:

    • 创建用户时不创建主目录。默认情况下,用户的主目录会被创建。
  • -u UID:

    • 指定用户的 UID。UID 是用户在系统中的唯一标识符。如果未指定,系统会自动分配一个 UID。
  • -k SKEL:

    • 指定骨架目录(Skeleton Directory)。骨架目录是一个包含用户主目录的初始文件和目录的模板。默认情况下,系统会使用 /etc/skel

示例用法

  1. 创建一个新用户

    adduser -h /home/johndoe -g "John Doe" -s /bin/bash -u 1001 johndoe
    

    这条命令会创建一个用户名为 johndoe 的用户,主目录为 /home/johndoe,GECOS 字段为 "John Doe",登录 Shell 为 /bin/bash,UID 为 1001。

  2. 创建一个系统用户

    adduser -S -u 2001 systemuser
    

    这条命令会创建一个 UID 为 2001 的系统用户 systemuser,没有密码,主目录也不会被创建。

  3. 创建用户并指定组

    adduser -G developers -u 1002 alice
    

    这条命令会创建一个用户名为 alice 的用户,UID 为 1002,并将用户添加到 developers 组中。

  4. 创建用户不分配密码和主目录

    adduser -D -H -u 1003 newuser
    

    这条命令会创建一个 UID 为 1003 的用户 newuser,没有密码,并且不创建主目录。

  5. 创建用户并指定骨架目录

    adduser -k /custom/skel -h /home/customuser -u 1004 customuser
    

    这条命令会使用 /custom/skel 作为骨架目录,创建一个 UID 为 1004 的用户 customuser,主目录为 /home/customuser

总结

  adduser 命令在 BusyBox 中提供了创建用户和管理用户组的基本功能。通过不同的选项,你可以灵活地指定用户的详细属性,如 UID、主目录、GECOS 字段等。根据实际需要,选择合适的选项来配置用户。

2. addgroup

  在 BusyBox 中,addgroup 命令用于添加一个新组或将用户添加到现有组。该命令的用法和选项很简单,具体如下:

addgroup 命令用法

addgroup [-g GID] [-S] [USER] GROUP

选项详解

  • -g GID:

    • 指定组的 GID(组 ID)。GID 是系统中唯一标识组的数字。如果未指定,系统会自动分配一个 GID。
  • -S:

    • 创建一个系统组。系统组通常用于系统服务,而不是普通用户组,通常具有较低的 GID。
  • [USER]:

    • 在添加组的同时,将指定的用户添加到该组。如果你在创建组时提供了用户名,用户会被自动添加到新创建的组中。
  • GROUP:

    • 指定要创建的组的名称。如果该名称已经存在,则用户将被添加到现有的组中。

示例用法

  1. 创建一个新组

    addgroup mygroup
    

    这条命令会创建一个名为 mygroup 的新组,系统会自动分配一个 GID。

  2. 创建一个具有指定 GID 的新组

    addgroup -g 1001 mygroup
    

    这条命令会创建一个名为 mygroup 的新组,并指定 GID 为 1001。

  3. 创建一个系统组

    addgroup -S sysgroup
    

    这条命令会创建一个名为 sysgroup 的系统组,系统组通常具有较低的 GID。

  4. 创建一个组并将用户添加到该组

    addgroup -g 1002 -S mygroup john
    

    这条命令会创建一个名为 mygroup 的系统组,GID 为 1002,并将用户 john 添加到该组。

  5. 将现有用户添加到现有组

    addgroup john mygroup
    

    这条命令会将用户 john 添加到名为 mygroup 的现有组中。如果 mygroup 不存在,则不会创建组。

总结

  addgroup 命令在 BusyBox 中用于创建新的用户组或将用户添加到组中。通过使用 -g-S 选项,你可以控制组的 GID 和是否创建系统组。此外,你可以在创建组的同时将用户添加到组中,简化了用户管理的过程。根据你的需求选择合适的选项来配置和管理组。

3. passwd

  busybox 中的 passwd 命令允许你更改用户密码以及管理用户账户。根据你提供的信息,这里是 passwd 命令的详细选项说明:

passwd命令用法

busybox passwd [OPTIONS] [USER]
  • USER:指定要更改密码的用户名。如果未指定用户名,passwd 将会更改当前用户的密码。

选项详解

  • -a:指定用于密码的加密算法。支持的算法包括:

    • des:传统的 DES 加密算法。
    • md5:更安全的 MD5 加密算法。
    busybox passwd -a md5 username
    

    上述命令将使用 MD5 算法来加密 username 的新密码。

  • -d:删除指定用户的密码,使得账户变为无密码状态。这通常不建议使用,因为它会使账户变得不安全。

    busybox passwd -d username
    
  • -l:锁定(禁用)用户账户。锁定账户后,即使输入正确的密码,用户也不能登录。

    busybox passwd -l username
    
  • -u:解锁(重新启用)用户账户。用于解除之前用 -l 锁定的账户。

    busybox passwd -u username
    

示例用法

  1. 更改当前用户的密码

    直接运行 passwd 命令,将会提示你输入当前密码以及新密码。

    busybox passwd
    
  2. 为指定用户更改密码

    如果要为用户 username 更改密码,请使用以下命令。

    sudo busybox passwd username
    

    系统将会提示你输入新密码。

  3. 使用指定算法更改密码

    如果你想指定密码加密算法(例如使用 MD5),可以运行:

    sudo busybox passwd -a md5 username
    
  4. 删除用户密码

    使 username 的账户变为无密码状态:

    sudo busybox passwd -d username
    
  5. 锁定用户账户

    锁定用户 username 的账户:

    sudo busybox passwd -l username
    
  6. 解锁用户账户

    解锁之前锁定的用户账户 username

    sudo busybox passwd -u username
    

总结

  • 安全性:删除用户密码 (-d) 或锁定用户账户 (-l) 可能会影响系统的安全性。务必根据需要小心使用这些选项。
  • 权限:某些操作(如更改其他用户的密码)可能需要超级用户权限(使用 sudo)。

  这些选项使得 busybox passwd 命令可以用于多种用户账户管理任务,包括密码设置、账户锁定和解锁等。

4. mkpasswd

  busyboxmkpasswd 命令是一个用于生成密码散列的工具,通常用于创建用户密码的加密形式。它是 busybox 提供的许多命令中的一个,主要用于嵌入式系统和其他资源受限的环境中。

  mkpasswd 命令用于根据提供的密码生成加密密码,这些加密密码可以用于 passwd /shadow文件或其他需要加密密码的场景。

mkpasswd命令用法

busybox mkpasswd [OPTIONS] PASSWORD
  • PASSWORD:要加密的原始密码。

选项详解

mkpasswd 支持几种不同的加密算法,具体选项可能会有所不同,取决于 busybox 的版本和配置。以下是一些常见的选项:

  • -m METHOD:指定加密方法。常见的方法包括 md5sha-256sha-512。这些方法用于决定密码的散列算法。

    mkpasswd -m md5 PASSWORD
    mkpasswd -m sha-256 PASSWORD
    mkpasswd -m sha-512 PASSWORD
    
  • -s SALT:指定一个盐值(salt)。盐值用于增加密码散列的复杂性,避免相同密码产生相同的散列值。某些算法(如 md5)可能需要一个盐值。

    busybox mkpasswd -s SALT PASSWORD
    
  • -h:显示帮助信息,列出所有可用的选项和用法。

    mkpasswd -h
    

示例用法

  1. 使用 MD5 算法生成加密密码

    mkpasswd -m md5 mypassword
    

    这将输出一个基于 MD5 散列的密码字符串。

  2. 使用 SHA-256 算法生成加密密码

    mkpasswd -m sha-256 mypassword
    

    这将输出一个基于 SHA-256 散列的密码字符串。

  3. 使用盐值生成加密密码

    mkpasswd -m sha-512 -s mysalt mypassword
    

    这将输出一个基于 SHA-512 散列和指定盐值的密码字符串。

总结

  • mkpasswd 生成的加密密码可以直接用于 passwd 文件中的相应字段,或在其他需要密码散列的地方使用。
  • 密码散列是单向的,不可逆的,所以即使知道加密方法和盐值,也无法从散列值恢复原始密码。
  • 不同版本的 busybox 可能对 mkpasswd 支持的选项和功能有所不同。具体的选项和用法可以通过 busybox mkpasswd -h 查看。

mkpasswd 是一个实用的工具,用于在嵌入式系统和其他受限环境中管理密码散列。

二、配置文件详解

1. /etc/passwd 文件

  /etc/passwd 文件是 Unix 和类 Unix 操作系统中用于存储用户账户信息的文件。虽然在现代系统中,实际的用户密码信息通常存储在 /etc/shadow 文件中,但是 /etc/passwd 仍然保存了用户的基本信息。以下是 /etc/passwd 文件的详细说明:

文件格式

  /etc/passwd 文件中的每一行表示一个用户账户,格式如下:

用户名:密码:用户ID:组ID:用户信息:主目录:登录Shell

  每个字段由冒号 : 分隔。下面详细解释每个字段的含义:

  1. 用户名 (Username):

    • 这是用户账户的名称,用于登录系统。这个字段必须是唯一的。例如:rootalicebob
  2. 密码 (Password):

    • 这个字段通常是一个占位符,用于密码的加密信息。在现代系统中,这里通常是一个x*,真正的密码信息存储在 /etc/shadow 文件中以增强安全性。例如:x*
  3. 用户ID (UID):

    • 这是用户的唯一数字标识符。系统通过这个ID来区分不同的用户。系统用户(如 root)通常有低于1000的UID,而普通用户则通常从1000或更高的UID开始。例如:0(通常是root用户),10011002
  4. 组ID (GID):

    • 这是用户主组的唯一数字标识符。用户的主组在 /etc/group 文件中定义。例如:0(通常是root组),10011002
  5. 用户信息 (GECOS field):

    • 这个字段包含了用户的额外信息,如全名、电话等。这个字段是可选的,通常用于记录一些用户的描述性信息。例如:Alice SmithSystem Administrator
  6. 主目录 (Home Directory):

    • 用户登录后的默认目录。例如:/home/alice。用户可以在这个目录中存储自己的文件和配置。
  7. 登录Shell (Login Shell):

    • 用户登录后默认启动的shell程序。例如:/bin/bash/bin/sh。如果用户没有设置shell,可能会是 /sbin/nologin/bin/false,这意味着该用户不能登录系统。

示例

  下面是一个 /etc/passwd 文件的示例行:

alice:x:1001:1001:Alice Smith,,,:/home/alice:/bin/bash

这个示例行表示:

  • 用户名是 alice
  • 密码字段是 x,表示实际密码存储在 /etc/shadow 中。
  • 用户ID (UID) 是 1001
  • 组ID (GID) 是 1001
  • 用户信息字段包含 Alice Smith
  • 用户主目录是 /home/alice
  • 登录Shell 是 /bin/bash

安全注意事项

  • 密码安全/etc/passwd 文件中的密码字段不应包含实际的密码信息。实际密码存储在 /etc/shadow 文件中,具有更严格的权限控制。
  • 文件权限/etc/passwd 文件通常应该设置为644权限(-rw-r--r--),以确保它对所有用户可读,但只有超级用户可以修改。

总结

  /etc/passwd 文件是Unix和类Unix系统中保存用户基本信息的核心文件之一。它提供了有关用户的身份信息、主目录和登录Shell等基本信息,虽然密码信息已被移至 /etc/shadow 文件以增强安全性。

2. /etc/shadow 文件

  /etc/shadow 文件在 Unix 和类 Unix 操作系统中用于存储用户的加密密码和与密码相关的信息。与 /etc/passwd 文件相比,/etc/shadow 提供了更高的安全性,因为它的内容通常只有超级用户(root)才有权限访问。以下是 /etc/shadow 文件的详细说明:

文件格式

  /etc/shadow 文件中的每一行表示一个用户的密码信息,格式如下:

用户名:加密密码:上次更改密码的日期:最小密码年龄:最大密码年龄:密码过期前警告天数:密码过期后禁用天数:账户过期日期:保留字段

  每个字段由冒号 : 分隔。下面详细解释每个字段的含义:

  1. 用户名 (Username):

    • 这是用户账户的名称,与 /etc/passwd 文件中的用户名相对应。例如:alice
  2. 加密密码 (Password):

    • 这是用户密码的加密哈希值。如果字段中包含字符*!,则表示用户账户被锁定,无法登录。常见的情况是:
      • 空字段:表示用户没有设置密码或密码未设置(在某些系统中为空也可以表示禁用)。
      • *!:表示用户账户被锁定,不能使用密码进行登录。
      • 加密的密码哈希值:实际存储的用户密码的加密形式。
  3. 上次更改密码的日期 (Last Changed):

    • 这是自 1970 年 1 月 1 日以来的天数,表示用户上次更改密码的时间。例如:18500 表示用户在 18500 天前更改过密码。
  4. 最小密码年龄 (Minimum Age):

    • 密码可以被更改的最短天数。值为0表示用户可以随时更改密码。非零值表示必须等待一定天数才能更改密码。
  5. 最大密码年龄 (Maximum Age):

    • 密码的最大有效期。到达这个天数后,用户需要更改密码。例如:90 表示密码在 90 天后过期。
  6. 密码过期前警告天数 (Warning Period):

    • 当密码过期前的天数,系统开始警告用户更改密码。例如:7 表示在密码过期前 7 天开始警告。
  7. 密码过期后禁用天数 (Inactive Period):

    • 密码过期后,账户将被禁用的天数。例如:30 表示在密码过期后 30 天内,账户将被禁用。
  8. 账户过期日期 (Account Expiry Date):

    • 账户到期的日期,以自 1970 年 1 月 1 日以来的天数表示。到期后,账户将被禁用。例如:19000 表示账户在 19000 天后到期。
  9. 保留字段 (Reserved Field):

    • 目前没有使用的字段,通常保留为空。

示例

  下面是一个 /etc/shadow 文件的示例行:

alice:$6$abcd1234$eJ4KJ9tjBrY8PQW.2cHb26uK9BcQmsZbO6A2D7TY7fOe2MCCLwzzO/7N5qYMjG9nG6h8f88tRkPSSyMZBQ.:18500:0:90:7:30:19000:

这个示例行表示:

  • 用户名是 alice
  • 加密密码是 $6$abcd1234$eJ4KJ9tjBrY8PQW.2cHb26uK9BcQmsZbO6A2D7TY7fOe2MCCLwzzO/7N5qYMjG9nG6h8f88tRkPSSyMZBQ.(使用 SHA-512 哈希)。
  • 上次更改密码的日期是自 1970 年 1 月 1 日以来的 18500 天。
  • 最小密码年龄是 0 天,表示用户可以随时更改密码。
  • 最大密码年龄是 90 天。
  • 密码过期前的警告天数是 7 天。
  • 密码过期后的禁用天数是 30 天。
  • 账户过期日期是自 1970 年 1 月 1 日以来的 19000 天。
  • 保留字段为空。

安全注意事项

  • 文件权限/etc/shadow 文件应该设置为 600 权限(-rw-------),以确保只有超级用户可以读取和修改它。
  • 密码加密:加密的密码应该使用强加密算法(如 SHA-512),以增强安全性。
  • 账户管理:合理设置密码过期和账户过期策略,以确保系统的安全性。

总结

  /etc/shadow 文件是 Unix 和类 Unix 系统中用于管理用户密码和账户过期信息的重要文件。它提供了关于密码加密、密码有效期、账户过期等信息,并通过严格的权限控制来保护敏感数据。

3. /etc/group 文件

/etc/group 文件在 Unix 和类 Unix 操作系统中用于存储用户组的信息。每一行代表一个用户组,并包含有关组的基本信息。以下是 /etc/group 文件的详细说明:

文件格式

  /etc/group 文件中的每一行表示一个用户组,格式如下:

组名:密码:组ID:组成员

  每个字段由冒号 : 分隔。下面详细解释每个字段的含义:

  1. 组名 (Group Name):

    • 这是用户组的名称。这个字段必须是唯一的,并且通常用于标识用户组。用户组的名称应该简短且具有描述性。例如:wheeldevelopersadmins
  2. 密码 (Password):

    • 这个字段通常为空或包含一个特殊字符(如 x),表示组的密码信息不再使用,实际密码存储在其他地方(通常不再使用)。在现代系统中,这个字段一般为空或者是 x,表示组没有设置密码。例如:空字段或 x
  3. 组ID (GID):

    • 这是组的唯一数字标识符。系统通过这个ID来区分不同的用户组。GID必须是唯一的。系统组通常有低于1000的GID,而普通用户组则通常从1000或更高的GID开始。例如:0(通常是root组),10011002
  4. 组成员 (Group Members):

    • 这是一个以逗号分隔的用户列表,表示属于该组的用户。一个用户可以属于多个组。该字段可以为空,表示该组没有其他成员。例如:alice,bob,charlie

示例

  下面是一个 /etc/group 文件的示例行:

developers:x:1001:alice,bob,charlie

这个示例行表示:

  • 用户组名是 developers
  • 密码字段是 x,表示组没有密码设置。
  • 组ID (GID) 是 1001
  • 组成员包括 alicebobcharlie

文件权限

  • 权限设置/etc/group 文件通常应设置为 644 权限(-rw-r--r--),以确保所有用户可以读取文件,但只有超级用户可以修改。、

注意事项

  • 组管理:使用适当的工具(如 groupaddgroupdelgroupmod)来管理用户组,以确保系统的一致性和安全性。

  • 用户组的用途

  • 用户组用于管理文件和目录的访问权限,可以设置组权限以允许或拒绝对文件的访问。

  • 通过将用户添加到适当的组,可以控制他们的权限,例如,某些应用程序或服务可能要求用户属于特定的组才能访问其功能。

  • 密码字段的历史

  • 在早期的系统中,用户组可以设置密码以限制谁可以成为该组的成员。然而,现代系统大多不使用此功能,密码字段一般为空或为 x

新增和修改用户组

  • 新增组:可以使用以下命令添加新的组:
sudo groupadd newgroup
  • 删除组:使用以下命令删除组:
sudo groupdel groupname
  • 添加用户到组:可以使用以下命令将用户添加到已存在的组中:
sudo usermod -aG groupname username

总结

/etc/group 文件在 Unix 和类 Unix 系统中用于存储用户组的信息,包括组名称、密码、组ID 和组成员等。它是系统用户和组管理的重要组成部分,确保系统的权限控制和用户管理得以实现。

三、Linux系统中的用户和组,用户id和组id详解

  在 Linux 系统中,用户和组是管理系统访问权限的核心概念。用户和组的身份通过用户ID(UID)和组ID(GID)来唯一标识。以下是对 Linux 系统中用户和组、UID 和 GID 的详细解释:

1. 用户和组概述

  • 用户 (User):在 Linux 系统中,用户是系统的基本操作实体。每个用户都有一个唯一的用户名和一个用户ID(UID)。用户可以是系统管理员、普通用户或服务账户等。

  • 组 (Group):组是用户的集合,允许对一组用户施加相同的权限。每个组都有一个唯一的组名和一个组ID(GID)。组可以包含多个用户,通过将用户添加到组中,可以简化权限管理。

2. 用户ID (UID)

  • UID 的作用:

    • UID 是用于唯一标识用户的数字。操作系统使用 UID 来控制对系统资源的访问权限,而不是通过用户名。
  • 常见 UID 范围:

    • 0:系统超级用户(root)的 UID。拥有系统上的所有权限。
    • 1-999:系统用户和组的 UID 范围,通常用于系统和服务账户。例如,daemonmail 等。
    • 1000 及以上:普通用户的 UID 范围。普通用户从 UID 1000 或更高的值开始。
  • UID 分配:

    • 用户在创建时被分配一个 UID。UID 的分配通常由系统自动管理,通过用户管理工具(如 useraddusermod)可以查看和修改用户的 UID。

3. 组ID (GID)

  • GID 的作用:

    • GID 是用于唯一标识用户组的数字。操作系统通过 GID 来管理组的权限,而不是通过组名。
  • 常见 GID 范围:

    • 0:系统组(如 root 组)的 GID。
    • 1-999:系统组的 GID 范围,通常用于系统服务和特殊功能组。
    • 1000 及以上:普通用户组的 GID 范围。普通用户组从 GID 1000 或更高的值开始。
  • GID 分配:

    • 组在创建时被分配一个 GID。GID 的分配通常由系统自动管理,通过组管理工具(如 groupaddgroupmod)可以查看和修改组的 GID。

4. 配置文件中的 UID 和 GID

  1. /etc/passwd:

    • 存储用户账户的信息,包括用户名、UID、主组ID(GID)、用户主目录和登录Shell。
    • 示例行:
      alice:x:1001:1001:Alice Smith,,,:/home/alice:/bin/bash
      
      其中 1001 是 UID,1001 是主组 GID。
  2. /etc/group:

    • 存储用户组的信息,包括组名、GID 和组成员。
    • 示例行:
      developers:x:1001:alice,bob,charlie
      
      其中 1001 是 GID。
  3. /etc/shadow:

    • 存储用户密码信息和与密码相关的策略。此文件不包含用户组的信息,但用户的 UID 在此文件中用来验证用户身份。

5. 示例命令

  • 查看当前用户的 UID 和 GID:

    id
    

    输出示例:

    uid=1001(alice) gid=1001(developers) groups=1001(developers),27(sudo)
    
  • 查看特定用户的 UID 和 GID:

    id alice
    
  • 列出所有用户及其 UID:

    cut -d: -f1,3 /etc/passwd
    
  • 列出所有组及其 GID:

    cut -d: -f1,3 /etc/group
    

6. 总结

  在 Linux 系统中,用户通过 UID 和组通过 GID 被唯一标识。UID 和 GID 的管理和分配对于系统的安全性和权限管理至关重要。通过了解和正确配置这些标识符,可以有效地控制用户和组的权限,确保系统的安全和稳定运行。

四、Linux中获取用户与组信息的方法

  在 Linux 系统中,获取当前用户名、用户ID(UID)、组名和组ID(GID)可以通过不同的 API 或命令实现。以下是几种常见的方法来获取这些信息:

1. 使用 getpwuidgetgrgid 函数(C 语言 API)

  在 C 语言程序中,可以使用 POSIX 标准库函数 getpwuidgetgrgid 来获取用户和组的信息。

getpwuid 函数

函数原型:

#include <pwd.h>

struct passwd *getpwuid(uid_t uid);
  • 功能
    getpwuid 函数根据给定的用户 ID (uid) 查找用户信息,并返回一个指向 passwd 结构体的指针。这个结构体包含了与用户相关的信息,如用户名、家目录、登录 shell 等。

  • 参数

    • uid:用户的 UID(用户 ID)。
  • 返回值

    • 成功时,返回一个指向 passwd 结构体的指针。
    • 失败时,返回 NULL。可以通过 errno 获取错误代码。
  • passwd 结构体

    struct passwd {
        char *pw_name;   // 用户名
        char *pw_passwd; // 密码(通常为加密后的密码)
        uid_t pw_uid;    // 用户 ID
        gid_t pw_gid;    // 组 ID
        char *pw_gecos;  // 备注字段(通常包含用户全名等信息)
        char *pw_dir;    // 用户的家目录
        char *pw_shell;  // 用户的登录 shell
    };
    

getgrgid 函数

函数原型:

#include <grp.h>

struct group *getgrgid(gid_t gid);
  • 功能
    getgrgid 函数根据给定的组 ID (gid) 查找组信息,并返回一个指向 group 结构体的指针。这个结构体包含了与组相关的信息,如组名、组成员等。

  • 参数

    • gid:组的 GID(组 ID)。
  • 返回值

    • 成功时,返回一个指向 group 结构体的指针。
    • 失败时,返回 NULL。可以通过 errno 获取错误代码。
  • group 结构体

    struct group {
        char *gr_name;   // 组名
        char *gr_passwd; // 组密码(通常为空)
        gid_t gr_gid;    // 组 ID
        char **gr_mem;   // 组成员的用户名列表
    };
    
  • 示例代码

#include <stdio.h>
#include <pwd.h>
#include <grp.h>
#include <unistd.h>

int main() {
    // 获取当前用户的 UID 和 GID
    uid_t uid = getuid();
    gid_t gid = getgid();

    // 获取用户信息
    struct passwd *pw = getpwuid(uid);
    if (pw == NULL) {
        perror("getpwuid");
        return 1;
    }
    
    // 获取组信息
    struct group *gr = getgrgid(gid);
    if (gr == NULL) {
        perror("getgrgid");
        return 1;
    }

    // 输出用户和组信息
    printf("用户名: %s\n", pw->pw_name);
    printf("用户ID: %d\n", pw->pw_uid);
    printf("组名: %s\n", gr->gr_name);
    printf("组ID: %d\n", gr->gr_gid);

    return 0;
}

2. 使用 getpwnamgetgrnam 函数(C 语言 API)

  如果你已经知道用户名或组名,可以使用 getpwnamgetgrnam 函数来获取详细信息。

getpwnam 函数

函数原型:

#include <pwd.h>

struct passwd *getpwnam(const char *name);
  • 功能
    getpwnam 函数根据提供的用户名 (name) 查找用户信息,并返回一个指向 passwd 结构体的指针。

  • 参数

    • name:用户名(一个以 null 结尾的字符串)。
  • 返回值

    • 成功时,返回一个指向 passwd 结构体的指针。
    • 失败时,返回 NULL。可以通过 errno 获取错误代码。
  • passwd 结构体

    struct passwd {
        char *pw_name;   // 用户名
        char *pw_passwd; // 密码(通常为加密后的密码)
        uid_t pw_uid;    // 用户 ID
        gid_t pw_gid;    // 组 ID
        char *pw_gecos;  // 备注字段(通常包含用户全名等信息)
        char *pw_dir;    // 用户的家目录
        char *pw_shell;  // 用户的登录 shell
    };
    

getgrnam 函数

函数原型:

#include <grp.h>

struct group *getgrnam(const char *name);
  • 功能
    getgrnam 函数根据提供的组名 (name) 查找组信息,并返回一个指向 group 结构体的指针。

  • 参数

    • name:组名(一个以 null 结尾的字符串)。
  • 返回值

    • 成功时,返回一个指向 group 结构体的指针。
    • 失败时,返回 NULL。可以通过 errno 获取错误代码。
  • group 结构体

    struct group {
        char *gr_name;   // 组名
        char *gr_passwd; // 组密码(通常为空)
        gid_t gr_gid;    // 组 ID
        char **gr_mem;   // 组成员的用户名列表
    };
    
  • 示例代码

#include <stdio.h>
#include <pwd.h>
#include <grp.h>

int main() {
    const char *username = "your_username"; // 替换为需要查询的用户名
    const char *groupname = "your_groupname"; // 替换为需要查询的组名

    // 获取用户信息
    struct passwd *pw = getpwnam(username);
    if (pw == NULL) {
        perror("getpwnam");
        return 1;
    }
    
    // 获取组信息
    struct group *gr = getgrnam(groupname);
    if (gr == NULL) {
        perror("getgrnam");
        return 1;
    }

    // 输出用户和组信息
    printf("用户名: %s\n", pw->pw_name);
    printf("用户ID: %d\n", pw->pw_uid);
    printf("组名: %s\n", gr->gr_name);
    printf("组ID: %d\n", gr->gr_gid);

    return 0;
}

3. 使用 Python 标准库

  在 Python 中,可以使用 ospwd 模块来获取这些信息。

import os
import pwd
import grp

# 获取当前用户的用户名和用户ID
uid = os.getuid()
username = pwd.getpwuid(uid).pw_name

# 获取当前用户的主组ID和组名
gid = os.getgid()
groupname = grp.getgrgid(gid).gr_name

print(f"用户名: {username}")
print(f"用户ID: {uid}")
print(f"组名: {groupname}")
print(f"组ID: {gid}")

4. 使用 Shell 命令

  在命令行中,也可以使用以下命令获取这些信息:

# 获取当前用户名
echo "用户名: $(whoami)"

# 获取当前用户ID
echo "用户ID: $(id -u)"

# 获取当前用户主组名
echo "组名: $(id -gn)"

# 获取当前用户主组ID
echo "组ID: $(id -g)"

  个人水平有限,欢迎大家在评论区进行指导和交流!!!😁😁😁

  • 24
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小嵌同学

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值