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

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吗?如果是这样我该如何去做呢?如果没有,最好的方法是什么?先感谢您.

pax*_*blo 8

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

我想到的一个解决方案是设置umask文件变量,然后拦截调用mkdir(例如使用mkdir路径中较早的用户创建的脚本)来执行:

umask 0701 ; /path/to/real/mkdir $1 ; umask 0604
Run Code Online (Sandbox Code Playgroud)

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

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

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


cda*_*rke 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
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是有点低效的.