文件属性是内核控制的数据,只能由内核来修改。内核开放了几个系统调用供用户态进程使用,用户态进程可以请求内核修改文件属性。涉及属主和属组的系统调用是:
chown一族系统调用可以同时修改文件的属主和属组,参数分别对应owner和group。如果给出的参数值为-1,表示维持原有值不变。更换文件的属主需要特权chown。怎么理解呢?在人类社会中将别人的东西据为己有是不行的,除非你有特权,比如法院可以判决没收某人财产。但是,如果一个文件的属主和进程的fsuid相同,进程能不能将文件的属主改为别的uid呢?这就象人类社会的赠予行为,似乎应是允许的。据说在早期的BSD系统中这类赠予行为是允许的。后来发现有人钻空子,将自己的文件的属主改为别人,修改之前确保文件的允许位(内容见第4章)能保证本人对文件有必要的访问权限,在有硬盘配额(quota)控制的系统中,此文件就会占用别人的资源配额,而又不影响自己使用。
还有一点很有趣,进程凭证中有4个uid,在进程的fsuid和文件的属主相等的情况下,能否让没有chown特权的进程将文件的属组改为进程的某个uid值呢?不行。这种设计一是简单,二是有这样一种考虑,进程凭证中多个uid机制的引入是为了在运行时暂时授权。比如进程的(r)uid是1000,fsuid是1001,进程就具备了1001用户的访问文件的权限,但是仅仅是访问,不能将文件的属主修改为1000。这就像你借了一本书,你可以读,甚至可以写,但是不能把这本书据为己有。概括为一句话,修改文件属主需要chown特权。
文件的属组id和属主id情况略有不同。在没有特权的情况下,进程可以将文件的属组id改为进程凭证中的某一个组id。在有特权chown的情况下,进程可以将文件的属组id修改为任意值。
chown和lchown的参数path用于规定文件的路径。如果路径是相对路径,就以进程的当前工作目录为路径起始点。lchown的意思是当目标文件是符号链接时,对符号链接文件本身操作,chown则是对符号链接所指向的文件操作。
fchown和前面两个的不同之处是它根据已打开的文件描述符定位要操作的目标文件。在fchownat系统调用中,当pathname是相对路径时,dirfd是一个已经打开的目录的描述符,用作相对路径查找的起始点。有趣的是,前面三个系统调用都可以由fchownat实现。fchownat的参数flags是一个整数,在系统调用中内核将flags的若干位作为标志使用:
●参数flags的AT_EMPTY_PATH位的值为1时,dirfd对应的文件是目标文件,这和fchown功能相同。(www.xing528.com)
●参数flags的AT_SYMLINK_NOFOLLOW位的值为1时,若pathname指向符号链接文件时,符号链接文件本身是目标文件。这覆盖了lchown。
●当dirfd是特殊值“AT_FDCWD”时,pathname的相对路径起点是进程的当前工作目录。这覆盖了chown。
上面说的是修改,下面看一下查看:
stat的定义是
fstat取文件描述符fd所指向的文件的文件属性。当目标文件是符号链接文件时,lstat取出符号链接文件本身的文件属性,stat取出符号链接文件所指向的文件的文件属性。
从上面的数据结构看,stat一族系统调用并没有将所有的文件属性都取出来。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。