修改文件或目录所有者
1# 修改文件的所有者为root
2chown root <file>
3# 修改文件的所有者和所有组为root
4chown root: <file>
5# 修改文件的所有者为root,所有组为akvicor
6chown root:akvicor <file>
7# 修改文件的所有组为root
8chown :root <file>
修改文件或目录的访问权限
1# chmod <xxx> <file/dir>
2chmod 777 file
3# chmod <u/g/o/a><+/-><r/w/x> <file/dir>
4chmod u+x file
目标
u
: 用户g
: 组o
: 其他用户a
: 全部
操作
+
: 加-
: 减
权限
r
: 读w
: 写x
: 执行
特殊权限
s
: ->u
组,简称SUID的特殊权限。当执行该文件时将具有该文件所有者的权限。s
: ->g
组,简称SGID的特殊权限。在该目录下创建的文件和目录都属于该目录所属的组t
: ->o
组,简称SBIT的特殊权限。只能让所属主以及root可以删除/移动/重命名该目录下的文件
其中sudo命令就是通过u
组的s
权限实现的。
sudo原理
源码
1#include <stdio.h>
2#include <unistd.h>
3
4int main(int argc, char* argv[]) {
5 printf("ruid: %d\n",getuid());
6 printf("euid: %d\n",geteuid());
7
8 if(execvp(argv[1], argv+1) == -1) {
9 perror("execvp error");
10 };
11 return 0;
12}
编译
查看文件权限
1-rwxr-xr-x 1 vivc vivc 17K Aug 19 16:32 main
运行
可以看到文件ruid和euid均为自己
1ruid: 1001
2euid: 1001
3Segmentation fault
修改文件所有者
1sudo chown akvicor main
查看文件权限
1-rwxr-xr-x 1 akvicor vivc 17K Aug 19 16:32 main
运行
可以看到文件ruid和euid均为自己
1ruid: 1001
2euid: 1001
3Segmentation fault
添加s权限
1chmod u+s main
运行
可以看到ruid为自己,euid则与文件拥有者相同,此时这个程序运行时将具有euid用户的权限
1ruid: 1001
2euid: 1000
3Segmentation fault
测试权限
由于代码中固定需要两个参数,因此使用rm file
测试。
1-rw------- 1 akvicor akvicor 0 Aug 19 16:49 file
file
文件属于akvicor
,只有akvicor
有权限删除。而main
程序由于具有s
特殊权限且属于用户akvicor
,因此通过main
来执行rm命令便可以删除file
文件
1./main rm file
除另有声明外,本博客文章均采用 知识共享 (Creative Commons) 署名 4.0 国际许可协议 进行许可。转载请注明原作者与文章出处。