처음부터 차근차근
chown() 본문
반응형
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학기)김병국교수 강의 내용 변형 및 요약
반응형
'Linux & Unix' 카테고리의 다른 글
RC4와 AES, TELNET서버 구동, 로그 서비스 (0) | 2022.02.27 |
---|---|
프로세스 제어와 제한, 우선순위, 암호화 (0) | 2022.02.26 |
lseek, ftell, fseek, getcwd, getwd, get_current_dir_name, chdir, opendir, closedir, readdir, mkdir, rename, rmdir (0) | 2022.02.24 |
chmod, fchmod, stat, lstat, getopt (0) | 2022.02.23 |
고수준 파일 처리 기법 (0) | 2022.02.22 |
Comments