Unix/Linux编程:更改文件属组---chown()

文件属主

每个文件都有一个与之关联的用户 ID(UID)和组 ID(GID),籍此可以判定文件的属主和属组

新建文件的属主

  • UID和进程的有效用户ID相同
  • GID和进程的有效组ID(等同于 System V 系统的默认行为),或者父目录的组ID(BSD 系统的行为)相同

当为项目创建目录时,需要该目录下的所有文件隶属于某一特定组,并且可为该组所有成员所访问。

改变文件属主:chown()、fchown()和 lchown()

系统调用 chown()、lchown()和 fchown()可用来改变文件的属主(用户 ID)和属组(组ID)

	   #include <unistd.h>

       int chown(const char *path, uid_t owner, gid_t group);

		#include <unistd.h>

       int lchown(const char *path, uid_t owner, gid_t group);

		#include <unistd.h>

       int fchown(int fildes, uid_t owner, gid_t group);

以上 3 个系统调用之间的区别类似于 stat()系统调用一族。

  • chown()改变由 pathname 参数命名文件的所有权。
  • lchown()用途与 chown()相同,不同之处在于若参数 pathname 为一符号链接,则将会
    改变链接文件本身的所有权,而与该链接所指代的文件无干。
  • fchown()也会改变文件的所有权,只是文件由打开文件描述符 fd 所引用。

参数 owner 和 group 分别为文件指定新的用户 ID 和组 ID。若只打算改变其中之一,只需将另一参数置为−1,即可令与之相关的 ID 保持不变。

只有特权级进程(CAP_CHOWN)才能使用 chown()改变文件的用户 ID。非特权级进程可使用 chown()将自己所拥有文件的组 ID 改为其所从属的任一属组的 ID,前提是进程的有效用户ID 与文件的用户 ID 相匹配。特权级进程则可将文件的组 ID 修改为任意值。

如果文件组的属主或属组发生了改变,那么 set-user-ID 和 set-group-ID 权限位也会随之关闭。这一安全举措是为了防止如下行为:普通用户若能打开某一可执行文件的 set-user-ID(或 set-group-ID)位,然后再设法令其为某些特权级用户(或组)所拥有,就能在执行该文件时获得特权用户身份。

改变文件的属主和属组时,如果已然屏蔽了属组的可执行权限位,或者要改变的是目录的所有权时,那么将不会屏蔽 set-group-ID 权限位。在上述两种情况下,set-group-ID 位的用途并非是去创建一个启用了 set-group-ID 的程序,因此将该位屏蔽并不可取。set-group-ID 的其他用途如下所示

  • 若屏蔽了属组的可执行权限位,则可利用 set-group-ID 权限位来启用强制文件锁定
  • 当作用于目录时,可利用 set-group-ID 位来控制在该目录下创建文件的所有权
gid_t           /* Return GID corresponding to 'name', or -1 on error */
groupIdFromName(const char *name)
{
    struct group *grp;
    gid_t g;
    char *endptr;

    if (name == NULL || *name == '\0')  /* On NULL or empty string */
        return -1;                      /* return an error */

    g = strtol(name, &endptr, 10);      /* As a convenience to caller */
    if (*endptr == '\0')                /* allow a numeric string */
        return g;

    grp = getgrnam(name);
    if (grp == NULL)
        return -1;

    return grp->gr_gid;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值