我正在编写一个bash脚本来更新一些文件/目录,我想在脚本中运行umask来设置脚本创建的文件/目录的默认权限。我知道我可以umask来设置文件和目录的权限,但是我需要对文件和文件夹的权限不同。
I want files to be: -rw----r-- (0604)
I want folders to be: drwx-----x (0701)
我可以使用umask吗?如果是这样我该如何去做呢?如果没有,最好的方法是什么?提前谢谢。
答案 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。