'chmod g+s' 命令

otu*_*tus 74 permissions chmod files setgid

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

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

cd /home/canard;
touch un;
chgrp canard .;
chmod g+s .;
touch deux ;
Run Code Online (Sandbox Code Playgroud)

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

Joh*_*024 91

chmod g+s .;
Run Code Online (Sandbox Code Playgroud)

此命令在当前目录上设置“设置组 ID”(setgid)模式位,写为..

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

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

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

例子

touch un;
chgrp canard .;
chmod g+s .;
touch deux ;
Run Code Online (Sandbox Code Playgroud)

在这种情况下,deux将属于组canardun将属于创建它的用户组,无论是什么。

在 Shell 命令中使用分号的小注意事项

与 C 或 Perl 不同,如果在同一命令行上有另一个 shell 命令跟在它后面,则 shell 命令只需要跟一个分号。因此,请考虑以下命令行:

chgrp canard .; chmod g+s .;
Run Code Online (Sandbox Code Playgroud)

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

chgrp canard .; chmod g+s .
Run Code Online (Sandbox Code Playgroud)

此外,如果我们将这两个命令放在不同的行上,那么剩下的分号就不需要了:

chgrp canard .
chmod g+s .
Run Code Online (Sandbox Code Playgroud)

文档

有关更多信息,请参阅man chmod。此外,维基百科有总结命令选项的表格chmod

  • 复制的文件(例如通过“cp”)实际上是新创建的。如果他们没有继承组权限,那么复制程序就是在玩游戏,比如复制到临时文件,然后将其移动到目标目录。 (2认同)
  • @Kaz 好点。我更新了答案以澄清是 `cp -p` 覆盖了 setgid 设置。 (2认同)

小智 11

您可以使用 chmod 命令更改文件权限。在 Unix 中,文件权限由访问类和访问类型指定,文件权限确定谁可能对文件具有不同类型的访问权限。访问类是用户组,每个用户都可以分配特定的访问类型

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

选项 g+s 如下:

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

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

这是一个示例用法:

chmod =rwx,g+s filename
Run Code Online (Sandbox Code Playgroud)

(允许每个人读、写和执行特定文件并打开设置的组 ID)

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

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

u the owner user
g the owner group
o others (neither u, nor g)
a all users
Run Code Online (Sandbox Code Playgroud)

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

$ 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
Run Code Online (Sandbox Code Playgroud)

奇怪的数字...您可能遇到过诸如 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 表示“每个人都可以完全访问此文件”

完美的参考


eig*_*eld 5

我只想在这里添加我的答案,因为这个主题通常没有被清楚地理解。Linux文件/文件夹权限位总共由16位组成,细分如下:

  • 4 位描述文件(常规、文件夹、套接字、fifo、链接等)
  • 12位(用户4位,组4位,其他4位)

文件或文件夹具有此user,groupother属性。该属性中的每个属性都包含readwrite和子属性。executemodifier

user有三位对应于rwx我们看到的东西。该group可能也有rwx,所以是other也有自己的rwx。但实际上,在它的下面是 is 修饰符rwx??。因此,我们有三个修饰符位,通常根据它是否是user,group或 的第 4 位来命名other

  • 用户修饰符位(又名 setuid)
  • 组修饰符位(又名 setgid)
  • 其他修饰位(粘性位)

然后,这些位的隐含系统语义根据它是文件、文件夹还是可执行文件而变化。最终的效果是,某些文件变成只读,或者可执行的二进制文件在RAM中长期保留,或者文件执行时进程的有效用户/组ID发生变化。

因此,以下命令将是无效且没有效果的:

  • chmod u+t
  • chmod o+s

and修饰符位可以通过 and 进行设置,出于某种原因或约定,user修饰符可以通过or simple设置。group+sothero+t+t