如何在 Linux 上使用 chfn 和 usermod 更改用户数据

理解Linux用户账户的元数据管理

用户账户并不仅仅是一个用户名。在Linux系统中,用户账户背后隐藏着丰富的元数据信息。本文将深入探讨如何通过命令行来设置和修改与Linux用户账户相关的各项元数据,帮助您更好地理解和管理您的系统。

用户名的意义

在Linux或类Unix系统中,每个用户都拥有一个用户账户。这个账户的名称,即用户名,是您登录系统时使用的身份标识。此外,它通常也是您的登录组名称以及主目录名称的默认值。这些标识符彼此关联,构成了用户账户的基本信息。

除了用户名之外,每个用户账户还可以存储额外的元数据。例如,您可以添加用户的真实姓名、办公地点、联系电话等信息,这些都属于与用户相关的实际数据。实际上,您可以根据需要将任意信息附加到用户账户上。

对于系统管理员来说,管理包含大量用户账户的计算机时,这些信息尤为重要。即使是个人用户,了解这些幕后的机制也具有一定的趣味性和实用价值。

GECOS字段的由来

在Unix的早期,由于没有专用的打印机,用户需要将打印任务发送到运行通用电气大型机的通用电气综合操作系统 (GECOS)上。 为了实现这一目的,Unix系统上的用户需要存储与GECOS系统账户对应的凭据。

为了保存这些凭据,系统设计了GECOS字段。虽然这个最初的需求早已成为历史,GECOS字段现在主要用于存储与用户账户相关的其他信息。尽管用途改变了,但它的名称仍然沿用下来。

该字段与其他用户账户信息(包括用户名、用户ID、组ID、主目录路径以及登录Shell)一同存储在/etc/passwd文件中。

finger命令和 pinky 命令就是通过读取这些信息来显示用户的相关资料。

使用chfn命令管理用户信息

chfn(更改指纹信息)命令允许您设置和修改存储在 GECOS 字段中的信息。 这些信息以逗号分隔的列表形式存储。

chfn命令在Ubuntu 18.04.1和Manjaro 18.1.0系统中已经预装,但在Fedora 31中需要单独安装,可以通过以下命令完成安装:

sudo dnf install util-linux-user

接下来,让我们看看如何使用finger命令查找用户账户”dave”的信息,使用-l参数可以获取更详细的输出:

finger dave -l

输出结果可能如下所示:

这里显示了账户用户名、主目录以及默认shell,这些信息与用户账户本身有关,而非使用该账户的真实用户。我们可以利用chfn命令存储更多关于真实用户的信息。

chfn dave

以这种方式运行chfn命令会启动一个交互式会话,系统会提示您为GECOS字段中的每一项数据输入值。您可以使用”Enter”键保留当前值,或者输入新的值:

假设我们输入以下信息:

房间号:512
工作电话:555-4567
家庭电话:555-5432

再次使用finger命令查看是否生效:

finger dave -l

您会发现新增的信息已经显示出来。但是,系统并没有提示您输入全名。这是因为修改全名需要使用sudo权限。如果您忘记使用sudo,或者只想单独修改某一项信息,也可以直接使用选项参数。

单独修改GECOS字段的值

可以使用 -f(全名)选项和sudo来设置用户账户的全名:

sudo chfn -f "Dave McKay" dave

再次使用finger命令查看,全名已经添加成功:

除了修改全名,还有其他选项可以修改房间号、家庭电话号码和工作电话号码。 要修改房间号,请使用 -r (房间号) 选项:

sudo chfn -r 633 dave

请注意,在某些发行版中,您可能会使用 -o (办公室房间号)选项而不是 -r 选项。要查看当前版本的 chfn 命令支持哪些选项,请使用:

man chfn

要修改工作电话号码,可以使用 -w (工作电话)选项:

sudo chfn -w 555-1122 dave

要修改家庭电话号码,可以使用 -h (家庭电话号码)选项:

sudo chfn -h 555-6576 dave

使用finger命令再次检查,可以看到所有的修改都已生效:

finger dave -l

在其他用户账户上使用chfn

修改其他用户的GECOS信息与修改自己的信息类似,唯一区别是需要使用sudo权限。 例如查看用户账户 mary 的信息:

finger mary -l

可以看到默认信息已经设置。下面添加更多信息:

sudo chfn mary

执行命令后,系统会提示您输入每项数据的值,因为使用了 sudo 命令,所以您会被要求提供全名数据的值:

值得注意的是,输出结果中包含一个名为 “其他” 的项。

并非所有版本的 chfn 都支持该项,并且只有在使用 sudo 时才能看到它。 这也是为什么之前我们没有使用sudo时看不到该项的原因:

chfn dave

“其他”数据值可以包含任何您想要添加的内容,没有任何具体规定或预期用途。

支持“其他”字段的 chfn 版本还提供了 -o (其他) 选项来直接修改此值。由于 -o 同时代表 “办公室号码”和 “其他”,一些系统使用 -r 代表 “房间号”。

我们可以通过 less 命令查看用户账户 mary/etc/passwd 文件中的存储信息:

less /etc/passwd

在支持 -o 选项的系统上,您可以使用该选项直接设置“其他”字段:

sudo chfn -o "HTG Freelancer" dave

我们可以使用 less 命令检查用户账户 dave 的数据:

less /etc/passwd

这就产生了一个问题:如果您的 chfn 版本不支持“其他”字段,该如何修改它? 可以通过 usermod 命令来实现。

使用usermod命令

usermod 命令允许您修改用户账户的各个方面,例如将用户添加到组或从组中删除,以及修改用户的默认shell。它也可以直接操作GECOS字段。

首先,让我们仔细看看 /etc/passwd 文件中用户账户 mary 对应的行。 使用 grep 命令可以方便地找到该行:

grep mary /etc/passwd

/etc/passwd 文件中的字段以冒号 : 分隔,从左到右分别是:

  • 用户名
  • 用户密码(用x表示,实际存储在 /etc/shadow 文件中)
  • 用户ID
  • 组ID
  • GECOS 字段
  • 用户主目录的路径
  • 用户的登录Shell

GECOS字段中的数据以逗号 , 分隔,从左到右分别是:

  • 全名
  • 房间号
  • 工作电话号码
  • 家庭电话号码
  • 其他信息

需要注意的是,usermod 命令会将整个 GECOS 字段设置为您提供的新值。这意味着如果只提供用户的全名,GECOS 字段中将只包含全名。您必须提供所有需要保留的现有值。

例如,假设用户 mary 升职并搬到四楼,并获得新的办公室号码和工作电话号码,同时我们还需要添加她的中间名,并修改她的“其他”字段值。尽管她的家庭电话号码没有改变,我们仍然需要将其作为字符串提供给 usermod 命令。

可以使用 -c (注释) 选项,并且需要使用 sudo 运行命令:

sudo usermod -c "Mary Carol Quinn,405,5559654,555-7704,Linux Advocate" mary

使用 grep 查看 mary/etc/passwd 文件内容,新的值已经生效:

grep mary /etc/passwd

保持数据同步

不准确的数据毫无价值。 当人员信息发生变化时,例如办公室搬迁、姓名变更或职位变动,应及时更新用户账户的元数据,以反映最新的信息。