我正在编写一个 bash 脚本来更新一些文件/目录,并且我想在脚本中运行 umask 来为脚本创建的文件/目录设置默认权限。我知道我可以 umask 设置文件和目录的权限,但是我需要文件和文件夹的权限不同。
I want files to be: -rw----r-- (0604)
I want folders to be: drwx-----x (0701)
我可以使用 umask 执行此操作吗?如果是这样,我该怎么做?如果不是,实现它的最佳方法是什么?先感谢您。
我正在编写一个 bash 脚本来更新一些文件/目录,并且我想在脚本中运行 umask 来为脚本创建的文件/目录设置默认权限。我知道我可以 umask 设置文件和目录的权限,但是我需要文件和文件夹的权限不同。
I want files to be: -rw----r-- (0604)
I want folders to be: drwx-----x (0701)
我可以使用 umask 执行此操作吗?如果是这样,我该怎么做?如果不是,实现它的最佳方法是什么?先感谢您。
有趣的要求。当前(至少在 中bash
)umask
是全局设置,您不能根据对象类型进行设置。
想到的一种解决方案是将 设置umask
为文件变体,然后拦截对mkdir
(例如mkdir
在路径中较早使用用户创建的脚本)的调用:
umask 0701 ; /path/to/real/mkdir $1 ; umask 0604
这样,假设您所有的目录创建都是用 完成的mkdir
,您可以确保它们使用不同的umask
设置。
请注意,脚本可能应该更健壮一些,例如恢复以前的umask
而不是强制它0604
,并添加一些更好的错误检查以及可能处理多个参数的能力。
但这就是所有细节,上面的框架应该足以让您入门。
这umask
是进程的属性而不是文件的属性 - 这是 UNIX 体系结构的一部分,与 Bash 或任何其他 shell 程序无关。
真正的问题是您使用的程序不允许在创建时更改权限。例如,在 C 中,mkdir
有第二个参数mode。
不过,您不需要编写 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 效率有点低.
在用户的 .bashrc 中添加以下内容:
umask 0222
别名 mkdir='mkdir -mu=rx,g=rx,o='
该文件将使用 umask 0222 创建,而 mkdir 将使用 umask 0227。