2022-08-19  2024-09-18    642 字  2 分钟

修改文件或目录所有者

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 国际许可协议 进行许可转载请注明原作者与文章出处