对mkdir创建的目录的奇怪权限(无执行)

时间:2013-12-30 15:29:40

标签: linux perl cron centos6

我有这个旧的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。

为什么新目录没有执行权限?不知道怎么回事?

4 个答案:

答案 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之后不要担心mkdirmkdir $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/