'chmod g + s'命令


44

您好,我想了解chmod g+s命令在Unix中的作用。

我也想知道它在这种特定情况下的作用:

cd /home/canard;
touch un;
chgrp canard .;
chmod g+s .;
touch deux ;

我了解所有命令的角色,除了,chmod g+s而且我想知道文件之间的差异un以及deux这一系列命令的结果。

Answers:


60
chmod g+s .;

该命令在当前目录上设置组ID(setgid),写为.

这意味着在当前目录内创建的所有文件和子目录都将继承目录的组ID,而不是创建文件的用户的主要组ID。这也将传递给在当前目录中创建的新子目录。

g+s 影响文件的组ID,但不影响所有者ID。

请注意,这仅适用于新创建的文件。setgid设置不影响被 移动mv)到目录中的文件。复制的文件cp -p也不受影响。

touch un;
chgrp canard .;
chmod g+s .;
touch deux ;

在这种情况下,无论deux属于哪个组,它都属于组,canardun属于创建它的用户组。

在Shell命令中使用分号的次要说明

不同于cperl,如果在同一命令行上有另一个shell命令,则只需在shell命令后跟一个分号。因此,请考虑以下命令行:

chgrp canard .; chmod g+s .;

最终的分号是多余的,可以删除:

chgrp canard .; chmod g+s .

此外,如果我们将两个命令放在单独的行上,则不需要其余的分号:

chgrp canard .
chmod g+s .

1
cp实际上,被复制(例如,通过复制)的文件是新创建的。如果他们没有继承组权限,则复制程序正在玩游戏,例如复制到临时文件,然后将其移动到目标目录。
哈兹2015年

1
@Kaz好点。我更新了答案以阐明它是cp -p覆盖setgid设置的原因。
John1024

但是是否cp -p覆盖setgid设置?在每个存在的Unix实现上?POSIX说,未指定在cp -p下复制用户ID或组ID失败是否会导致诊断消息!但是,在这种情况下,分别需要清除S_SUID和S_SGID位(即,如果文件是setuid bob,但是bob的所有权无法被复制,从而文件由janet拥有,则不要使其成为setuid珍妮特(janet。)
哈兹(Kaz

“是否cp -p覆盖setgid设置?” 根据POSIX规范,这就是应该执行的操作。在我使用过的所有Unix系统上都这样做。您已经引用了规范中有关在无法复制组ID时应采取的保护措施的部分。我从来没有遇到过这种“不能”的情况,对吗?
John1024

7

您可以使用chmod命令更改文件权限。在Unix中,访问权限类和访问类型都指定了文件权限,该权限确定谁可以对文件进行不同类型的访问。访问类别是一组用户,并且可以为每个类别分配特定的访问类型

Unix / Linux具有可以分配用于文件访问的用户和用户组

选项g + s如下:

g-文件组中其他用户拥有的权限

s-在执行时设置用户或组ID

这是一个示例用法:

chmod =rwx,g+s filename

(允许所有人读取,写入和执行特定文件并打开设置的组ID)

要设置/修改文件的权限,您需要使用chmod程序。当然,只有文件的所有者可以使用chmod来更改文件的权限。chmod具有以下语法:chmod [options]模式文件“模式”部分指定作为参数的文件的新权限。一个模式指定应更改哪些用户的权限,然后指定应更改哪些访问类型。举例来说:chmod ax socktest.pl

这意味着应清除所有用户的执行位(-)。(所有者,组和世界其他地方)权限以字母开头,该字母指定更改应影响哪些用户,这可以是以下任意一种:

u the owner user
g the owner group
o others (neither u, nor g)
a all users

随后是一条更改指令,该指令由+(设置位)或-(清除位)以及与应更改的位相对应的字母组成。让我们看一些例子:

$ ls -l socktest.pl 
-rwxr-xr-x   1 nick     users         1874 Jan 19 10:23 socktest.pl*

$ chmod a-x socktest.pl 
$ ls -l socktest.pl 
-rw-r--r--   1 nick     users         1874 Jan 19 10:23 socktest.pl

$ chmod g+w socktest.pl 
$ ls -l socktest.pl 
-rw-rw-r--   1 nick     users         1874 Jan 19 10:23 socktest.pl

$ chmod ug+x socktest.pl 
$ ls -l socktest.pl 
-rwxrwxr--   1 nick     users         1874 Jan 19 10:23 socktest.pl*

$ chmod ug-wx socktest.pl 
$ ls -l socktest.pl 
-r--r--r--   1 nick     users         1874 Jan 19 10:23 socktest.pl

奇怪的数字...您可能遇到过chmod 755 somefile之类的事情,当然您会怀疑这是什么。事实是,您可以使用一个数字一次更改文件的整个权限模式,例如本示例中的数字。每个模式都有一个对应的代码号,正如我们将要看到的,有一种非常简单的方法来找出与任何模式对应的数字。模式编号上的三个数字中的每个数字都对应于三个许可三元组之一。(u,g和o)三元组中的每个许可位都对应一个值:r为4,w为2,x为1。如果允许位,则将此值添加到允许三元组的编号中。如果清除,则不添加任何内容。(有些人可能会注意到,实际上,

您的三元组: rwx => 4 + 2 + 1 = 7

g的三元组: r-x => 4 + 0 + 1 = 5

o的三元组: r-x => 4 + 0 + 1 = 5

这使得: 755

因此,755是一种简短的说法,“我不介意其他人是否读取或运行此文件,但只有我应该能够对其进行修改”,而777则表示“每个人都可以完全访问此文件”

完美的参考


0

ls命令的结果将取决于umask。

g + s将sgid设置为文件。请点击这里关于SUID SGID更多深层次信息

因此,如果您的umask例如为022,则结果将类似于:

-rw-r--r--    1 romeo    canard     0 Jan 31 20:58 deux
-rw-r-Sr--    1 romeo    UsersGrp   0 Jan 31 20:58 un

0

在Linux中,ext的默认安装选项之一?fs是“讨厌” | sysvgroups”。因此,第一次触摸un会创建一个组ID等于创建过程的fsgid的文件,其中fsgid = egid。

chmod g + s。,使后续的文件/目录创建从父文件夹继承组ID,如果创建的东西是目录,它也将g + s设置为其父目录。

在这里触摸deux,创建带有deux和group canard的deux。

如果mount选项为'grpid |,则语义会更改。在这种情况下,bsdgroups的创建新文件/目录将从其父文件夹继承组ID,即使没有为父文件本身设置g + s。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.