在tar文件中设置文件权限

16
有没有一种方法可以在创建tar文件后(或者创建后不久),在分发之前chmod 777 tar文件内容?被打包的目录的写入权限在tar时是未知的(但通常为555)。我希望展开后的目录可以是全球可写的,而无需用户在继续操作之前记得 chmod -R 777 <untarred dir>
笨拙的方法是复制目录,然后chmod -R 777 <copydir>,但我想知道是否有更好的解决方案。 我在Solaris 10机器上运行。
背景: 根目录位于我们的ClearCase vob中,具有特定的文件权限(递归)。创建一个tar文件,并分发给我们组织中的多个“客户”。大多数人只需要读/执行权限(特别是不希望它们具有可写性),但其中一个组需要其副本具有递归可写性,因为他们可能会编辑这些文件,甚至还原到“新鲜”副本(即,以我给出的状态原始状态)。
这个组对技术有些挑战。尽管他们有关于tar文件的“如何”说明,但他们似乎总是忘记(或错误地执行)将文件设置为递归可写。这导致他们给我打电话,要求我诊断各种问题的根本原因是他们忘记了(或执行不正确)对展开目录进行chmod。
在你问之前,是的,我给他们编写了一个脚本来untar/chmod(专门针对他们),但...哦算了。
所以,我想我会创建一个单独的递归可写版本的tar文件,只分发给他们。正如我最初所说的那样,我总是可以复制该目录,使复制目录递归可写,然后压缩复制目录,但是该目录相当大,而且磁盘空间有时非常接近满(它可能会变化很大),因此100%的时间都无法复制该目录。

2
在运行tar之前,您需要对原始源目录进行chmod操作。tar会在打包时捕获权限/所有权。虽然有强制更改解压后权限的选项,但您不能指望用户记住这些额外选项。 - Marc B
1
Python有一个很好的tarfile库,可用于编写自定义打包脚本,但GNU tar似乎没有这个选项。 - Fred Foo
@MarcB 那我将失去现有的权限。 - splungebob
@larsmans,我几天前刚开始学习Python编程。我得去看看这个。 - splungebob
2个回答

25

使用GNU tar时,在创建归档时使用--mode选项,例如:

tar cf archive.tar --mode='a+rwX' *

但请注意,当解压缩存档文件时,默认情况下将应用umask。因此,除非用户的umask是000,否则权限将在该点更新。但是,可以使用-p (--preserve)选项来忽略umask,例如:

tar xfp archive.tar

大写字母 X 有什么重要意义吗?我知道小写字母 x 通常表示可执行位,但我以前从未见过它大写。 - Drew Chapin
4
在设置目录中所有文件的权限时,应该通常避免使用a+x,因为它会使不需要执行的文件(如文本文件、配置文件等)变得可执行。而a+X仅会将已经有至少一个执行位设置的文件设为可执行。 - Todd Owen
在Windows下打包时,是否也可以设置权限,使得某些文件在Linux下可以直接执行? - schande

0

在执行tar命令之前,您可以轻松更改文件的权限,尽管我通常建议人们除了在unix系统上的/tmp目录外,永远不要使用777,最好使用755或最坏情况下的775用于目录。这样,您就不会让全世界都能写入您的目录,这通常是明智的。

大多数Unix用户不喜欢递归设置权限,因为它会将不应该是可执行文件(例如配置文件)的文件设置为可执行文件,为了避免这种情况,他们在一段时间前发明了一种新的chmod方式,称为符号模式。阅读chmod的man页面应该提供详细信息,但您可以尝试以下操作:

cd $targetdir; chmod -R u+rwX,a+rX .; tar zcvf $destTarFile .

其中$targetdir是您要打包的目录,$destTarFile是您正在创建的tar文件的名称。

当您解压缩该tar文件时,会尝试保留权限。 当然,某些规则控制该过程 - 如果root进行解压缩,则仅保留所有者的uid和gid,否则它们将设置为当前进程的有效uid和gid。


1
即使是 /tmp 目录,权限也应该设置为 1777 而不仅仅是普通的 777;这可以防止无法写入文件的用户删除它(目录上的粘滞位)。但最好的方法是在创建 tar 文件之前设置目录的权限。 - Jonathan Leffler
2
(开个玩笑,如果你再等一天左右,如果你得到第二个赞,你就有资格获得复兴徽章。) - Jonathan Leffler
谢谢你的回复,但是这会改变我的文件的现有权限。这是不可取的,因为我已经在回复@MarcB时提到过。我只想让未解压的tar文件的内容具有全球读写权限。 - splungebob
很好,@splungebob。但我的观点仍然存在-你为什么要这样做?此外,如果您将其打包并交给其他人,那么您自己的权限设置方式有什么问题?您可以在tarball的根目录中放置安装脚本,以设置权限并确保一切都符合您的预期...您想要详细说明如何做到这一点吗? - Charles Bedford
@CharlesBedford 我编辑了原帖,加入了一些背景信息。 - splungebob
感谢 @splungebob 改进了这个问题的清晰度 :) 是的,我所能想到的唯一方法是将您的文件复制到其他地方,并在打包之前更改权限。考虑到这一点,有时我喜欢使用 cpio 进行本地复制... 它在某些情况下速度更快,而且非常可靠 - cd srcdir; cpio -pdmuv destdir - Charles Bedford

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接