我有这个旧的Perl脚本。这个脚本是在CentOS 6.4上的cron上运行的。它创建了一个临时目录,并试图在那里解压缩文件。
这是一段代码:
$lg->li("Creating Directory... \n\t$unzip_dir");
mkdir ($unzip_dir, 0777) or my_die("mkdir $unzip_dir failed") unless (-e $unzip_dir && -d $unzip_dir);
然而,执行后该目录具有奇怪的权限:
drwxrwsr-x 42 buser agroup 12K Dec 30 09:18 .
drwxrwsr-x 4 buser agroup 4.0K Apr 6 2012 ..
drw-rwSr-- 2 auser agroup 4.0K Dec 28 11:51 tm_unpack_dir_1388412502.20184
用户auser的umask是一个0002。
为什么新目录没有执行权限?不知道怎么回事?
答案 0 :(得分:3)
奇怪的权限是由父目录上的setgid位和不常见的umask引起的:
查看父目录的权限,第一行:
drwxrwsr-x 42 buser agroup 12K Dec 30 09:18 .
drw-rwSr-- 2 auser agroup 4.0K Dec 28 11:51 tm_unpack_dir_1388412502.20184
注意它有rwxrwsr-x
,这意味着setgid位已设置。目录上的setgid位导致使用与目录相同的组创建目录中的新文件。新目录inherit the setgid bit from their parent。
0113
的umask会导致您看到的奇怪权限。这是一个不寻常的umask,默认为0022
。 umask在执行脚本的环境中设置,或直接在脚本本身中设置。
在您的脚本中0777
之后不要担心mkdir
:mkdir $dir, 0777
表示“创建$ dir而不会干扰当前的umask”。 0777
is the default and can be safely omitted。
直接在您的脚本中试用setting the umask:
umask 0022;
$lg->li("Creating Directory... \n\t$unzip_dir");
mkdir ($unzip_dir) or my_die("mkdir $unzip_dir failed") unless (-e $unzip_dir && -d $unzip_dir);
应该导致:
drwxrwsr-x 42 buser agroup 12K Dec 30 09:18 .
drwxr-sr-x 2 auser agroup 4.0K Dec 28 11:51 tm_unpack_dir_1388412502.20184
新目录权限为rwxr-sr-x
,这更为正常。请注意,由于父目录,setgid位仍然设置。
哦,你可能想知道为什么setgid位有时候是小写的's'
,有时候是大写的'S'
。这取决于executable bit
。小写s
表示executable bit
已设置,大写表示未设置:
$ mkdir foo
$ ls -l
drwxr-xr-x 2 johan johan 4096 Dec 30 17:22 foo
$ chmod g+s foo
$ ls -l
drwxr-sr-x 2 johan johan 4096 Dec 30 17:22 foo
$ chmod g-x foo
$ ls -l
drwxr-Sr-x 2 johan johan 4096 Dec 30 17:22 foo
答案 1 :(得分:1)
您的代码对我来说是正确的。
确认我的系统:
perl -e 'mkdir("foo", 0777);'
drwxr-xr-x 2 user user 512 Dec 30 10:48 foo
mkdir会受到umask的影响。一个时髦的umask可以做一些时髦的事情。
这对你有什么影响?
perl -e 'printf("%04o\n", umask());'
我明白了:
0022
当我要求0777时,为什么我的文件夹被创建为0755。
答案 2 :(得分:1)
我调试了脚本并找到了问题的根源。 tar.gz存档导致的问题由我们的提交者发送给我们。这些tar文件具有未设置执行权限的目录。我不知道他们是如何取得这样的结果的。
还有一个问题 - Gnu Tar无法阻止恢复文件和目录权限。
因此,在提取具有错误权限的存档后,我必须以递归方式为存档中的所有文件和目录设置权限。
谢谢大家。
答案 3 :(得分:0)
这意味着已设置setuid和setgid位。
setuid(设置用户ID)是一个权限位,允许用户使用其所有者的权限执行程序。
setgid(设置组ID)允许用户使用组所有者的权限执行程序。
http://linuxg.net/how-to-set-the-setuid-and-setgid-bit-for-files-in-linux-and-unix/