처음부터 차근차근

chown() 본문

Linux & Unix

chown()

_soyoung 2022. 2. 25. 03:22
반응형

chown()

파일이나 디렉토리의 소유권자를 변경할 때 사용하는 함수이다.

 

chown [옵션] [소유권자] [파일or디렉토리]

소유권자는 이름 또는 숫자로도 입력이 가능하다.

 

소유권자 자리에 아래와 같이 입력해서 사용자와 그룹을 변경할 수 있다.

'사용자명' 만 적으면 : 사용자를 변경한다는 뜻

'사용자명:그룹명' or '사용자명.그룹명' : 사용자와 그룹을 같이 변경한다는 뜻

':그룹명' or '.그룹명' : 그룹을 변경한다는 뜻

 

옵션 자리에 들어가는 대표적인 옵션
-R, --recursive : 상위 디렉토리일 경우 하위 디렉토리나 하단 파일들까지 일괄 변경

 

 

 

실습

코드

#include <stdio.h>
#include <sys/types.h>
#include <fcntl.h>
#include <unistd.h>
#include <pwd.h>
#include <grp.h>

extern char* optarg;
extern int optind;

int main(int argc, char* argv[])
{
    int nOpt = 0;
    int fd; 
    int func = 0;
    struct passwd* stPasswd;
    struct group* stGroup;
   
    while ((nOpt = getopt(argc, argv, "123u:g:")) > 0) // getopt() : 옵션으로 -u [바꿀 사용자명]와 -g[바꿀 그룹명], -1 또는 -2 또는 -3을 받는 함수
    {
        switch (nOpt)
        {
        case '1': // -1을 적으면
            func = 1;
            break;
        case '2': // -2를 적으면
            func = 2;
            break;
        case '3':  // -3를 적으면
            func = 3;
            break;
        case 'u': // -u 뒤에 사용자 계정을 적으면 
            stPasswd = getpwnam(optarg); // 그 사용자 계정 정보를 얻어온다.
            break;
        case 'g': // -g 뒤에 그룹 계정을 적으면
            stGroup = getgrnam(optarg); // 그 그룹 계정 정보를 얻어온다.
            break;
        default: // -u -g를 적지 않거나 -1, -2, -3적지 않으면
            printf("Usage : %s [-1 or -2 or -3] [-u user] [-g group] file...\n", argv[0]);
            return -1; // 종료
        }
    }

    if (stPasswd == NULL || stGroup == NULL || func == 0) // 사용자 계정이나 그룹 계정 정보가 받아져 있지 않으면, -1 or -2 or -3을 적지 않으면
    {
        printf("Usage : %s [-1 or -2 or -3] [-u user] [-g group] file...\n", argv[0]);
        printf("Neither User nor Group in this system!\n");
        return -1; // 종료
    }

    printf("UID : %d, GID : %d\n", stPasswd->pw_uid, stGroup->gr_gid); // stPasswd 포인터 변수를 이용해 사용자 계정의 id와 그룹의 id를 출력

    for (int i = 0; ; i++) // 무한 루프
    {
        if (optind >= argc) // 적은 파일 수 만큼만 실행하고 무한루프 종료
        {
            break;
        }

        char* pFile = argv[optind++];
        printf("\t[%02d] : %s\n", i, pFile); // 파일명들 출력
        
        if (func == 1) // -1을 적었다면 lchown()호출 방식으로
        {
            lchown(pFile, stPasswd->pw_uid, stGroup->gr_gid); // pFile의 사용자 id, 그룹 id를 변경
        }
        else if (func == 2) // -2를 적었다면 chown()호출 방식으로
        {
            chown(pFile, stPasswd->pw_uid, stGroup->gr_gid); // pFile의 사용자 id, 그룹 id를 변경
        }
        else if (func == 3) // -3을 적었다면 fchown()호출 방식으로
        {
            fd = open(pFile, O_RDWR);
            fchown(fd, stPasswd->pw_uid, stGroup->gr_gid); // pFile의 사용자 id, 그룹 id를 변경
            close(fd);
        }
    }
    return 0;     
}

 

 

실행결과

 

 

 

 

출처 : 운영체제(21-1학기)김병국교수 강의 내용 변형 및 요약

반응형
Comments