2024年11月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 */

  ⒂blkt_t st_blocks; /* number of B blocks allocated */

  ⒃time_t st_atime; /* time of last aess */

  ⒄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 .txt

  ⒉-rw------- root root 月 : .txt

  ⒊当前目录下面有一个文件“.txt”是所有者root,并且只有root具有读和写权限。

  ⒋ int main(

  ⒌ int fd;

  ⒍ if((fd=open(“.txt”,O_RDONLY == -

  ⒎ printf(“Open failed.

  ⒏ exit(-;

  ⒐ char buf[]={};

  ⒑ read(fd,buf,;

  ⒒ printf(buf;

  ⒓ printf(“

  ⒔首先我在终端里使用su命令使用root用户。g read.c -omain。得到main程序。

  ⒕# g read.c -omain

  ⒖Open failed.

  ⒗显然main的所有者也是root,但是main程序依旧不可以打开“.txt”,这是因为main启动后这个进程的有效ID是进程的实际用户ID(也就是eric账户的ID,而“.txt”只对root用户具有读写权限,所以open失败。

  ⒘把main的设置用户ID位打开可以用shell指令: chmod u+s main

  ⒙我用的是c程序,主要代码如下:

  ⒚ struct stat buf = {};

  ⒛ stat(“main”,&buf;

  ① buf.st_mode |= S_ISUID;

  ② chmod(“main”,buf.st_mode;

  ③执行后,main的“设置用户ID位”就打开了。再在非root终端下 执行main程序 就可以成功的读出 .txt的内容

  ④linuxidc.

  ⑤linux权限设计还是比较合理的,虽然这里main程序可以运行时是已所有者root的权限,但是这需要root用户的授权:打开这个程序文件的“set uid bit”(设置用户ID位。只要在打开这个set uid bit 时充分考虑到这个程序存在的风险。当然授权需谨慎。

  ⑥以上就是UNIX如何设置用户ID位的全部内容了,本文介绍了设置用户ID,设置用户ID也是文件权限设置的一个例子。