更深入地研究Linux权限

有时候,在查看Linux上的文件权限时,您会看到比普通的r、w、x和-名称更多的名称。你怎样才能更清楚地了解这些不同寻常的角色想要告诉你什么,以及这些权限是如何运作的?

雷竞技投注下载

有时你会看到比平常更多的东西r,w,x-在查看Linux上的文件权限时指定。而不是特权对于权限字符串中的所有者、组和其他字段,您可能会看到一个年代t,例如:

drwxrw年代rwt

要更清楚地了解这一点,一种方法是查看统计命令。stat输出的第4行以八进制和字符串格式显示文件权限:

$ stat /var/mail File: /var/mail Size: 4096 Block: 8 IO Block: 4096 directory Device: 801h/2049d Inode: 1048833 Links: 2 Access: (3777 / drwxrwsrwt修改:2019-05-21 19:03:48.226656344 -0400修改:2019-05-21 19:03:48.226656344 -0400修改:2019-05-21 19:03:48.226656344 -0400出生:-

这个输出提醒我们,有超过9位分配给文件权限。事实上,有12个。这三个额外的位提供了一种方法来分配权限,超出通常的读、写和执行——例如,3777(二进制011111111111)表示使用了两个额外的设置。

第一个1(第二个位)在这个特定的值中表示SGID(设置组ID),并分配临时权限来运行文件或使用具有关联组权限的目录。

011111111111
^

SGID将临时权限授予使用该文件作为该组成员的人。

第二个1(第三位)是“粘性”位。它确保只有文件的所有者可以删除或重命名文件或目录。

011111111111
^

如果权限是7777而不是3777,我们就会知道还设置了SUID (set UID)字段。

111111111111
^

SUID为使用文件充当文件所有者的用户提供临时权限。

对于我们在上面看到的/var/mail目录,所有用户都需要一些访问权限,因此需要一些特殊的值来提供它。

现在让我们更进一步。

特殊权限位的一个常见用法是与类似于的命令一起使用passwd命令。如果你看看/usr/bin/passwd文件,您会注意到,SUID位设置,允许你改变你的密码(,因此,/etc/shadow文件)的内容,即使你运行作为一个普通的(不是特权)用户,没有读或写访问这个文件。当然,passwd命令非常聪明,它不允许您更改其他人的密码,除非您实际以root身份运行或使用sudo。

$ ls -l /usr/bin/passwd -rw年代3月22日14:32 /usr/bin/passwd $ ls -l /etc/shadow - rwr -r- 1根阴影2195 4月22日10:46 /etc/shadow

现在,让我们看看如何使用这些特殊权限。

如何分配特殊的文件权限

与Linux命令行上的许多事情一样,您可以选择如何发出请求。的修改文件权限命令允许您以数字方式更改权限或使用字符表达式。

要在数字上更改文件权限,您可以使用这样的命令来设置setuid和setgid位:

$ chmod 6775尝试

或者你可以使用这样的命令:

$ chmod ug+s tryme <== for SUID和SGID权限

如果您要添加特殊权限的文件是脚本,那么您可能会惊讶地发现它并不符合您的期望。这里有一个非常简单的例子:

$ cat tryme #!我是$USER

即使设置了SUID和SGID位以及文件根拥有的文件,运行这样的脚本也不会产生您可能期望的“我是根”响应。为什么?因为Linux会忽略脚本上的set-user-ID和set-group-ID位。

$ ls -l tryme - 1 root root 5月26日12:22 tryme $ ./tryme我是jdoe

另一方面,如果您使用编译过的程序尝试类似的操作,就像使用这个简单的C程序一样,您将看到不同的效果。在这个示例程序中,我们提示用户输入一个文件并为其创建它,从而授予文件写权限。

# include < stdlib。h> int main() {FILE *fp;/*文件指针*/ char fName[20];printf(“输入要创建的文件的名称:”);scanf (“% s”、帧);/*创建具有写权限的文件*/ fp=fopen(fName,"w");/*检查文件是否创建*/ if(fp==NULL) {printf(" file not created");退出(0);} printf(“文件创建成功\n”);返回0; }

当您编译程序并运行命令(使root成为所有者并设置所需的权限)后,您将看到它按预期的那样以root权限运行—留下一个新创建的root拥有的文件。当然,您必须拥有sudo特权才能运行一些必需的命令。

美元cc - o mkfile mkfile.c < = =编译程序$ sudo乔恩根:根mkfile < = =所有者和组更改为“根”$ sudo chmod ug + s mkfile < = =添加SUID和SGID许可。美元/ mkfile < = =运行程序输入文件的名称创建:创建空文件成功$ ls - l空-rw-rw-r——1根根0 5月26日13:15空

注意,该文件是由根用户拥有的——如果程序没有使用根用户权限运行,就不会发生这种情况。

权限字符串中不常见设置的位置(例如,rw)年代rw年代rwt)可以帮助提醒我们每一个位意味着什么。至少第一个“s”(SUID)在所有者权限区域,第二个(SGID)在组权限区域。我真搞不懂为什么那个黏糊糊的字母是“t”而不是“s”。也许创始人想象把它称为“俗气的东西”,但由于对这个词的第二个定义不那么讨喜,他们改变了主意。无论如何,额外的权限设置为Linux和其他Unix系统提供了许多额外的功能。

加入网络世界社区有个足球雷竞技app脸谱网LinkedIn对最重要的话题发表评论。
相关:

版权©2019Raybet2

工资调查:结果在