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

修改文件或目录所有者

# 修改文件的所有者为root
chown root <file>
# 修改文件的所有者和所有组为root
chown root: <file>
# 修改文件的所有者为root,所有组为akvicor
chown root:akvicor <file>
# 修改文件的所有组为root
chown :root <file>

修改文件或目录的访问权限

# chmod <xxx> <file/dir>
chmod 777 file
# chmod <u/g/o/a><+/-><r/w/x> <file/dir>
chmod u+x file

目标

  • u: 用户
  • g: 组
  • o: 其他用户
  • a: 全部

操作

  • +: 加
  • -: 减

权限

  • r: 读
  • w: 写
  • x: 执行

特殊权限

  • s: ->u组,简称SUID的特殊权限。当执行该文件时将具有该文件所有者的权限。
  • s: ->g组,简称SGID的特殊权限。在该目录下创建的文件和目录都属于该目录所属的组
  • t: ->o组,简称SBIT的特殊权限。只能让所属主以及root可以删除/移动/重命名该目录下的文件

其中sudo命令就是通过u组的s权限实现的。

sudo原理

源码

#include <stdio.h>
#include <unistd.h>

int main(int argc, char* argv[]) {
    printf("ruid: %d\n",getuid());
    printf("euid: %d\n",geteuid());

    if(execvp(argv[1], argv+1) == -1) {
        perror("execvp error");
    };
    return 0;
}

编译

查看文件权限

-rwxr-xr-x  1 vivc vivc  17K Aug 19 16:32 main

运行

可以看到文件ruid和euid均为自己

ruid: 1001
euid: 1001
Segmentation fault

修改文件所有者

sudo chown akvicor main

查看文件权限

-rwxr-xr-x  1 akvicor vivc  17K Aug 19 16:32 main

运行

可以看到文件ruid和euid均为自己

ruid: 1001
euid: 1001
Segmentation fault

添加s权限

chmod u+s main

运行

可以看到ruid为自己,euid则与文件拥有者相同,此时这个程序运行时将具有euid用户的权限

ruid: 1001
euid: 1000
Segmentation fault

测试权限

由于代码中固定需要两个参数,因此使用rm file测试。

-rw------- 1 akvicor akvicor 0 Aug 19 16:49 file

file文件属于akvicor,只有akvicor有权限删除。而main程序由于具有s特殊权限且属于用户akvicor,因此通过main来执行rm命令便可以删除file文件

./main rm file