如果你对 linux 中的命令 chown
比较熟悉的话,学起 chown 函数也会格外轻松。chown 命令只能工作在 root 权限下,主要用来修改文件的所有者和所属组。
1 chown 命令
下面以实例简单讲解下 chown 的使用方法。当前登录的账号是 allen.
- 创建测试文件
$ touch test.txt
$ ls -l test.txt
-rw-rw-r-- 1 allen allen 0 12月 1 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 12月 1 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 12月 1 16:35 test.txt
3 总结
- chown 命令的简单使用
- getpwnam 函数的用法
- chown 函数的用法