我创建了一个目录/share
并授予了chmod 2770
权限和chown root:stock /share
。
1)当我在/share
内创建触摸文件时,我看到该文件有rw-rw-r--
而我看不到rwxrws---
2)当我在/share/data
中创建目录时,我看到权限为drwxrwsr-x
,其中父目录为drwxrws---
如何将父子文件和子目录与固有父权限完全相同。
答案 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
的成员,newgrp
,chgrp
和setgid
将会有效。如果你不是,他们就不会:组密码机制在理论上仍然存在,但它在几十年前被弃用了,我从来没有见过任何人使用它。当然,如果你想改变这两种情况,你可以随时other_group
,甚至sudo chgrp other_group file_name
。
新文件或目录的读写权限取决于您的sudo chown other_user:other_group file_name
,umask
通常由登录时的配置文件设置。最常用的umask值为022
,对于文件,它将为您提供-rw-r--r--
和002
,这将为您提供-rw-rw-r--
。命令umask
将为您提供当前值。您可以使用umask new_value
设置另一个值,它将一直有效,直到您更改它或退出shell。除非在umask
中有奇数值,否则目录也将默认设置所有执行权限,这将阻止相应的执行位。例如。 umask值027
将创建-rw-r-----
的文件和drwxrwx---
的目录。有关完整说明,请参阅文档。此外,如果父目录具有setgid
位,则新目录也将具有该位。默认情况下无法设置setuid
和sticky
位,也无法设置文件的setgid
位。
事实上,您始终可以使用命令chmod
设置所需的权限。
那就是说,没有标准的命令可以做你想要的。但是,您可以轻松编写如下所示的bash函数并使用它们(在需要时将它们写入文件mycreat_functions
和source 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,以便有效地保持所有者,组和权限。如果您希望它们根据新目录条目的父级进行更改,则必须在上面mymv
和mytouch
的行中创建mymkdir
函数。