Linux文件系统权限及用户

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;
}
 

猜你喜欢

转载自jayceyxc.iteye.com/blog/2245378
今日推荐