首页 > 编程知识 正文

open geosciences,c语言access函数

时间:2023-05-04 01:41:31 阅读:35551 作者:685

Unix中访问和打开函数的区别《Unix环境高级编程》学习笔记

学习内容:书中为图4-8提供了一个access函数的执行实例,并自行添加了一个简单的错误检查机制。 步骤如下。

# include ' apue.h ' # include fcntl.h//o _ rd only int main (int argc,char* argv[] () if ) argc!=2) err _ quit (usage :/a.outfilename (n ); if(access(argv[1],F_OK )0) ) err_quit ) ' thefiledoesn'texist.n ' ); }else{if(access(argv[1],R_OK )0) /测试读取权限err_ret ) ' accesserrorfor%s ',argv[1] ); else printf (读取访问确定.n ); if(access(argv[1],W_OK )0) /测试写入权限err_ret ) ' accesserrorfor%s ',argv[1] ); else printf (写入访问.n ); if(access(argv[1],X_OK )0) /测试执行权限err_ret ) ' accesserrorfor%s ',argv[1] ); else printf (执行任务.n ); if(open ) argv[1],O_RDONLY )0) /只读err_ret('open%serror.',argv[1] ); else printf (打开for reading % sok. n ),argv[1]; (退出) 0; }该程序主要比较了access和open函数的功能。

access函数可用于测试real usr ID(实际用户ID )是否有权访问特定文件。 (int mode对应的常数参数有R_OK、W_OK、X_OK、F_OK。 ); 另一方面,open函数的结果可以测试用户进程的effective usr ID(有效用户ID )是否可以访问特定文件(与int oflag对应的参数是o _ rd ona.com

实际测试:接下来,在终端输入命令以验证程序的运行结果。 首先,查看此可执行文件的详细信息。

$ ls-la.out-rwxrwxr-x1 sar 15945 nov 3012336010 a.out其中第一位-表示文件,第九位是a.out文件的权限位,依次对应三个身份拥有的权限也就是说,程序的所有者是sar,与sar对应的权限是readable、writable和executable(9)这9位文件权限符号的前3位。

要测试可重新运行文件的权限:

如果$./a.out a.outreadaccessok.writeaccessok.executeaccessok.openforreadingok .运行./a.outa.out命令,则shell将返回到ff 另外,如果a.out文件也是由该普通用户创建的,则使用open函数读取a.out文件时,该进程的有效用户ID和a.out文件的所有者ID相同,因此注:有效的用户ID是进程的概念,而不是文件的概念。

access函数用于测试实际用户ID是否具有相应的访问权限。 如果实际的用户ID和有效的用户ID相同,则从前面三行的结果可以看出同时具有“rwx”权限。

在$ ls-l/etc/shadow---r---1 root 1315 jul 172002/etc/shadow Linux系统中,/etc/shadow文件通常存储用户的密码您会发现文件的所有者是root,其权限是可读的,其他用户没有任何权限。

在用户创建的进程中测试/etc/shadow文件权限:

$./a.out/etc/shadowaccesserrorfor/etc/shadow : permissiondeniedaccesserrorfor/etc/shadow : permissiondenior 由于shadow error. permission denied的实际用户ID和有效用户ID相同,因此/etc/shadow文件的所有者具有根(即实际用户ID )

效用户ID都和文件拥有者ID不匹配,那么就不会得到“r”权限,无论是open还是access函数都不能正常访问。
接下来我们修改a.out文件的拥有者,再测试access和open函数:

$ sudo suPassword:$ chown root a.out$ ls -l a.out-rwxrwxr-x 1 root 15945 Nov 30 12:10 a.out

可以看到文件拥有者变成了root,但此时所属群组还是sar(书中没有写)。
此时再测试a.out可执行文件:

$ ./a.out a.outread access OK.write access OK.execute access OK.open for reading a.out OK.

按理说文件拥有者ID已经和 进程(执行a.out可执行文件的进程)的有效用户ID、实际用户ID不匹配,为什么该进程还能对a.out文件有相应的访问权限呢?这就涉及到权限匹配的顺序问题,有点类似短路原则:(以下图片来源于https://www.cnblogs.com/stemon/p/5287631.html的内容)

也就是说该进程的组ID和a.out文件的组ID匹配成功,因为a.out文件的所属群组ID未更改,只是更改了文件所有者。

$ chmod u+s a.out -rwsrwxr-x 1 root 15945 Nov 30 12:10 a.out$ ./a.out /etc/shadowaccess error for /etc/shadow: Permission deniedaccess error for /etc/shadow: Permission deniedaccess error for /etc/shadow: Permission deniedopen for reading /etc/shadow OK.

可以看到此时a.out可执行文件的权限位有SUID位,《Unix环境高级编程》中给出的解释是:‘‘When this file is executed, set the effective user ID of the process to be the owner of the file (st_uid).’’
那么当新创建的进程(要执行a.out可执行文件的进程)发现SUID位时,在exec()函数中内核(kernel)就会临时把该进程的有效用户ID更改为a.out的文件拥有者ID。那么此时该进程的有效用户ID为root,调用open函数访问/etc/shadow文件时,用户ID匹配成功,所以能够以只读方式打开shadow文件。
但是此时该进程的实际用户ID仍为普通用户ID,那么当用access函数测试时,就得不到/etc/shadow文件的任何访问权限,得到访问拒绝的结果,从结果中前三行可以看到。

总结:

https://blog.csdn.net/u010919133/article/details/89290087这篇博客很好的诠释了Linux中有效用户id、实际用户id、设置用户id的区别及进程访问文件机制,对我帮助很大。也欢迎大家评论留言!

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。