为文件和文件夹设置不同的Umask

时间:2012-09-16 08:44:27

标签: bash permissions umask

我正在编写一个bash脚本来更新一些文件/目录,我想在脚本中运行umask来设置脚本创建的文件/目录的默认权限。我知道我可以umask来设置文件和目录的权限,但是我需要对文件和文件夹的权限不同。

I want files to be:   -rw----r-- (0604)
I want folders to be: drwx-----x (0701)

我可以使用umask吗?如果是这样我该如何去做呢?如果没有,最好的方法是什么?提前谢谢。

3 个答案:

答案 0 :(得分:8)

有趣的要求。目前(至少在bash),umask是全局设置,您无法根据对象类型进行设置。

我想到的一个解决方案是将umask设置为文件变体,然后拦截对mkdir的调用(例如使用用户创建的mkdir脚本路径):

umask 0701 ; /path/to/real/mkdir $1 ; umask 0604

这样,假设所有目录创建都使用mkdir完成,您可以确保他们使用不同的umask设置。

请注意,脚本应该更加健壮,例如恢复以前的umask而不是强制它0604,并添加一些更好的错误检查以及可能处理多个参数的能力。

但这就是所有细节,上面的框架应该足以让你开始。

答案 1 :(得分:5)

umask是进程的属性,而不是文件 - 属于UNIX体系结构的一部分,与Bash或任何其他shell程序无关。

真正的问题是您使用的程序不允许在创建时更改权限。例如,在C中,mkdir有第二个参数,模式

您不需要编写C语言,但Python和Perl允许您使用低级接口。权限将由流程umask修改,因此,如果您不想进行任何修改,请将unmask设置为零。

/home/user1> umask 000
/home/user1> python -c 'import os;os.mkdir("mydir",0701)'
/home/user1> ls -ld mydir
drwx-----x 2 user1 QAPLADV 4096 Sep 16 10:28 mydir

/home/user1> python -c 'import os;os.open("myfile",os.O_CREAT,0604)'
/home/user1> ls -l myfile
-rw----r-- 1 user1 QAPLADV 0 Sep 16 10:32 myfile

此时不要忘记umask仍为000,如果您在同一过程中正在执行任何其他工作,则可能需要将其设置回以前的值。

如果您愿意,可以使用Perl版本:

perl -e "mkdir mydir,0701"
perl -MFcntl -e 'sysopen(my $h,"myfile",O_EXCL|O_CREAT,0604)'

当然,如果你有大量的文件,并且你可能经常运行这个文件,那么你可以更好地编写一个Perl或Python程序来完成这项工作 - 为每个文件调用perl或python是有点低效。

答案 2 :(得分:0)

将以下内容放入用户的.bashrc:

umask 0222

alias mkdir =' mkdir -m u = rx,g = rx,o ='

该文件将使用umask 0222创建,而mkdir将使用umask 0227。