gpt4 book ai didi

linux - 对 mkdir 创建的目录的奇怪权限(不执行)

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:29:12 24 4
gpt4 key购买 nike

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

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

最佳答案

奇怪的权限是由父目录上的 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 在执行脚本的环境中设置,或者直接在脚本本身中设置。

不要担心脚本中 mkdir 之后的 0777: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'。这取决于可执行位。小写 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

关于linux - 对 mkdir 创建的目录的奇怪权限(不执行),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20842483/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com