在Linux系统中每一个进程都有好几个用户ID位 , 这些用户ID位怎么设置关系到文件访问的权限 。本文就来以UNIX为例 , 简单介绍一下UNIX如何设置用户ID位 。

用stat函数可以获取一个文件的状态信息 , 原型是这样的:
int stat(const char *path , struct stat *buf);
其中结构体stat的结构:
struct stat {
dev_t st_dev; /* ID of device containing file */
ino_t st_ino; /* inode number */
mode_t st_mode; /* protection */
nlink_t st_nlink; /* number of hard links */
uid_t st_uid; /* user ID of owner */
gid_t st_gid; /* group ID of owner */
dev_t st_rdev; /* device ID (if special file) */
off_t st_size; /* total size , in bytes */
blksize_t st_blksize; /* blocksize for file system I/O */
blkcnt_t st_blocks; /* number of 512B blocks allocated */
time_t st_atime; /* time of last access */
time_t st_mtime; /* time of last modification */
time_t st_ctime; /* time of last status change */
};
从传出的参数buf中可以拿到用st_uid , st_gid 表示的文件所有者ID , 和文件所有者所在的组ID 。
在UNIX进程中也有几组ID的概念 。分别是实际用户ID , 实际用户组ID , 有效用户ID和有效用户组ID等等 。当我们开始一个进程是 , 通常这个进程的有效用户ID就是这个进程的实际ID(比如我用eric用户登录 , 这个有效用户就我eric对应的ID) 。然而当“设置用户ID位”打开以后 , 有效ID就是进程的程序文件对应的所有者的ID 。
$ls -l 1.txt
-rw------- 1 root root 16 4月 29 14:31 1.txt
当前目录下面有一个文件“1.txt”是所有者root , 并且只有root具有读和写权限 。
1 int main()
2 {
3 int fd;
【UNIX如何设置用户ID位?】 4 if((fd=open(“1.txt” , O_RDONLY)) == -1)
5 {
6 printf(“Open failed.\n”);
7 exit(-1);
8 }
9 char buf[1024]={0};
10 read(fd , buf , 1024);
11 printf(buf);
12 printf(“\n”);
13 }
首先我在终端里使用su命令使用root用户 。gcc read.c -omain 。得到main程序 。
# gcc read.c -omain
# exit
exit
$ main
Open failed.
显然main的所有者也是root , 但是main程序依旧不可以打开“1.txt” , 这是因为main启动后这个进程的有效ID是进程的实际用户ID(也就是eric账户的ID) , 而“1.txt”只对root用户具有读写权限 , 所以open失败 。
把main的设置用户ID位打开可以用shell指令: chmod u+s main
我用的是c程序 , 主要代码如下:
1 struct stat buf = {0};
2 stat(“main” , &buf);
3 buf.st_mode |= S_ISUID;
4 chmod(“main” , buf.st_mode);
执行后 , main的“设置用户ID位”就打开了 。再在非root终端下 执行main程序 就可以成功的读出 1.txt的内容
$ main
linuxidc.com
linux权限设计还是比较合理的 , 虽然这里main程序可以运行时是已所有者root的权限 , 但是这需要root用户的授权:打开这个程序文件的“set uid bit”(设置用户ID位) 。只要在打开这个set uid bit 时充分考虑到这个程序存在的风险 。当然授权需谨慎 。
以上就是UNIX如何设置用户ID位的全部内容了 , 本文介绍了设置用户ID , 设置用户ID也是文件权限设置的一个例子 。
推荐阅读
- Win8.1如何选择图片默认打开程序
- 韩妆单品推荐带来女生闪亮活力,教你如何完成清爽彩妆
- 手机号查询定位 如何查手机定位那个人在哪里?
- 美甲如何贴钻才稳固,精致装饰保持的小技巧
- 如何单方面定位 如何查手机定位歷史
- 如何定位oppo手机所在位置 0pp0手机如何查定位
- 通过手机找人的位置 如何查手机定位华为
- 如何定位oppo手机位置 0pp0手机a5怎么查自己定位
- 如何培养气质呢? 气质的培养
- 怎么查定位 如何查手机定位去过哪里?
