有时候你看到的不仅仅是普通的r,w,x和- - - - - -在Linux上的名称在查看文件权限。而不是特权所有者、组和其他字段权限字符串,你可能会看到一个年代或t,就像这个例子:
drwxrw年代rwt
得到一个更清晰的一个方法是查看的权限统计命令。第四行统计的输出显示了文件权限八进制和字符串格式:
美元统计/var/mail文件:/var/mail大小:4096块:8 IO块:4096目录设备:801 h / 2049 d Inode: 1048833链接:2访问:3777 / drwxrwsrwt)Uid:(0 /根)Gid:(8 /邮件)访问:-0400 19:23:15.769746004 2019-05-21修改:-0400 19:03:48.226656344 2019-05-21变化:2019-05-21 19:03:48.226656344 -0400出生:-
这个输出提醒我们,有超过9位分配给文件权限。事实上,有12个。这些额外的三位提供一种方法来分配权限超出一般的读,写和执行- 3777(二进制011111111111),例如,表明两个额外的设置。
第一个1(第二位)在这个特定的值代表了SGID(设置组ID)和分配临时运行许可文件或使用相关的目录的权限组。
011111111111
^
SGID给人临时权限使用该文件作为这个群体的成员。
第二个1(第三位)是“粘性”。它确保只有文件的所有者能够删除或重命名的文件或目录。
011111111111
^
权限是7777而不是3777,我们已经知道SUID (UID)字段也被设置。
111111111111
^
SUID给临时用户权限使用文件作为文件所有者。
至于/var/mail目录,我们看着上面,所有用户需要访问一些特殊值需要提供它。
现在让我们再进一步。
的一个常见用途的特殊命令的权限位passwd命令。如果你看看/usr/bin/passwd文件,您会注意到,SUID位设置,允许你改变你的密码(,因此,/etc/shadow文件)的内容,即使你运行作为一个普通的(不是特权)用户,没有读或写访问这个文件。当然,passwd命令是足够聪明不允许你改变别人的密码,除非你实际上是作为根用户运行或使用sudo。
ls - l /usr/bin/passwd - rw美元年代r-xr-x 1根根63736年3月22日14:32 /usr/bin/passwd $ ls - l /etc/shadow -rw-r - - - - - - 1根影子2195年4月22日星期日晚上/etc/shadow
现在,让我们来看看你可以做什么与这些特殊权限。
如何分配特殊的文件权限
与Linux命令行上很多事情一样,你有选择如何使您的请求。的修改文件权限命令允许您更改权限数值或使用字符表达式。
改变文件权限的数值,您可以使用这样的命令来设置setuid和setgid位:
chmod 6775美元tryme
或者你可以使用一个命令如下:
chmod ug + s tryme < = =美元SUID和SGID许可
如果你添加了特殊权限的文件是一个脚本,你也许会感到惊讶,它不符合你的期望。这是一个非常简单的例子:
美元猫tryme # !/bin/bash呼应我$ USER
即使SUID和SGID位设置和文件设置成文件,运行一个脚本这样不会产生“我是根”的反应。为什么?因为Linux忽略了set-user-ID和set-group-ID位脚本。
$ ls - l tryme -rwsrwsrwt 1根根29日5月26日12:22 tryme。/ tryme我jdoe美元
如果你尝试使用编译程序类似,另一方面,与这个简单的C程序,你会看到一个不同的效果。在这个示例程序中,我们提示用户输入文件,并创建它,给文件的写权限。
# include < stdlib。h > int main(){文件*《外交政策》;/ *文件指针* /字符帧[20];printf("创建输入文件的名称:“);scanf (“% s”、帧);/ *创建文件的写权限* / fp = fopen(帧,“w”);/ *检查如果创建文件* / (fp = = NULL) {printf(“文件未创建”);退出(0);}printf("文件成功创建\ n ");返回0; }
一旦编译程序和运行的命令使根所有者和设置所需的权限,你会发现它与系统管理员权限运行像预期的那样——留下一个新创建的文件设置成。当然,你必须有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系统。