cry*_*c ツ 5 permissions bash umask
我正在编写一个bash脚本来更新一些文件/目录,我想在脚本中运行umask来设置脚本创建的文件/目录的默认权限.我知道我可以使用umask来设置文件和目录的权限,但我需要对文件和文件夹的权限不同.
I want files to be: -rw----r-- (0604)
I want folders to be: drwx-----x (0701)
Run Code Online (Sandbox Code Playgroud)
我可以使用umask吗?如果是这样我该如何去做呢?如果没有,最好的方法是什么?先感谢您.
有趣的要求.当前(至少在bash
)中,umask
是全局设置,您无法根据对象类型进行设置.
我想到的一个解决方案是设置umask
文件变量,然后拦截调用mkdir
(例如使用mkdir
路径中较早的用户创建的脚本)来执行:
umask 0701 ; /path/to/real/mkdir $1 ; umask 0604
Run Code Online (Sandbox Code Playgroud)
这样,假设所有目录创建都已完成mkdir
,您可以确保它们使用不同的umask
设置.
请注意,脚本可能应该更加健壮,例如恢复先前umask
而不是强制它0604
,并添加一些更好的错误检查以及可能处理多个参数的能力.
但这就是所有细节,上面的框架应该足以让你开始.
这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
Run Code Online (Sandbox Code Playgroud)
不要忘记此时umask
仍为000,如果您在同一过程中执行任何其他工作,则可能需要将其设置回其先前的值.
如果您愿意,这是一个Perl版本:
perl -e "mkdir mydir,0701"
perl -MFcntl -e 'sysopen(my $h,"myfile",O_EXCL|O_CREAT,0604)'
Run Code Online (Sandbox Code Playgroud)
当然,如果你有大量的文件,并且你可能经常运行这个文件,那么编写Perl或Python程序来完成这项工作会好得多 - 为每个文件调用perl或python是有点低效的.