안녕하세요

현이입니다. 

오늘 포스팅 할 주제는 ACL( Access Control List) 입니다. 

 

특정 파일 혹은 디렉토리를 여러 사용자가 쓰고 읽을 수 있도록 

파일의 원소유권에 존속하지 않도록 만들어 주는 것을 ACL 이라고 할 수 있습니다.

 

이를 사용하기 위해서는 마운트 옵션에 acl 이 붙어 있어야 하며 

커널에 ACL옵션이 있어야 하며 관련 패키지가 설치 되어 있어야 합니다.

 

위의 3가지 조건이 갖추어진 환경이라면 setfacl 과 getfacl 이라는 명령어가 시스템에 존제할 것입니다.

 

기본 예제를 보여 드리겠습니다.

chacl u::rwx,u:user1:rwx,u:user2:r-x,g::r-x,o::---,m::rwx 파일 혹은 폴더 

 

chacl = 실행 파일 입니다.

 

u::rwx = user에게 rwx ( 읽기 쓰기 실행하기) 권한을 부여하겠다는 의미입니다. 

 

,u:user1:rwx,u:user2:r-x = u:user1:rwx, = user를 지정하고 해당 user에 권한을 부여합니다

값의 사이에는 ,(쉼표) 구분지어 주어야 합니다.

 

,g::r-x,o::---,m::rwx g:r-x, 그룹에 읽기와 쓰기의 권한을 부여하겠다는 의미입니다.

o::--- : other 지정되지 않은 사용자 혹은 그룹에게는 권한을 부여하지 않는다는 의미입니다.

m::rwx 요부분은 mask이지만 저도 아직은 정확한 개념이 안잡히네요 

 

 

이것을 쪼~끔 간단하게 사용할수 있도록 C로 간단히 짜 보았습니다..

 

소스코드는 이렇습니다. 

#include "stdlib.h"

#include "stdio.h"

/* 디랙토리 혹은 파일 이름을 인자값으로 받아오기 위해 argv를 사용 */

int main(int argc, char *argv[])

{

char userid[30];

int permission, k=1;

FILE *pt, *pt2;

system("mkdir -p /usr/local/sbin/control/conf");

system("awk -F: '{ if ($3>= 1000 ) print $1 }' /etc/passwd > usr/local/sbin/control/conf/user.conf");

system("sed -i '/nobody/d ' /usr/local/sbin/control/conf/user.conf");

if (argc <2){

printf("Useage : %s 디랙토리 or 파일명\n",argv[0]);

goto end;

}

else { goto read;}

 read:

 pt = fopen("/usr/local/sbin/control/conf/user.conf", "r") ;

 pt2 = fopen("/usr/local/sbin/control/conf/user-acl.conf", "w");

 fprintf(pt2,"#!/bin/bash\r\n");

 fprintf(pt2,"cd /data/home/%s ; find -exec chacl u::rwx",argv[1]); 

while(1)

{

idscan:

k++;

fscanf(pt,"%s",userid);

if (feof(pt)) break;

printf("%s에 대한 %s의 퍼미션을 입력하세요 : \r\n7 : 읽기+쓰기 모두가능, \r\n5 : 읽기만 가능\r\n0 : 접근불가\r\n입력 : " ,argv[1],userid); 

scanf("%d",&permission);

if(permission == 7){ 

printf("%s의 퍼미션  %d (읽기 + 쓰기 가능)",userid,permission);

fprintf(pt2,",u:%s:rwx",userid, permission,userid);

}

else if(permission == 5){

printf("%s의 퍼미션  %d (읽기만 가능)",userid,permission);

                fprintf(pt2,",u:%s:r-x",userid, permission,userid);

}

else if(permission == 0){

printf("%s의 퍼미션  %d (권한 없음)",userid,permission);

}

else {

printf("잘못선택하셨습니다.");

k=0;

goto idscan;}

 

printf("\r\n");

getchar();

if (fgetc (pt) == EOF) break;

   }

   fprintf(pt2,",g::r-x,o::---,m::rwx \"{}\" + ");

end:

 fclose(pt) ;

 system("chmod 770 /usr/local/sbin/control/conf/user-acl.conf");

 system("dos2unix /usr/local/sbin/control/conf/user-acl.conf");

 system("/usr/local/sbin/control/conf/user-acl.conf");

 system("rm -rf /usr/local/sbin/control/conf/user.conf ");

 system("rm -rf /usr/local/sbin/control/conf/user-acl.conf");

}

 

소스 긁어 쓰지 마시고 아래 파일을 받아서 쓰세요 인코딩은 EUC-KR입니다.
 

 

 

 

 

 

Posted by 현종이닷
,








안녕하세요 현이입니다.

 

오늘 포스팅은 리눅스서버에서 쓸 기술문서들 입니다...

 

awk을 이용하여 uid가 1000과 그 이상의 아이디 리스트를 출력하여 파일에 저장하는 소스 입니다. 

간단히 쉘로도 할 수 있습니다.... 

 

소스는 

 

#include <stdio.h>

#include <string.h>

#include <stdlib.h>

#include <unistd.h>

 

int main()

{

    system("mkdir -p /usr/local/sbin/control/conf");

    system("awk -F: '{ if ($3>= 1000 ) print $1 }' /etc/passwd > /usr/local/sbin/control/conf/user.conf");

    system("sed -i '/nobody/d ' /usr/local/sbin/control/conf/user.conf");

}

 

이러합니다 .... 쉽죠??? ㅎㅎ

 

설명을 덛붙히자면 

/etc/passwd 파일에서 

:로 구분지어진 드의 3번째 값(UID)이 1000 이상인 라인을 출력받아서 

awk -F: '{ if ($3>= 1000 ) print $1 }' /etc/passwd

/usr/local/sbin/control/conf/user.conf 에 저장을 한 후 

sed 로 uid 65535 인 nobody를 지워라 입니다.

 

파일은 이러합니다~~ ㅎㅎ 

 

user-control.c
다운로드

 

 

 

 

Posted by 현종이닷
,








젠투리눅스를 예전 셋팅해 놓은 뒤 관리 프로그램을 이제서야 만들게 되었으며

https://wiki.gentoo.org/wiki/Handbook:AMD64 이곳의 핸드북을 참고하여 만들었습니다.

 

우선 스크립트 내용을 설명 드리겠습니다.

 

#!/bin/sh

/* 텔넷 사용자를 위해 추가 */

case "$TERM" in

        xterm)

stty erase ^H

                ;;

        *)

                stty erase ^?

                ;;

esac

/* 변수에 명령어 저장 */

CURRENTIP=$(ifconfig  $(route | grep "default" | awk '{ print $8 }') | grep -w inet | awk '{ print $2 }')

CURRENTGW=$(route | grep "default" | awk '{ print $2 }')

 

clear

echo -e "\r\n\r\n\r\n"

echo "--------------------------------"

echo "|        네트워크 설정변경        |"

echo -e "--------------------------------\r\n\r\n\r\n"

echo -e "현제 IP : ${CURRENTIP} "

echo -e "현제 게이트웨이 : ${CURRENTGW} "

echo -e "네임서버정보 : \r\n$(cat /etc/resolv.conf)"

echo -e "호스트네임 : $(hostname)\r\n"

echo -e "원하시는 메뉴의 번호와 엔터를 눌러주세요\r\n\r\n"

echo "1. 아이피 변경"

echo "2. 게이트웨이 변경"

echo "3. 네임서버 변경"

echo "4. 호스트네임 변경"

echo "6. 초기메뉴로 돌아가기"

 

read num

  case $num in

    1)

        echo -n "변경할 아이피를 입력해 주세요 예) 192.168.0.254 : "

        read newip

sed -i "$(grep -n "config_$(route | grep "default" | gawk '{ print $8 }')" /etc/conf.d/net | awk -F: '{ print $1} ')s/$CURRENTIP/$newip/" /etc/conf.d/net >> /dev/null

echo -n "${newip} 로 아이피를 변경하였습니다. 제부팅 후 적용됩니다."

        /usr/local/sbin/control/network_setting-for-gentoolinux

    ;;

    2)

        echo -n "변경할 게이트웨이를 입력해 주세요 예) 192.168.0.1 : "

        read newgw

sed -i "$(grep -n "routes_$(route | grep "default" | gawk '{ print $8 }')" /etc/conf.d/net | awk -F: '{ print $1} ')s/$CURRENTGW/$newgw/" /etc/conf.d/net >> /dev/null

echo -n "${newgw} 로 아이피를 변경하였습니다. 제부팅 후 적용됩니다."

        /usr/local/sbin/control/network_setting-for-gentoolinux

 

    ;;

    3)

        echo -n "현제 네임서버 정보입니다."

        cat /etc/resolv.conf

        echo -n "변경할 1차 네임서버 주소를 입력해 주세요 예) 168.126.63.1 : "

        read ns1

        echo -n "2차 네임서버를 입력해 주세요 예) 168.126.63.2 : "

        read ns2

        echo "nameserver ${ns1}" > /etc/resolv.conf

        echo "nameserver ${ns2}" >> /etc/resolv.conf

        /usr/local/sbin/control/network_setting-for-gentoolinux

    ;;

    4)

        echo "현제 호스트테임 정보입니다."

        cat /etc/conf.d/hostname

        echo -n "변경할 호스트네임을 입력해 주세요 예) wdcil-NAS : "

        read host

        echo "hostname=${host}" > /etc/conf.d/hostname

        hostname ${host}

        service hostname restart

        /usr/local/sbin/control/network_setting-for-gentoolinux

    ;;

    6)

        echo "초기메뉴로 돌아갑니다."

        echo -n "Enter키를 눌러주세요"

        read enter

        /usr/local/sbin/control/admin1

    ;;

    *)

        echo "Warning : 잘못된 번호입니다."

        echo -n "Enter키를 눌러주세요"

        read enter

        /usr/local/sbin/control/network_setting-for-gentoolinux

    ;;

  esac

 

위에 내용 긁어 쓰셔도 되지만 그래도 편안파일로 올려드립니다

 

network_setting-for-gentoolinux
다운로드

 

 
 
 

 

Posted by 현종이닷
,