目录
一、文件权限简介
当我们使用ll或ls查看某个文件或者目录的信息时,第一列就会显示出它的权限设置,一共有十个字符,
第1个字符用来表示文件类型,目录是d,链接是l,普通文件是-;接下来的 9 个字符,3个为一组,共三组,分别表示文件所有组,文件所有者所在的群组成员,其他成员的权限,其中权限有三种:r、w、x分别代表读、写、执行。如果是用数字表示,对应的值分别为4,2,1;
假如文件权限为:-rwx rwx rwx,转换为八进制值为777。
对于普通文件来说,每种权限对应的操作:
权限 | 文件 | 目录 |
r | 可以读取文件内容 | 可以显示出目录的内容 |
w | 可以修改文件内容 | 可以新增、删除目录下的文件 |
x | 可以执行文件 | 可以进入目录 |
可以使用chown(修改所有者)、chgrp(修改所属组)、chmod(修改文件权限)来修改文件或者目录的权限。
二、利用特殊权限实现普通用户通过VSCode远程调试
其中还有一些特殊权限:比如chmod +s,可以在文件执行时把进程的属主或组ID置为该文件的文件属主。
在使用VSCode调试远程代码时,需要使用到 /usr/bin/gdb,但是一般VSCode使用普通用户打开了文件目录,所以在调试时,就会报错权限不足,网上搜到的解决方法有:
1、在自己目录下新建个shell脚本,内容为:
#!/bin/sh sudo /usr/bin/gdb "$@"
但是需要输入密码,如果配置了免密登录,这个会直接报错,读取密码错误;
2、修改/etc/sudoers文件,在里面配置普通用户(vscode远程连接的用户)免密码,但是我试了后也没有生效;
3、最终的解决办法是 sudo chmod +s /usr/bin/gdb
这样普通用户执行/usr/bin/gdb时,就会成为该可执行文件的所有者,从而具有可执行权限。
三、默认文件和目录权限
Linux 平台下文件的最大权限是666(-rw-rw-rw-), 文件夹的最大权限是777(-rwxrwxrwx)
当我们新建一个目录或者文件时,j假设我们设置的新建文件权限为666(mode)真正创建出来的文件或者文件夹权限是通过mode & ~umask得到的。
umask是用来设置限制文件权限的掩码,在Linux下直接使用umask命令可以查看当前用户的掩码值。
默认普通用户umask值为0002(-----w-),也就是会去掉其他用户的写权限。
root用户umask值为0022,也就是会去掉本组用户和其他用户的写权限。
测试代码如下:
#include <fcntl.h>
#include <stdio.h>
#include <sys/stat.h>
int main() {
//umask(0); //将umask值设置为0000,实际创建的文件权限即为下面的mode值
// 438为十进制的666,两者都可以
if (open("/home/yang/workspace/other/file.txt", O_WRONLY | O_APPEND | O_CREAT,
438) < 0) {
printf("文件创建失败!\n");
}
return 0;
}
代码执行后的结果:
-rw-rw-r-- 1 yang yang 0 Jun 8 11:49 ./file.txt
此时其他用户就是不可写的,如果想要把文件改为其他用户也可写,需要把umask(0)加上。
-rw-rw-rw- 1 yang yang 0 Jun 8 11:52 ./file.txt