最近,一个tar.gz
档案破坏了我的脚本。重现步骤:
# this is a Python package distributed through PyPi
wget https://pypi.python.org/packages/b3/e8/0a829f58ff6068f94edf74877f2e093aae945482c96ade683ef3cafdfcad/EasyExtend-3.0.2-py2.5.tar.gz
# tar exit status is 0 (i.e. not a broken archive)
tar -zxvf EasyExtend-3.0.2-py2.5.tar.gz
ls -l EasyExtend-3.0.2-py2.5
结果:
ls: cannot access 'EasyExtend-3.0.2-py2.5/scripts': Permission denied
ls: cannot access 'EasyExtend-3.0.2-py2.5/setup.py': Permission denied
ls: cannot access 'EasyExtend-3.0.2-py2.5/LICENSE.txt': Permission denied
ls: cannot access 'EasyExtend-3.0.2-py2.5/PKG-INFO': Permission denied
ls: cannot access 'EasyExtend-3.0.2-py2.5/EasyExtend': Permission denied
ls: cannot access 'EasyExtend-3.0.2-py2.5/README.txt': Permission denied
total 0
d????????? ? ? ? ? ? EasyExtend
-????????? ? ? ? ? ? LICENSE.txt
-????????? ? ? ? ? ? PKG-INFO
-????????? ? ? ? ? ? README.txt
d????????? ? ? ? ? ? scripts
-????????? ? ? ? ? ? setup.py
尽管一切都是在非超级用户帐户下完成的,但 umask 并未应用于新提取的文件。
问题:这是一个错误、功能还是无效的存档?
问题2:有没有一种优雅的方法来强制此类文件的默认权限?
UPD:我的 umask 是 0002。sudo ls -l
给出正确的权限:
sudo ls -l EasyExtend-3.0.2-py2.5
total 28
drw-rw-r-- 7 username username 4096 Sep 19 2009 EasyExtend
-rw-rw-r-- 1 username username 1559 May 16 2006 LICENSE.txt
-rw-rw-r-- 1 username username 342 Sep 19 2009 PKG-INFO
-rw-rw-r-- 1 username username 585 Aug 13 2008 README.txt
drw-rw-r-- 2 username username 4096 Sep 19 2009 scripts
-rw-rw-r-- 1 username username 5296 Aug 15 2008 setup.py
答案1
这些是完全有效的权限,只是不包括让您阅读它们:)。就 tar 而言,这肯定是一个功能吗?但档案听起来很混乱。
重新 umask,我会假设解释这里是正确的; umask 纯粹是一个减法(或者位掩码,如果你是程序员)。由于缺少权限位而说不应用 umask 是没有意义的。
要授予所有目录可执行权限,可以方便地使用chmod -R a+X EasyExtend-3.0.2-py2.5