对于某些上下文,我正在开发一个类似包管理器的实用程序,它支持以非 root 用户身份构建包。我想确保 root 用户构建的包和非 root 用户构建的包绝对无法区分,而不是使用存档tar
并忽略元数据。
是否有一种格式/实用程序有点类似于tar
存档内的文件和目录不(并且理想情况下不能)包含权限位、时间戳和所有权相关信息等元数据?我希望存档能够由其中存在的目录和文件以及文件内容来完整描述(因此它也无法存储符号链接或硬链接)。
我也可以接受无法区分绝对路径和相对路径的存档格式(即/a/b
映射a/b
到同一事物,因为存档的路径概念与 Unix 路径不同)。
答案1
使用 tar(或 cpio)时无法删除用户信息,但可以强制他们避免区分软件包的制作者。使用 tar 并强制使用一些参数来避免区分构建该包的用户(请参阅 参考资料man tar
):
-P
,--absolute-names
:强制 tar 不删除前导“/”(默认情况下会这样做)。如果您不能在命令行上放置绝对路径,则您提到的路径将被保留(如果您无法在所需的根目录中进行 cd,请尝试使用 -C 或 --change-directory )--owner
:强制用户存储在 tar 文件中,忽略文件/目录的实际所有者(例如 --owner=root)--group
:强制组存储在 tar 文件中(例如 --group=root)。--no-acls
:避免在 tar 文件中复制您自己的 ACL--numeric-owner
,--numeric-group
: 屏蔽本地仅存储 UID/GID 的帐户的实际名称(如果您强制 root,则不需要,因为 root 始终为 0)--mtime
:强制所有文件/目录的修改时间,以掩盖它们实际修改的时间
请注意,具有绝对路径的符号链接将按原样存储。然而,当相对符号链接指向包树内部时,最好始终使用它们。
答案2
我发现的最好的是以下内容,它尝试通过
- 对文件列表进行排序
- 使用数字 0 表示所有者和组
- 为所有者删除
r
和位,以及w
全部其他人的权限 - 将 修复
mtime
为 UNIX 纪元
find <files> -print0 \
| sort -z \
| tar -cf <output>.tar \
--format=posix \
--numeric-owner \
--owner=0 \
--group=0 \
--mode="go-rwx,u-rw" \
--mtime='1970-01-01' \
--no-recursion \
--null \
--files-from -
我在以下位置写了更多相关内容:http://h2.jaguarpaw.co.uk/posts/reproducible-tar/