Linux mkdir创建的目录上的奇怪权限(无执行)
我有一个旧的Perl脚本。此脚本在CentOS 6.4上从cron运行。它创建了一个临时目录,并试图在那里解压文件 这是一段代码:Linux mkdir创建的目录上的奇怪权限(无执行),linux,perl,cron,centos6,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); 但是,在执行之后,目录具有奇怪的权限:
$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
为什么新目录没有执行权限?你知道这是怎么发生的吗?这意味着setuid和setgid位已经设置好了 setuid(set user id)是一个权限位,允许用户以其所有者的权限执行程序 setgid(set group id)是一个允许用户以组所有者的权限执行程序的位
这意味着setuid和setgid位已设置 setuid(set user id)是一个权限位,允许用户以其所有者的权限执行程序 setgid(set group id)是一个允许用户以组所有者的权限执行程序的位
我觉得你的代码很正确 在我的系统上确认:
perl -e 'mkdir("foo", 0777);'
drwxr-xr-x 2 user user 512 Dec 30 10:48 foo
受您的影响。一个时髦的乌玛斯克人可以做时髦的事情
这对你有什么好处
perl -e 'printf("%04o\n", umask());'
我明白了:
0022
这就是为什么当我请求0777时,我的文件夹被创建为0755。您的代码在我看来是正确的 在我的系统上确认:
perl -e 'mkdir("foo", 0777);'
drwxr-xr-x 2 user user 512 Dec 30 10:48 foo
受您的影响。一个时髦的乌玛斯克人可以做时髦的事情
这对你有什么好处
perl -e 'printf("%04o\n", umask());'
我明白了:
0022
这就是为什么当我请求0777时,我的文件夹被创建为0755。奇怪的权限是由父目录上的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位会导致使用与目录相同的组在目录中创建新文件。新目录
0113
的umask将导致您看到的奇怪权限。这是一个不寻常的umask,默认值为0022
。umask在执行脚本的环境中设置,或者直接在脚本本身中设置
不要担心脚本中mkdir
之后的0777
:mkdir$dir,0777
表示“创建$dir而不干扰当前umask”<代码>0777
直接在脚本中尝试:
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
表示设置了可执行位
,大写表示未设置:
$ 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
奇怪的权限是由父目录上的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位会导致使用与目录相同的组在目录中创建新文件。新目录
0113
的umask将导致您看到的奇怪权限。这是一个不寻常的umask,默认值为0022
。umask在执行脚本的环境中设置,或者直接在脚本本身中设置
不要担心脚本中mkdir
之后的0777
:mkdir$dir,0777
表示“创建$dir而不干扰当前umask”<代码>0777
直接在脚本中尝试:
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
表示设置了可执行位
,大写表示未设置:
$ 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
我已经调试了脚本并找到了问题的根源。 由我们的一个提交者发送给我们的tar.gz归档文件引起的问题。这些tar文件具有未设置执行权限的目录。我不知道他们是如何达到这样的结果的 还有一个问题-Gnu Tar没有阻止恢复文件和目录权限的密钥 因此,在使用错误的权限提取归档文件后,我必须递归地对归档文件中的所有文件和目录设置正确的权限
谢谢大家。我已经调试了脚本并找到了问题的根源。 由我们的一个提交者发送给我们的tar.gz归档文件引起的问题。这些tar文件具有未设置执行权限的目录。我不知道他们是如何达到这样的结果的 还有一个问题-Gnu Tar没有阻止恢复文件和目录权限的密钥 因此,在使用错误的权限提取归档文件后,我必须递归地对归档文件中的所有文件和目录设置正确的权限
谢谢大家。谁设置了这些位?函数mkdir($unzip_dir,0777)明确地将权限设置为0777。这个答案有误导性。问题是关于目录,而不是文件。目录的setuid和setgid由谁设置这些位?函数mkdir($unzip_dir,0777)明确地将权限设置为0777。这个答案有误导性。问题是关于目录,而不是文件。目录的setuid和setgid实际上有,此用户的umask是0002。实际上,此用户的umask是0002。该umask不会产生这些权限。你有没有试着打印umask?还请注意,可以通过调用
umask EXPR更改此进程的umask