mkdir创建的目录上的奇怪权限(没有执行)



我有这个旧的Perl脚本。此脚本可在CentOS 6.4上使用cron。它创建了一个临时目录,并试图在那里解压缩文件。

这是一段代码:

$lg->li("Creating Directory... nt$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。

为什么新目录没有执行权限?知道这是怎么发生的吗?

奇怪的权限是由父目录上的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位会导致在该目录中使用与该目录相同的组创建新文件。新目录从其父目录继承setgid位。

0113的umask将导致您看到的奇怪权限。这是一个不寻常的umask,默认值为0022。umask是在执行脚本的环境中设置的,或者直接在脚本本身中设置。

不要担心脚本中mkdir之后的0777mkdir $dir, 0777的意思是"在不干扰当前umask的情况下创建$dir">0777是默认值,可以安全地省略。

尝试直接在脚本中设置umask:

umask 0022;
$lg->li("Creating Directory... nt$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

您的代码在我看来是正确的。

在我的系统上确认:

perl -e 'mkdir("foo", 0777);'
drwxr-xr-x  2 user  user     512 Dec 30 10:48 foo

mkdir受您的umask影响。一个时髦的乌马斯克可以做一些时髦的事情。

这对你有什么好处?

perl -e 'printf("%04on", umask());'

我得到这个:

0022

这就是为什么当我要求0777时,我的文件夹是0755创建的。

我已经调试了脚本并找到了问题的根源。由我们的一个提交者发送给我们的tar.gz档案引起的问题。这些tar文件具有未设置执行权限的目录。我不知道他们是如何取得这样的结果的。

还有一个问题-Gnu Tar没有阻止恢复文件和目录权限的密钥。

因此,在用错误的权限提取归档文件后,我必须递归地对归档文件中的所有文件和目录设置正确的权限。

谢谢大家。

这意味着已经设置了setuid和setgid位。

setuid(set user id)是一个权限位,允许用户使用所有者的权限执行程序。

setgid(set group id)是一个允许用户使用组所有者的权限执行程序的位。

http://linuxg.net/how-to-set-the-setuid-and-setgid-bit-for-files-in-linux-and-unix/

最新更新