我有一批 CentOS EC2 实例,这些实例通过 ansible 添加了额外的用户。通常在解压 tarball 时,所有者是 centos.centos(EC2 Centos 的默认登录名)。当创建额外的用户(通过 ansible 或手动)时,它不再使用当前用户解压 tarball,而是使用 tarball 创建者的 uid/gid。(在另一个系统上为 9999.9999。)
我知道在解压时可以使用一个标志 (--no-same-owner),该标志会删除旧权限,但会将其设置为 0.0。有没有办法让 tar 自动为当前用户设置权限?我不确定让这些机器上的每个人都添加另一个步骤 (chown) 是否是个好主意。
答案1
如果您以非 root 用户身份运行 tar extract,则默认情况下它会以当前用户身份进行提取。
如果您获得解压文件的 root 所有权,则您可以以 root 用户身份运行它。
普通用户无法将解压文件的所有权更改为 root,这将是一个巨大的安全问题(您可以将 setuid 和 777 放在任何文件上,然后通过将文件所有权更改为 root 来获取 root 权限)。
如果您尝试以普通用户身份从 tar 中提取某些内容--same-owner
,如果它尝试提取所有权与运行 untar 命令的用户不同的文件,您将收到“无法将所有权更改为 uid x、gid x:操作不允许”的信息。
当您以非 root 用户身份提取 tar 文件时,您默认使用运行 untar 命令的用户身份提取它们,因为普通用户无法对其他用户执行 chown 操作。
如果您以 root 身份运行 untar,那么它们将以与默认打包时相同的 uid:gid 所有权进行提取,因为 root 用户可以对任何用户执行 chown。
如果它以 root 身份运行,您可以使用sudo -u username
或su username -c
以其他用户身份运行命令,然后您应该以该用户的身份获得所有权。
您还可以使用 cpio 从 tar 中提取某些用户:组
cpio -iR user:group -F file.tar
这是来自 tar 手册页。
默认情况下,您应该获得与非 root 用户运行 untar 命令的用户相同的所有权。
--no-same-owner
Extract files as yourself (default for ordinary users).
--same-owner
Try extracting files with the same ownership as exists in
the archive (default for superuser).