5

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

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

我可以使用 umask 执行此操作吗?如果是这样,我该怎么做?如果不是,实现它的最佳方法是什么?先感谢您。

4

3 回答 3

9

有趣的要求。当前(至少在 中bashumask是全局设置,您不能根据对象类型进行设置。

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

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

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

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

但这就是所有细节,上面的框架应该足以让您入门。

于 2012-09-16T08:53:44.200 回答
5

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 效率有点低.

于 2012-09-16T09:53:38.920 回答
0

在用户的 .bashrc 中添加以下内容:

umask 0222

别名 mkdir='mkdir -mu=rx,g=rx,o='

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

于 2014-05-25T17:42:19.630 回答