Skip to main content
☘️ Septvean's Documents
Toggle Dark/Light/Auto mode Toggle Dark/Light/Auto mode Toggle Dark/Light/Auto mode Back to homepage

/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] }: 在处理完所有行后,遍历数组并打印存储的最终结果。

安全操作步骤

修改系统级配置文件时,建议遵循以下流程以防配置丢失或出错:

  1. 备份原始文件

    sudo cp /etc/subuid /etc/subuid.bak
    
  2. 执行去重并检查结果

    awk -F: '{ res[$1] = $0 } END { for (u in res) print res[u] }' /etc/subuid | sort | column -t -s:
    

    注意:column -t -s: 仅用于格式化输出预览,方便检查。

  3. 覆盖原文件

    如果预览结果无误,将其写入原文件:

    awk -F: '{ res[$1] = $0 } END { for (u in res) print res[u] }' /etc/subuid | sort | sudo tee /etc/subuid
    
  4. 对 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 身份运行。