可以利用系统调用chmod和fchmod取修改文件的权限
NAME
chmod, fchmod - change permissions of a file
SYNOPSIS
#include <sys/stat.h>
int chmod(const char *path, mode_t mode);
int fchmod(int fd, mode_t mode);
系统调用chmod()更改由path参数所指定文件的权限:
- 如果path是符号链接,调用chmod会解引用改变真实文件的权限
- 因为:符号链接自创建起,其所有权限为所有用户共享,而且这些权限也不得更改。对符号链接解引用时,将忽略所有这些权限。
系统调用 fchmod()更改由打开文件描述符 fd 所指代文件的权限。
参数 mode 用于描述文件的新权限,可以采用八进制数字形式,亦或是由下表所列权限位相或(|)而成的掩码。
常量 | 其他值 | 权限位 |
---|---|---|
S_ISUID | 04000 | Set-user-ID |
S_ISGID | 02000 | Set-group-ID |
S_ISVTX | 01000 | Sticky |
S_IRUSR | 0400 | User-read |
S_IWUSR | 0200 | User-write |
S_IXUSR | 0100 | User-execute |
S_IRGRP | 040 | Group-read |
S_IWGRP | 020 | Group-write |
S_IXGRP | 010 | Group-execute |
S_IROTH | 04 | Other-read |
S_IWOTH | 02 | Other-write |
S_IXOTH | 01 | Other-execute |
要想更改文件权限,进程要么具有特权级别(CAP_FOWNER)要么其有效用户 ID 于文件的用户 ID(属主)相匹配。(准确说来,对于 Linux 系统上的非特权级进程,需与文件用户 ID 相匹配的是进程的文件系统用户 ID,而非其有效用户 ID)
要将文件权限设为使所有用户都可以读,需要:
if(chmod("file", S_IRUSR| S_IRGRP | S_IROTH) == -1){
perror("chmod");
exit(EXIT_FAILURE);
}
// or : chmod("myfile", 0444);
要修改文件的特定权限位,需要先调用stat()来获取文件的现有权限,调整想要修改的权限位,然后使用chmod去更新权限位:
struct stat sb;
mode_t mode;
if(stat("file", &sb) == -1){
perror("stat");
exit(EXIT_FAILURE);
}
mode = (sb.st_mode | S_IWUSR) & ~s_IROTH; // owner-writen, other-read, remaining bits unchanged
if(chmod("file", mode ) == -1){
perror("chmod");
exit(EXIT_FAILURE);
}