UNIX如何设置用户ID位?


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;

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 时充分考虑到这个程序存在的风险。当然授权需谨慎。


上一篇:Linux虚拟机的设备id与盘符不相符如何办?

下一篇:Linux安装VMware Tools虚拟机图文教程


linux设置用户id位 如何设置用户id位
Copyright © 2002-2019 测速网 www.inhv.cn 皖ICP备2023010105号
测速城市 测速地区 测速街道 网速测试城市 网速测试地区 网速测试街道
温馨提示:部分文章图片数据来源与网络,仅供参考!版权归原作者所有,如有侵权请联系删除!

热门搜索 城市网站建设 地区网站制作 街道网页设计 大写数字 热点城市 热点地区 热点街道 热点时间 房贷计算器