【问题标题】:Set Different Umask For Files And Folders为文件和文件夹设置不同的 Umask
【发布时间】:2012-09-08 20:36:36
【问题描述】:

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

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

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

【问题讨论】:

  • 您确定要在目录(其他)上使用 --x 吗?这意味着其他人只有知道文件名才能读取目录中的文件。如果您可以在目录上接受 rwx---r-x,则 umask 072 正好适合。

标签: bash permissions umask


【解决方案1】:

有趣的要求。目前(至少在bash 中),umask 是一个全局设置,您不能根据对象类型进行设置。

想到的一个解决方案是将umask 设置为文件变体,然后拦截对mkdir 的调用(例如在路径前面使用用户创建的mkdir 脚本)以执行以下操作:

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

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

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 您必须知道 unix util mkdir a 接受权限参数,即 mkdir -m 750 umaskTest 的工作方式完全相同,但没有所有额外的 -c .... 东西?前2段不错。祝大家好运。
    • @shellter 应该是|答案
    • 澄清一下,umask 确实是进程的属性,但说它与 shell 无关是不正确的(或误导)。一方面,Bash 维护自己的 umask 应该 的内部副本,并在创建文件、目录等时使用它。这是由bash 具有的umask 内置函数修改的this 内部副本。例如,请参阅bash-5.0builtins/umask.def
    【解决方案3】:

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

    umask 0222

    别名 mkdir='mkdir -m u=rx,g=rx,o='

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

    【讨论】:

      猜你喜欢
      • 2019-03-14
      • 1970-01-01
      • 1970-01-01
      • 2016-08-29
      • 2016-02-08
      • 2017-05-31
      • 2013-12-22
      • 2023-01-20
      • 2018-02-26
      相关资源
      最近更新 更多