只是对以下情况感到好奇
当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 个字段。
/etc/passwd 文件的手册页
man 5 passwd
在这方面特别简洁:POSIX 也没有任何帮助 - 事实上,密码结构的 POSIX 标准pwd.h根本不强制要求 GECOS 或注释字段:
如果我们查看
/usr/include/pwd.h
包提供的glibc 实现libc-dev
,我们会发现它的pw_gecos
成员是一个简单的 C 字符串(或指向 char 的指针):因此,任何使用 glibc
getpwent
函数系列获取密码数据库信息的应用程序都将获得单个字符串形式的结果 - 这本质上取决于应用程序如何选择解析它。特别是,该命令的 BSD 实现(这是从 Ubuntu Universefinger
存储库安装时获得的结果)使用strsep对字符串进行标记,但最多只分配四个逗号分隔的子字段:finger
在 Ubuntu 中,
/usr/sbin/adduser
是一个使用系统的chfn
. 如果您查看源代码chfn
(来自影子 passwd 套件),它会类似地标记前四个子字段,然后将其余的子字段分配为“slop
”:所以我想结论是
GECOS领域没有标准
前 4 个子字段具有基于历史
finger
命令的常规解释之后的任何内容都是可选的,并且取决于应用程序的解释。