/etc/subuid 和 /etc/subgid 去重
在 Linux 系统中,/etc/subuid(以及 /etc/subgid)文件的格式通常为 用户名:起始ID:范围长度。如果文件中存在重复的用户名配置,系统通常会按顺序读取,但为了保持文件整洁并确保最后一次配置生效,我们可以使用 awk 命令来进行去重处理。
由于 awk 在处理文本时是从上到下逐行读取的,我们可以利用 关联数组 记录每个用户名的最新行内容。当读取完整个文件后,再将数组中的内容打印出来。
可以运行以下命令来生成一个去重后的新文件:
awk -F: '{ res[$1] = $0 } END { for (u in res) print res[u] }' /etc/subuid > /etc/subuid.new
-F:: 指定冒号:为字段分隔符(subuid 的标准格式)。res[$1] = $0:$1是第一列(用户名)。$0是整行内容。- 这行代码的意思是:以用户名为键,将当前行存入数组
res。如果后面出现了相同的用户名,它会覆盖掉之前存储的值,从而保证最后保留的是最后一次出现的配置。
END { for (u in res) print res[u] }: 在处理完所有行后,遍历数组并打印存储的最终结果。
修改系统级配置文件时,建议遵循以下流程以防配置丢失或出错:
-
备份原始文件
sudo cp /etc/subuid /etc/subuid.bak -
执行去重并检查结果
awk -F: '{ res[$1] = $0 } END { for (u in res) print res[u] }' /etc/subuid | sort | column -t -s:注意:
column -t -s:仅用于格式化输出预览,方便检查。 -
覆盖原文件
如果预览结果无误,将其写入原文件:
awk -F: '{ res[$1] = $0 } END { for (u in res) print res[u] }' /etc/subuid | sort | sudo tee /etc/subuid -
对 subgid 执行相同操作(可选)
通常这两个文件是同步修改的:
awk -F: '{ res[$1] = $0 } END { for (u in res) print res[u] }' /etc/subgid | sort | sudo tee /etc/subgid
- 顺序问题:
awk的关联数组在输出时通常是无序的。如果希望保持某种特定的排序(例如按用户名排序),可以在命令末尾加上| sort。 - 权限:修改
/etc/subuid需要 root 权限,所以请确保使用sudo或以 root 身份运行。