AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / ubuntu / 问题 / 1510466
Accepted
Manuel Jordan
Manuel Jordan
Asked: 2024-04-15 07:46:26 +0800 CST2024-04-15 07:46:26 +0800 CST 2024-04-15 07:46:26 +0800 CST

为什么 /etc/passwd 中的 GECOS 列代表 4 个空字段,而不是根据 adduser 命令的 5 个空字段?

  • 772

只是对以下情况感到好奇

当adduser命令执行时如下:

sudo adduser optimusprime
Adding user `optimusprime' ...
Adding new group `optimusprime' (1015) ...
Adding new user `optimusprime' (1013) with group `optimusprime' ...
Creating home directory `/home/optimusprime' ...
Copying files from `/etc/skel' ...
New password: 
Retype new password: 
passwd: password updated successfully
Changing the user information for optimusprime
Enter the new value, or press ENTER for the default
    Full Name []: 
    Room Number []: 
    Work Phone []: 
    Home Phone []: 
    Other []: 
Is the information correct? [Y/n]

请注意,有 5 个可选字段可用于写入数据。如果执行命令时默认将其保留为空cat /etc/passwd,则该用户的记录将显示如下:

optimusprime:x:1013:1015:,,,:/home/optimusprime:/bin/bash

观察,,,GECOS 部分。它表示 4 个字段 asA,B,C,D而不是 5 个字段 as A,B,C,D,E。为什么它们之间存在这种差异或不匹配?说实话我预料到了

optimusprime:x:1013:1015:,,,,:/home/optimusprime:/bin/bash

adduser它也代表可通过该命令使用的 5 个字段。

如果使用命令usermod如下:

sudo usermod -c "A,B,C,D,E" optimusprime

用户显示为:

optimusprime:x:1013:1015:A,B,C,D,E:/home/optimusprime:/bin/bash

我知道甚至可以通过usermod命令添加更多字段,如下所示:

sudo usermod -c "A,B,C,D,E,F" optimusprime
sudo usermod -c "A,B,C,D,E,F,G" optimusprime

因此这些命令的执行分别体现如下

optimusprime:x:1013:1015:A,B,C,D,E,F:/home/optimusprime:/bin/bash
optimusprime:x:1013:1015:A,B,C,D,E,F,G:/home/optimusprime:/bin/bash

乍一看并不清楚 GECOS 至少是基于 4 个字段还是 5 个字段。

users
  • 1 1 个回答
  • 28 Views

1 个回答

  • Voted
  1. Best Answer
    steeldriver
    2024-04-16T00:20:29+08:002024-04-16T00:20:29+08:00

    /etc/passwd 文件的手册页man 5 passwd在这方面特别简洁:

    注释字段由各种系统实用程序使用,例如 Finger(1)。

    POSIX 也没有任何帮助 - 事实上,密码结构的 POSIX 标准pwd.h根本不强制要求 GECOS 或注释字段:

    <pwd.h> 标头应定义 struct passwd 结构,该结构至少应包括以下成员:

    char    *pw_name   User's login name. 
    uid_t    pw_uid    Numerical user ID. 
    gid_t    pw_gid    Numerical group ID. 
    char    *pw_dir    Initial working directory. 
    char    *pw_shell  Program to use as shell.
    

    如果我们查看/usr/include/pwd.h包提供的glibc 实现libc-dev,我们会发现它的pw_gecos成员是一个简单的 C 字符串(或指向 char 的指针):

    /* A record in the user database.  */
    struct passwd
    {
      char *pw_name;                /* Username.  */
      char *pw_passwd;              /* Hashed passphrase, if shadow database
                                       not in use (see shadow.h).  */
      __uid_t pw_uid;               /* User ID.  */
      __gid_t pw_gid;               /* Group ID.  */
      char *pw_gecos;               /* Real name.  */
      char *pw_dir;                 /* Home directory.  */
      char *pw_shell;               /* Shell program.  */
    };
    

    因此,任何使用 glibcgetpwent函数系列获取密码数据库信息的应用程序都将获得单个字符串形式的结果 - 这本质上取决于应用程序如何选择解析它。特别是,该命令的 BSD 实现(这是从 Ubuntu Universefinger存储库安装时获得的结果)使用strsep对字符串进行标记,但最多只分配四个逗号分隔的子字段:finger

    /*
     * fields[0] -> real name
     * fields[1] -> office
     * fields[2] -> officephone
     * fields[3] -> homephone
     */
    nfields = 0;
    while ((p = strsep(&bp, ","))) {
            if (nfields < 4) fields[nfields++] = *p ? p : NULL;
    }
    while (nfields<4) fields[nfields++] = NULL;
    

    在 Ubuntu 中,/usr/sbin/adduser是一个使用系统的chfn. 如果您查看源代码chfn(来自影子 passwd 套件),它会类似地标记前四个子字段,然后将其余的子字段分配为“ slop”:

        /*
         * Anything left over is "slop".
         */
        if ((NULL != cp) && !oflg) {
                if ('\0' != slop[0]) {
                        strcat (slop, ",");
                }
    
                strcat (slop, cp);
        }
    

    所以我想结论是

    • GECOS领域没有标准

    • 前 4 个子字段具有基于历史finger命令的常规解释

    • 之后的任何内容都是可选的,并且取决于应用程序的解释。

    • 2

相关问题

  • 如何限制其他用户访问程序?

  • 如何更改登录屏幕中显示的默认用户?

  • Ubuntu 和 Windows Server 2008 NFS

  • xubuntu 中没有其他用户的面板

  • 如何防止自己在多用户设置中自动注销?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何运行 .sh 脚本?

    • 16 个回答
  • Marko Smith

    如何安装 .tar.gz(或 .tar.bz2)文件?

    • 14 个回答
  • Marko Smith

    如何列出所有已安装的软件包

    • 24 个回答
  • Marko Smith

    无法锁定管理目录 (/var/lib/dpkg/) 是另一个进程在使用它吗?

    • 25 个回答
  • Martin Hope
    Flimm 如何在没有 sudo 的情况下使用 docker? 2014-06-07 00:17:43 +0800 CST
  • Martin Hope
    Ivan 如何列出所有已安装的软件包 2010-12-17 18:08:49 +0800 CST
  • Martin Hope
    La Ode Adam Saputra 无法锁定管理目录 (/var/lib/dpkg/) 是另一个进程在使用它吗? 2010-11-30 18:12:48 +0800 CST
  • Martin Hope
    David Barry 如何从命令行确定目录(文件夹)的总大小? 2010-08-06 10:20:23 +0800 CST
  • Martin Hope
    jfoucher “以下软件包已被保留:”为什么以及如何解决? 2010-08-01 13:59:22 +0800 CST
  • Martin Hope
    David Ashford 如何删除 PPA? 2010-07-30 01:09:42 +0800 CST

热门标签

10.10 10.04 gnome networking server command-line package-management software-recommendation sound xorg

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve