Linux下修改文件及目录的权限和用户
修改用户和用户组
Linux下修改文件属主可以通过如下函数进行:
#include <unistd.h> int chown(const char *path, uid_t owner, gid_t group); int fchown(int fd, uid_t owner, gid_t group); int lchown(const char *path, uid_t owner, gid_t group);
各函数描述如下:
chown:修改文件的属主,文件通过路径path指定,对于符号链接会进行解析,即如果指定的为符号链接的话,该函数会修改实际文件的属性。
fchown:修改文件的属主,文件通过文件描述符fd指定。
lchown:和chown一样,不同是它不解析符号链接,即如果指定的为符号链接的话,该函数会修改链接的属性,而不是文件的。
修改权限
Linux修改文件权限可以通过如下函数进行:
#include <sys/stat.h> int chmod(const char *path, mode_t mode); int fchmod(int fd, mode_t mode);
chmod:修改文件的权限,文件通过path参数指定的路径名指定,对于符号链接会进行解析,即如果指定的式链接的话,会修改文件的权限。
fchmod:修改文件的权限,文件通过文件描述符fd参数指定。
示例代码
#include <sys/types.h> #include <sys/stat.h> #include <time.h> #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <errno.h> #include <libgen.h> #include <pwd.h> #include <string.h> #include <fcntl.h> void print_file_info(const char *filename) { struct stat sb; if (lstat(filename, &sb) == -1) { printf("lstat failed. errno: %d, failed reason: %s.\n", errno, strerror(errno)); perror("stat"); exit(EXIT_SUCCESS); } printf("File type: "); switch (sb.st_mode & S_IFMT) { case S_IFBLK: printf("block device\n"); break; case S_IFCHR: printf("character device\n"); break; case S_IFDIR: printf("directory\n"); break; case S_IFIFO: printf("FIFO/pipe\n"); break; case S_IFLNK: printf("symlink\n"); break; case S_IFREG: printf("regular file\n"); break; case S_IFSOCK: printf("socket\n"); break; default: printf("unknown?\n"); break; } printf("I-node number: %ld\n", (long) sb.st_ino); printf("Mode: %lo (octal)\n", (unsigned long) sb.st_mode); printf("Link count: %ld\n", (long) sb.st_nlink); printf("Ownership: UID=%ld GID=%ld\n", (long) sb.st_uid, (long) sb.st_gid); printf("Preferred I/O block size: %ld bytes\n", (long) sb.st_blksize); printf("File size: %lld bytes\n", (long long) sb.st_size); printf("Blocks allocated: %lld\n", (long long) sb.st_blocks); printf("Last status change: %s", ctime(&sb.st_ctime)); printf("Last file access: %s", ctime(&sb.st_atime)); printf("Last file modification: %s", ctime(&sb.st_mtime)); return; } int main(int argc, char *argv[]) { int ret; int fd; struct passwd *pwd; if (argc != 3) { printf("usage: create a symbolic link from second file to first file. \n%s <source_file_name> <dest_file_name>.\n", basename(argv[0])); return -1; } pwd = getpwuid(getuid()); if (NULL == pwd) { printf("getpwnam failed, errno: %d, fail reason: %s.\n", errno, strerror(errno)); return -1; } printf("user info: \n"); printf("user name: %s.\n", pwd->pw_name); printf("user password: %s.\n", pwd->pw_passwd); printf("user uid: %d.\n", pwd->pw_uid); printf("user group id %d.\n", pwd->pw_gid); printf("real user name: %s.\n", pwd->pw_gecos); printf("home directory: %s.\n", pwd->pw_dir); printf("shell program: %s.\n", pwd->pw_shell); ret = symlink(argv[1], argv[2]); if (0 != ret) { printf("symlink failed. errno: %d, fail reason: %s.\n", errno, strerror(errno)); //return -1; } printf("========after symlink======\n"); print_file_info(argv[2]); ret = chmod(argv[2], 0644); if (0 != ret) { printf("chmod failed. errno: %d, fail reason: %s.\n", errno, strerror(errno)); //return -1; } printf("========after chmod======\n"); print_file_info(argv[2]); fd = open(argv[2], O_RDONLY); if (fd < 0) { printf("open failed. errno: %d, fail reason: %s.\n", errno, strerror(errno)); return -1; } ret = fchmod(fd, 0755); if (0 != ret) { printf("fchmod failed. errno: %d, fail reason: %s.\n", errno, strerror(errno)); return -1; } printf("========after fchmod======\n"); print_file_info(argv[2]); ret = chown(argv[2], pwd->pw_uid, pwd->pw_gid); if (0 != ret) { printf("chown failed. errno: %d, fail reason: %s.\n", errno, strerror(errno)); //return -1; } printf("========after chown======\n"); print_file_info(argv[2]); //unlink(argv[2]); return 0; }