17-chown 函数

如果你对 linux 中的命令 chown比较熟悉的话,学起 chown 函数也会格外轻松。chown 命令只能工作在 root 权限下,主要用来修改文件的所有者和所属组。

1 chown 命令

下面以实例简单讲解下 chown 的使用方法。当前登录的账号是 allen.

  • 创建测试文件
$ touch test.txt
$ ls -l test.txt
-rw-rw-r-- 1 allen allen 0 121 16:35 test.txt

当前 test.txt 文件所有者是 allen,所属组也是 allen

  • 利用 chown 命令修改 test.txt 的所有者和所属组
$ sudo chown root:jack test.txt  // 运行该命令必须具备 root 权限
  • 结果
$ ls -l test.txt
-rw-rw-r-- 1 root jack 0 121 16:35 test.txt

可以看到,test.txt 的拥有者变成了 root,所属组变为了 jack。

接下来,我们使用 chown 打造自己的 mychown 命令。

2 实现自己的 mychown 命令

2.1 chown 函数原型

// pathname: 要更改的文件名
// owner: 拥有者 uid
// gropu: 所属组 gid
// 返回 0 成功,-1 失败
int chown(const char *pathname, uid_t owner, gid_t group);

需要注意的是,这个函数接受的是 uid 和 gid,而不是以字符串表示的用户名和用户组。所以需要另一个函数getpwnam根据字符串名称来获取 uid 和 gid. 它的原型如下:

/*
struct passwd {
    char   *pw_name;       // username
    char   *pw_passwd;     // user password
    uid_t   pw_uid;        // user ID
    gid_t   pw_gid;        // group ID
    char   *pw_gecos;      // user information
    char   *pw_dir;        // home directory
    char   *pw_shell;      // shell program
}
*/
struct passwd *getpwnam(const char *name);

它使用方法比较简单,这里不做详细展开了。

2.2 示例

说明:要实现的功能是既可以按照用户名来更改文件所有者,也可以按照 uid 来更改。

  • 代码(这段代码摘自 man 2 chmod
#include <pwd.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main(int argc, char *argv[]) {
  uid_t uid;
  struct passwd *pwd;
  char *endptr;

  if (argc != 3 || argv[1][0] == '\0') {
    fprintf(stderr, "%s <owner> <file>\n", argv[0]);
    exit(EXIT_FAILURE);
  }

  uid = strtol(argv[1], &endptr, 10);  /* Allow a numeric string */

  if (*endptr != '\0') {         /* Was not pure numeric string */
    pwd = getpwnam(argv[1]);   /* Try getting UID for username */
    if (pwd == NULL) {
      perror("getpwnam");
      exit(EXIT_FAILURE);
    }   

    uid = pwd->pw_uid;
  }

  if (chown(argv[2], uid, -1) == -1) {
    perror("chown");
    exit(EXIT_FAILURE);
  }

  exit(EXIT_SUCCESS);
}
  • 编译
$ gcc mychown.c -o mychown
  • 运行
$ sudo ./mychown allen test.txt
  • 结果
$ ls -l test.txt
-rw-rw-r-- 1 allen jack 0 121 16:35 test.txt

3 总结

  • chown 命令的简单使用
  • getpwnam 函数的用法
  • chown 函数的用法
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值