linux文件和文件夹不继承父目录权限

时间:2017-02-15 06:08:13

标签: linux bash shell unix chmod

我创建了一个目录/share并授予了chmod 2770权限和chown root:stock /share

1)当我在/share内创建触摸文件时,我看到该文件有rw-rw-r--而我看不到rwxrws---

2)当我在/share/data中创建目录时,我看到权限为drwxrwsr-x,其中父目录为drwxrws---

如何将父子文件和子目录与固有父权限完全相同。

2 个答案:

答案 0 :(得分:2)

目录上的setgid位使新文件从目录继承group,而不是其权限。

控制在创建文件时设置的位的标准方法是控制创建过程的umask(askubuntu),而不是文件系统。

答案 1 :(得分:1)

创建文件或目录时

  • 新文件或目录的所有者将是您的有效用户ID(euid)。您可以使用su other_user命令预先更改用户ID(这将提示您输入other_user的密码)或sudo su other_user(这将允许您或不允许,可能要求您输入密码,根据{{​​1}}中的设置。创建文件或目录后,您可以使用/etc/sudoers*更改其所有者。

  • 新文件或目录的组将是您的有效组ID。您可以事先使用sudo chown other_user file_name命令更改组ID。如果您当前的目录以newgrp other_group为组并且其other_group位已设置,则您的有效组ID将为setgid。创建文件或目录后,您可以使用other_group更改其组。如果您是chgrp other_group file_name的成员,newgrpchgrpsetgid将会有效。如果你不是,他们就不会:组密码机制在理论上仍然存在,但它在几十年前被弃用了,我从来没有见过任何人使用它。当然,如果你想改变这两种情况,你可以随时other_group,甚至sudo chgrp other_group file_name

  • 新文件或目录的读写权限取决于您的sudo chown other_user:other_group file_nameumask通常由登录时的配置文件设置。最常用的umask值为022,对于文件,它将为您提供-rw-r--r--002,这将为您提供-rw-rw-r--。命令umask将为您提供当前值。您可以使用umask new_value设置另一个值,它将一直有效,直到您更改它或退出shell。除非在umask中有奇数值,否则目录也将默认设置所有执行权限,这将阻止相应的执行位。例如。 umask值027将创建-rw-r-----的文件和drwxrwx---的目录。有关完整说明,请参阅文档。此外,如果父目录具有setgid位,则新目录也将具有该位。默认情况下无法设置setuidsticky位,也无法设置文件的setgid位。

  • 事实上,您始终可以使用命令chmod设置所需的权限。

那就是说,没有标准的命令可以做你想要的。但是,您可以轻松编写如下所示的bash函数并使用它们(在需要时将它们写入文件mycreat_functionssource mycreat_functions)。这将适用于手动创建的文件和目录。对于由程序,shell重定向等创建的文件,您仍然需要手动更正权限。

function mymkdir () {
  local parentperms
  for a in "$@"; do

    mkdir "$a"

    # This copies all permissions of the parent,
    # exactly as they are
    parentperms="$(stat -c%a $(dirname "$a"))"
    chmod "$parentperms" "$a"

    # if I’m root...
    if [ $(id -u) = 0 ]; then
      chown "$(stat -c%u:%g "$a")" "$a"
    fi

  done
}


function mytouch () {
  local parentperms newperms
  for a in "$@"; do

    touch "$a"

    # This inherits all permissions of the parent,
    # but removes the excution and setgid bits, as is 
    # appropriate for files.
    parentperms="$(stat -c%a $(dirname "$a"))"
    newperms="$(printf %o $((8#$parentperms & 8#5666)))"
    chmod "$newperms" "$a"

    # if I’m root...
    if [ $(id -u) = 0 ]; then
      chown "$(stat -c%u:%g "$a")" "$a"
    fi

  done
}

注意: 所有者,群组和权限存储在 inode 中,其中还有关于如何检索文件内容的其他信息; 目录条目将inode与文件名相关联,ls -i显示所列文件的 inode编号。当您复制文件时,您创建一个新的目录条目并分配一个新的inode,因此这里提到的所有内容都适用。当您移动文件时,您将在新位置创建一个新目录条目,但将其指向旧的inode,以便有效地保持所有者,组和权限。如果您希望它们根据新目录条目的父级进行更改,则必须在上面mymvmytouch的行中创建mymkdir函数。