8.11 更改用户ID和更改组ID
- 关于实际用户ID和有效ID,可查看4.4
setuid()可以设置 实际用户ID(user), 有效用户ID(effective),保存的用户ID(save)
setgid()可以设置实际组ID(user),有效组ID(effective),保存的用户ID(save)
- getuid()和geteuid()
uid_t getuid(void); uid_t geteuid(void); DESCRIPTION getuid() returns the real user ID of the calling process. //获取实际用户 id geteuid() returns the effective user ID of the calling process. //获取有效用户 id
- setuid的调用例子
// main.c文件 #include <stdio.h> #include <stdlib.h> #include <unistd.h> int main(int argc, char **argv) { if (argc < 3) { fprintf(stderr, "usage...\n"); exit(1); } pid_t pid = fork(); if (pid == 0) { setuid(atoi(argv[1])); // 将effective id设为uid execvp(argv[2], argv + 2); perror("execvp()"); exit(1); } wait(NULL); // 父进程等待 exit(0); } // 编译:make main // 可执行程序./main把自己设置为root用户的权限 // lbw@123:~/lbw/gitNote/chap8$ ./main 0 cat /etc/shadow // cat: /etc/shadow: 权限不够 // 查看main程序的所有者 // lbw@123:~/lbw/gitNote/chap8$ ll -l main // -rwxrwxr-x 1 lbw lbw 17040 2月 20 21:02 main* // 修改main程序的所有者:由lbw变为root // lbw@123:~/lbw/gitNote/chap8$ sudo chown root main // lbw@123:~/lbw/gitNote/chap8$ ll -l main // -rwxrwxr-x 1 root lbw 17040 2月 20 21:02 main* //修改权限 // lbw@123:~/lbw/gitNote/chap8$ sudo chmod u+s main // -rwsrwxr-x 1 root lbw 17040 2月 20 21:02 main* //执行成功 // lbw@123:~/lbw/gitNote/chap8$ ./main 0 cat /etc/shadow
- 不太清晰,后续继续更新学习。
8.13 system()函数
int system(const char *command); //相当于在/bin/bash中执行command命令
system()函数中调用了:fork+exec+wait函数,若3个函数执行成功,返回的是shell的终止状态。若出错,则是返回fork+exec+wait函数相关的错误提示。