블로그 이미지
괴스트

예진이와 고고씽!!

Rss feed Tistory
Dev/linux 2010/04/05 15:13

Apache의 rewrite Module

크리에이티브 커먼즈 라이선스
Creative Commons License
Apache의 rewrite Module

 

mod_rewrite는 apache module의 한 종류로 서버 Request를 정해진 Rule에 의해서 다른 URL or File로 보내는 모듈 입니다.

아래 내용은 아파치에 mod_rewrite 모듈을 추가 하는 방법과 mod_rewrite의 지시자 종류 및 사용방법등을 설명 한 것입니다.

 

1. apache 컴파일 or rewrite 모듈 추가

 

apache 소스 다운로드 : http://www.apache.org

 

아파치 사이트에서 아파치 소스를 다운받아 압축 해제후 apache 컴파일 옵션에 아래와 같이 --enable-rewrite 옵션을 추가 합니다.

아래 예제와 같이 아파치 ./configure 실행시 에 --enable-rewrite를 추가하면 rewrite 모듈이 아파치 모듈에 올라가 사용할 있게 됩니다.

 

예제)

[root@localhost src]# wget http://archive.apache.org/dist/httpd/httpd-2.2.10.tar.gz

[root@localhost src]# tar xvgz httpd-2.2.10.tar.gz

[root@localhost src]# cd httpd-2.2.10

 

- apache 컴파일시 --enable-rewrite 모듈을 포함하여 컴파일 하는 경우

 

[root@localhost httpd-2.2.10]# ./configure --prefix=/usr/local/apache2 --enable-rewrite

 

 

- 기존 apache 사 용하는 중에 --enable-rewrite 을 추가 하는 경우

 

[root@localhost httpd-2.2.10]# /usr/local/apache2/bin/apxs -aic modules/mappers/mod_rewrite.c

 

 컴파일이 완료되면 apache2/conf/httpd.conf 화 일 내용에 아래와 같이 라인이 추가된 것을 확인 할수 있습니다.

 

# LoadModule foo_module modules/mod_foo.so

LoadModule rewrite_module     modules/mod_rewrite.so

 

여기까지는 모듈 설치가 완료된 것으로 이후에는 rewrite_module 에서 지원되는 모듈 지시자를 이용하여 도메인 설정을 합니다.

 

2. Rewrite 를 적용할 수 있는 범위

 

rewrite 설정은 Server Config, Virtual Host, Directory, .htaccess 에 설정할 수 있으며 apache 서버 전체에 Global 설정과 특정 가상호스트에만 적용하도록 할수 있고 특정 디렉토리에만 적용시킬수도 있습니다.

 

3. .htaccess

 

.htaccess (hypertext access)는 Apache 웹 서버의 디렉토리 레벨을 설정하는 기본 파일입니다.

.htaccess는 한 특정 디렉토리에 위치하며, 모 든 하위 디렉토리를 포함한 해당 디렉토리에 영향을 가지며 이 파일이 위치한 특정 폴더에 사용자가 정의한 Request 기 능을 적용합니다.

 

4. Rewrite 모듈 지시자

 

- RewriteEngine  On|Off

 

Rewriteing 엔진을 사용할지 여부를 설정합니다. 기 본설정은 Off로 되어 있으며 RewriteEngine On 으로 설정하명 Rewritng 엔진이 활성화 됩니다

 

- RewreteLog FILE-PATH

 

RewriteLog 지시자는 Rewrite 엔진의 로그를 그록할 파일을 지정합니다.

RewriteLog 파일을 항상 남기기 보다 잘못된 Rewrite 규칙들을 디버킹할 때 사용하기를 권장합니다. 아파치와 마찬가지로 RewriteLog 파일도 방문자 수가 많은 사이트에서는 많은 로그파일이 쌓이기 때문에 해당 파티션의 여유공간이 많이 없는 시스템에서는 장래를 유발 할수도 있으므로 로그를 잘 관리 해야 합니다.

RewriteLog 지시자는 반드시 RewriteLogLevel 지 시자와 함께 사용하여야 됩니다.

 

 

- RewriteLogLevel  Level

 

RewriteLogLevel 지시자는 RewriteLog 지 시자로 설정한 로그파일에 기록할 로그들에 대해 얼마나 자세한 내용을 로그로 남길것인가에 대해 설정하는 지시자입니다.

기록할 로그 Level 은 0 ~ 9까 지 사용할 수 있으며 0은 로그를 기록하지 않겠다는 의미입니다.

 

- RewriteCond  TestStirng CondPattern

 

RewriteCond 지시자는 RewriteRule 과 함께 사용되는 규칙으로 RewriteCond 다음에 오는 RewriteRule은 RewrieteCond 에서 설정한 패턴과 일치해야지만 RewriteRule들을 실행합니다.

 

예)

RewriteCond %{REQUEST_FILENAME} !-f

RewriteCond %{REQUEST_FILENAME} !-d

RewriteRule ^(.*)$ http://test. example.com/$1

 

-d : 디렉토리를 의미합니다. TestString이 디렉토리를 가리키거나 포함하고 있을 때 처리됩니다.

-f : 파일을 의미합니다. TestString이 파일을 가리키더나 포함하고 있을 때 처리됩니다.

-l : 심볼릭링크를 의미합니다. TestString이 심볼릭링크를 가리키거나 포함하고 있을 때 처리됩니다.  마지막으로 느낌표(!) 는 부정을 뜻합니다.

 

- RewriteRule  Pattern Substitution

 

Rewrite 모듈의 실질적인 Rewrite 규칙들을 적용하는 지시자입니다.

Pattern(Input URL) 을 Subtitution(Return URL)로 변경하기 위한 모든 규칙들은 이 지시자를 사용해서 설정해야 됩니다.

Pattern(Input URL) 에는 Perl 정규 표현식을 사용할수 있기 때문에 Input URL 의 규칙을 유연하게 적용할 수 있습니다.

이와 관련된 사용방법이나 예제는 아래에서 다시 설명 합니다.

 

5. 정규표현식 기초

 

. : 다수의 한문자

? : 0개 이상의 한문자

* : 0개 이상의 문자 또는 문자열

+ : 1개 이상의 문자 또는 문자열

(chars) : (, ) 안의 문자또는 문자열을 그룹으로 묶습니다. 이 문자그룹은 Substitution(return URL)에서 $N 의 변수로 활용할수 있습니니다.

^ : 문자열의 첫문(열)을 지정합니다.

$ : 문자열의 끝 문자(열)을 지정합니다.

(역슬래쉬) : 정규표현식에서 특별한 의미로 사용되는 문자의 특수기능을 제거합니다.

(예:(, ), [, ] . 등)

{n} : 정확히 n번 반복

{n,} : n번 이상 반복

{n,m} : n 이상 m 이하 반복

[chars] : 문자들의 범위 또는 표현할 수 있는 문자들을 설정합니다.

예) [a-z] : a 부터 z 까 지의 소문자, [tT] : 소문자 t 또는 대문자 T

 

6. 정규표현식 단축표현들

 

[:alpha:] : 알파벳. [a-zA-Z] 와 같은 표현

[:alnum:] : 알파벳과 숫자. [a-zA-Z0-9] 와 같은 표현

[:digit:] : 숫자 [0-9] 와 같은 표현

[:upper:] : 대문자. [A-Z] 와 같은 표현

 

7. RewriteRule 플래그

 

forbidden|F :

    요청하는 페이지를 403 에러로 redirect 시킵니다.

    RedirectRule 이 적용되고 있는 페이지를 일시적으로 사용중단을 시키거나 사용자로 하여금

페이지 접근을 할수 없게 할 때 사용합니다.

    예) RewriteRule ^/test /home/blog/html/test.php [F]

    사용자가 /test 로 접근할 경우 403 에러를 보냅니다.

 

gone|G :

    요청하는 페이지를 410 에러로 redirect 시킵니다.

    410 에러는 페이지가 사라젔거나 존재하지 않는다는 메시지입니다.

    이 것도 forbidden 과 마찬가지로 RedirectRule 이 적용되던 페이지를 일시적으로 중단시킬 때 유용하게 사용할 수 있습니다.

 

last|L :

    이 플래그가 적용되면 뒤에 어떤 룰이 있더라도 이룰 아래의 규칙들은 적용되지 않고 RewriteRule 을 빠져나가게 됩니다.

    C, Perl, PHP 프로그램에서 루프를 빠져나가는 break 와 같은 의미를 가집니다.

 

     예)

RewriteRule ^/$ <보여질 주소> [L]

RewriteRule ^$ <보여질 주소> [L]

위의 두 줄은 html 루트에 접근했을 때 어떻게 하는가를 보여줍니다.

[L]은 이 조건을 만족하여 URL을 Rewrite 했을때 더이상 .htaccess의 내용을 파싱하지 않고 종료하라는 지정자입니다.

앞에 쓰여진 ^/$는 'http://www. example.com/'이란 주소로 입력 되었을 때를 위한 처리입니다.

두번째의 ^$는 /를 마지막에 붙이지 않고 그냥 'http://www. example.com'으로 접속했을 때의 처리입니다.

 

제로보드 XE를 기준으로 위의 Rewrite Rule을 적용시킬 경우 예)

RewriteRule ^/$ ./zbxe/index.php?mid=(초기 mid값) [L]

RewriteRule ^$ ./zbxe/index.php?mid=(초기 mid값) [L]

만일 처음 보여질 모듈 이름이 blog라면 그냥 'mid=blog'라고 써주면 됩니다.

 

chain|C :

    이 플래그의 결과를 다음 RewriteRule 의 input 값으로 사용합니다.

    예)

    RewriteRule ^(.+) %{HTTP_HOST}$1 [C]

    RewriteRule ^([^.]+)\.example\.com(.*) /home/$1/public_html$2

    이 룰은 사용자 홈의 도메인을 2차 도메인으로 자동 설정해 줄 때 많이 쓰는 룰입니다.

    RewriteRule 의 input은 도메인을 제외한 URI 를 인식하기 때문에 도메인까지 인식을 시켜서 다음 RewriteRule 로 체크를 하기 위해 사용한 것입니다.

 

    즉 http://user_id. example.com/hello.html 이란 요청이 들어오면

/home/user_id/public_html/hello.html 로 redirect 시켜줍니다.

    위 와 같이 2차 도메인을 이용해 계정 사용자의 홈을 지정하기 위해서는 DNS 세팅이 선행되어야 됩니다.

 

N : 새로운 Rule이 시작된다는 의미입니다.

R : Redirection. 무조건 넘깁니다. 뒤 주소로 넘긴다는 의미입니다.

NC : 대소문자를 구별하지 않습니다.

OR : 프로그래밍의 or와 비슷합니다.

QSA : Cond의 내용을 지난 결과에 덧붙입니다.

NE : Out 될 값에 특수문자가 HexCode로 되어 포함되어 있는 경우

 

 

 < RwriteRule 설정예 >

 

1.  http:// example.com/user_id -> http:// example.com/test.php?id=user_id

RewriteRule ^/([a-zA-Z0-9])$  /home/user_id/public_html/test.php?id=$1

 

설명 : 도메인(http://example.com) 뒤에 오는 영문숫자로된 문자열을 지정하면서 그룹으로 묶었습니다. 이렇게 그룹으로 설정된 문자열 Pattern 은 Substitution(return URL) 에서 $1 이라는 변수로 받아 사용하게 됩니다. 즉 http://example.com/user2 라는 페이지 요청이 들어오면 실제로는 http:// example.com/test.php?id=user2 라는 페이지로 redirect 시켜줍니다.

 블로그나 카페(동 호회) 사이트에서 블로그 사용자의 ID 로 개인 블로그 주소를 부여할 때 http://blog.com/user_id 로 부여해 주지만 실제 실행되는 파일은 이와 같이 redirect 시켜주는 경우가 많습니다.

 

2. http://example.com/daum -> http://www.daum.net

 

RewriteRule ^/daum$ -> http://www.daum.net

 

설명 : http://example.com/daum 라는 페이지 요청이 들어오면 도메인이 다른 http://www.daum.net 이라는 페이지로 redirect 시켜 줍니다.

 

3. 적용 예

 

RewriteRule ^(/images/.*)$ http://www.example.com$1

    RewriteRule ^(/data/.*)$ http://www.example.com$1

위 설명은 /images , /data 디렉토리에 대한 요청은 http://www.example.com/images/~ 으로 Redirect 시키라는 내용 입니다.

 

 
저작자 표시
Dev/linux 2010/03/13 13:26

리눅스 보안체크

크리에이티브 커먼즈 라이선스
Creative Commons License

 
 1) find /dev -type -f -exec ls -l {}\;

     -f 는 일반 파일을 뜻함
            /dev 밑에 디렉토리에 일반 파일이 있다면 의심을 해 봐야 함

 2) /etc/passwd 에서 uid 가 0 설정된 부분과 기타 낮설은 계정을 체크
           /etc/shadow 점검

 3) 텔넷과 FTP를 사용하는 사용자가 있는지에 대한 여부를 체크한다.
            telnet 사용중일때 명령어 :w
            ftp 사용중일때 명령어 : ftpwho

 4) 열려있는 수상한 포트 확인
             ps -ef 혹은 netstat -na |grep LISTEN 확인
             nmap -sS -O -V <IP주소> 명령어로 확인
             nmap -sS -p80 <IP주소> -O -v www.hackerscollege.com
             lsof | grep LISTEN

 5) /root/.bash_history 체크
            체크방법 (줄수가 800줄 이상)
            cat /root/.bash_history |wc -l

 6) 각 계정별로 사용한 명령어 기록 체크
    find / -name .bash_history -exec ls -al{}\;
    find / -name .bash_history -exec cat{}\;

7) 공격 징후를 체크 한다.
          파일 위치 : /var/log/messages
           파일 보기 : more /var/log/messages

8) 현재 접속하고 있는 사용자에 대한 정보를 모두 체크 한다
    /var/run/utmp
    strings utmp | more

9) 접속했던 사용자에 대한 정보를 모두 체크
    /var/log/wtmp

10) 가장 최근에 로그인한 사용자에 대한 정보 체크
   /var/log/lastlog
  파일보기 : last

11) 루트 권한 가진 사용자들을 모두 체크
   cat /etc/passwd |grep 0:0

12) su 명령어 사용한 모든 사용자를 체크
    cat /var/log/messages |grep root

13) 보안 사용자에 관한 인증을 체크(/var/log/secure)
   cat /var/log/secure

14) 웹서버에 접근했거나 에러를 유발한 사용자 체크
   var/log/httpd
   파일보기 : more /var/log/httpd/access_log
                   more /var/log/httpd/error_log

15) tmp 디렉토리에 수상한 프로세스가 있는지를 체크한다.
   ls -asl /tmp

16) pstree 명령어로 데몬 체크

17) 파일의 무결성 여부를 체크
    http://weblog/websea.co.kr/tripwrite/tripwire

18) lsattr 명령어를 사용하여 속성 변경여부 체크
      /usr/bin/lsattr /bin
       /usr/bin/lsattr /sbin
       /usr/bin/lsattr /usr/bin
       /usr/bin/lsattr /usr/sbin
       ----l------- /bin/ls  <-- 변조

19) 패키지 변조 여부 체크
   rpm -Va apache
   rpm -V apache

    결과)
    S,5....T /bin/ls
    5 = MD5 쳇섬
    S = 파일 크기
    L = 심볼릭
    T = 최신 갱신 일시(MTIME)
    D = 장치
    U = 사용자
    G = 그룹
    M = 허가모드(허가권과 파일 유형)

20) 실행 파일 변조 여부를 체크 한다
    cd /bin/
    ls -alct |more
    netstat -alct |more
    ps -alct |more
    strace -e trace=open ps
    strace -e trace=open ls

21) setuid setgid 파일 체크
    find / -user root -perm -4000 -print > suidlist
    find / -user root -perm -2000 -print > sgidlist
    find / -user root -perm -4000 -xdev

22) setuid 나 setgid 막기
    chmod a-s <찿아낸파일명>

23) 숨겨진 파일 체크
    find / -name "..*" -print

24) 스팸메일 여부 체크(메일큐)
    var/spool/mqueue

25) 비밀번호없이 원격 접속하기 위한 .rhosts 파일 체크
    find / -name .rhost -exec ls -al {}\;
    find / -name .rhost -exec cat {}\;

26) 소유자가 없는 파일과 디렉토리를 체크 한다.
    find / -nouser -o -nogroup -print

26) 최근 10일 동안 변경된 파일이나 디렉토리 체크
    find / -ctime -10 -type f or d

27) 코어를 체크 한다
    find / -name core -exec ls -al {}\;

28) 커널패닉의 원인이 되는 부팅과 관계되는 디렉토리를 체크 한다.
     ls -asl /etc/rc.d/

29) 인터넷 서비스 파일이 있는 xini 디렉토리를 체크
    ls -asl /etc/xinetd.d/
 
30) 파일의 용량을 체크 한다
     repquota -av -ag

31) 파티션별로 사용된 디스크 용량 체크
    df -h
 
32) free 와 top 가 참조하는 /proc/meminfo 를 이용하여 메모리 용량 체크
    cat /proc/meminfo
    top -d2
    free -m
 
33) chmod 700 체크
    조사하고 가져오지 못하게!!
  /usr/bin/find
  /usr/bin/top
  /usr/bin/cc
  /usr/bin/wget
  /usr/bin/suidperl
  /usr/bin/sperl5.00503
  /usr/bin/whereis
  /usr/bin/ftoplynx

34) chmod 700 체크
    보지 못하게
  /usr/bin/finger
  /usr/bin/nslookup

35) chmod 700 체크
    컴파일 못하게
  /usr/bin/make
  /usr/bin/gcc
  /usr/c++

36) chmod 700 체크
  /usr/bin/w
  /usr/bin/who
  /usr/bin/which
  /usr/bin/rlog
  /usr/bin/rlogin
  /usr/bin/pstree
  /usr/bin/mail
  /usr/bin/ps
  /usr/bin/hosts
  /usr/bin/hosts.deny
  /usr/bin/hosts.allow

37) 핑과 핑을 이용한 도스 공격 방어하기
  차단하기
   echo 1 >/proc/sys/net/ipv4/icmp_echo_ignore_all

  해제하기
   echo 0 >/proc/sys/net/ipv4/icmp_echo_ignore_all

38) 핑(ping) 과 핑을 이용한 도스 공격을 방어한다.
  핑 도스 공격 차단하기
   vi /etc/sysctl.conf
   net.ipv4.icmp_echo_igonore_broadcasts =1
   sysctl -w
   /etc/rc.d/init.d/network restart
   sysctl -a | grep igonore_broadcasts

39) ssh를 이용하여 root로의 원격 접속을 금지
   /etc/ssh/sshd_config
   PermitRootLogin no

40) FTP를 이용하여 Root 로의 원격 접속을 금지
   /etc/proftpd.conf
   RootLogin off

41) 부팅시 실행되는 서비스를 체크
   사용파일 chkconfig
   파일 위치 :/sbin
   리스트 보기
   chkconfig --list
   도움말 보기
   chkconfig --help

42) 부팅시 실행되는 서비스를 체크한다.
  atd 서비스 끄기
  chkconfig --level 3 atd off
  - 위의 예제에서 레벨3을 사용하는 이유는 부팅은 레벨3 모드로 진행되기 때문

  chkconfig --list
   서비스별 켬과 끔이 나옴
   필수적으로 켜놓아야 할 파일들
  -keytable, inet, network,random, kudzu,sendmail,syslog,crond,proftpd

저작자 표시
Dev/linux 2010/03/03 09:16

Server load balancing architectures, Part 1: Transport-level load balancing(펌)

크리에이티브 커먼즈 라이선스
Creative Commons License
원문 링크 : http://www.javaworld.com/javaworld/jw-10-2008/jw-10-load-balancing-1.html

이용방식이 stateful인지의 여부에 따라 매우 다른 형태가 이루어지는데 stateful인 경우 상태를 서버간에 동기화시키기위한 도전이 필요하고 performance가 떨어질 위험이 있으므로 될 수 있으면 stateless하게 이용할 수 있도록 노력하고 있다.

가용성(availability), 확장성(scalability)




일반적인 load balancing으로 서버군에 대한 접근은 load balancer를 통해서만 수행되며 load balancer가 실제 request를 담당할 서버들을 주어진 알고리즘을 통해 선택하는 방식

통 상은 load balancing에 대한 architecture를 이야기 할때 가용성(availability), 확장성(scalability)을 살펴보게 되는데 위와 같은 구조는 load balancer가 병목이 생기지 않는다면 확장성은 매우 좋은 구조다. 다만, load balancer 자체에 대한 가용성 문제 때문에 가용성 부분은 쉽게 단정하기 힘들다.

따라서 load balancer를 다중화 할 수 있다면 가용성이 증대되는 효과가 크고 또한 load balancer의 병목위험을 없애 확장성도 크게 높일 수 있게 된다.

Server load balancing techniques

다음의 2가지로 구분될 수 있다.
  • Transport-level
  • Application-level
또 한 hardware인지 software인지를 이용해 구분할 수도 있는데 transport-level의 경우는 대부분 hardware타입이 많다(hardware타입은 속도가 빠르다.). 다만, hardware의 경우는 비용이 많이 소요되는 단점이 있다.

DNS-based load balancing

DNS 설정을 이용해 요청 host 명에 다수의 ip를 배정하여 round robin방식으로 balancing하게 되는데
  • 구축이 매우쉽다.
  • 따로 load balancer가 필요없다.
위와 같은 장점이 있는 반면 다음과 같은 치명적 단점을 가지고 있다.
  • stateful 지원이 안된다.
  • 클라 이언트에 cache를 가지고 있기 때문에 가용성에 문제가 발생한다.(예를 들면 특정 서버가 고장이 났어서 클라이언트 cache에 해당 서버 주소가 있다면 접근을 시도할 것이므로)

TCP/IP Server load balancing

Virtual IP를 이용한 스위칭을 통해 수행되며 LVS(Linux Virtual Server)로 구성된다.
아래 그림과 같이 load balancer 자체의 가용성을 높이기 위해 backup load balancer 채용이 가능하다.



단, 이들 TCP/IP level의 load balancer는 session처리나 caching처리를 application에서 따로 담당해야 하는 단점이 있다.

Caching

어 플리케이션 수준에서 caching이나 session처리를 위한 서버들 사이의 공용 메모리 영역을 설정할 수 있는 솔루션이 필요하다.


cache에 대해서는 위 그림과 같이 구성할 수 있다.
위 그림에서 Server1, Server n은 모두 동일한 Cache Server를 이용할 수 있도록 구성되어 있다.

위와 같은 구조는 spymemcached와 같은 memcached 라이브러리를 이용하여 구성한다.
즉, request에 대해 response와 짝을 이뤄 cache에 저장을 하고 request가 올때마가 cache에서 먼저 검사를 해서 있으면 바로 해당 response를 return하고 그렇지 않은 경우에만 business layer를 구동하는 형태임.

Application session data support

caching 과 session자료는 다른 성격을 갖는다.
즉, cache는 있다면 좋지만 없어도 새로 생성해서 사용할 수 있는 특징이 있지만 session은 반드시 하나씩 있어야 하고 없어져서는 안되는 자료이다. 따라서 cache관련 구조로는 한계가 있고 cookie를 이용하는 방안도 보안 위험성이 높다.

따라서 이런 종류의 경우에 대해서는 application(server software)에서 감당이 되어야 한다.

Client affinity

memcached 구조나 session server 구조를 이용하는 경우 양이 많아지면 network traffic이 필요이상으로 많아 지는 문제가 발생한다. 이를 해결하기 위해서는 한번 접속한 client에 대해서 접속했던 load balancer 하위의 실질서버에 그 이후 요청을 지속으로 보내서 불필요한 network traffic을 막을 수 있다.
LVS에서는 client affinity를 설정에 의해 지정할 수 있다. dial-up 연결에 대해서는 하지만 항상 새로운 연결이라고 여기기 때문에 affinity가 작동하지 않는다는 점을 주의하자.

Part 2: Application-level load balancing


원문 링크 : http://www.javaworld.com/javaworld/jw-10-2008/jw-10-load-balancing-2.html?page=1

part 1에서 언급한 TCP/IP level의 load balancing으로 static web service는 충분한 기능을 수행하지만 dynamic web service에 대해서는 cache의 문제나 session의 문제 등을 원활히 처리하기 위해서는 memcached 구조나 session server 구조 등 부가적인 구조가 필요해 진다.

따라서 이들 dynamic web service에 대해서는 application-level의 load balancing이 필요해진다.



위 그림은 transport level과 app level의 load balancer를 포함하는 구성이다.

위 그림과 같은 tomcat서버의 예는 다음과 같다.



물리적으로 transport-level load balancer와 Apache는 같은 서버가 될 수 있다.

여 기서 application-level load balancer는 요청 HttpRequest로부터 사용자ID나 sessionID등을 이용해 뒷 단의 서버를 선택하는 방식을 이용한다면 cache나 session에 대한 처리 문제를 해결할 수 있으며 cookie값을 이용하는 방법도 이를 해결할 수 있는 solution이다.(물론 사용자가 cookie사용을 제한하는 경우는 사용할 수 없게 되겠지만)

HTTP redirect-based server load balancer

위의 구조와는 달리 redirect 방법을 이용해서 load balancer가 접속해야 하는 서버를 분리 지정해주는 방식이 있을 수 있다.
이는 처음 접속시에만 실질서버를 알지 못하고 이미 접속해서 사용하기 시작하면 실질적인 서버를 알고 그곳에 접속해 서비스를 이용하는 형태가 된다.




이 구조는 2가지 단점을 갖는다.
  1. 외부 인터넷에 서버 구조를 투명하게 공개함으로써 공격 받을 수 있는 영역이 넓다.
  2. 고 가용성에 문제가 있는데 이미 서버를 배정받아 서비스 중인 상황에서 해당 서버가 말썽을 부리면 그곳에서 서비스를 받던 클라이언트는 고스란히 말썽을 감내해야 한다.

Server-side server load balancer interceptor

interceptor 방식으로 구성을 하게 되면 아래 그림과 같은 구조를 가질 수 있다.



위 구성을 사용하게 되면 불필요한 network 이동을 줄일 수 있다는 단점이 있다.(로컬 접속의 경우에 대해서만) 하지만 서버의 scalability를 훼손할 수 있다. 즉, 많은 양의 서버를 증설하는 경우 문제가 발생할 수 있다.

Client-side server load balancer interceptor

아래 그림과 같이 사용하는 경우 가용성이나 확장성을 높일 수 있으나 정상적인 웹서비스를 위해서 cross-domain 문제등을 해결해야 하는데 이런 부분은 매우 program지향적인 작업이 된다.




Application session data support

cache나 session자료에 대한 공유의 문제에 있어 cache는 affinity를 이용해서 자체 해결하도록 할 수 있으며 다만 session자료에 대한 공유가 필요해 진다. 이는 서버들간에 session자료를 공유하는 구조를 갖고 클라이언트에서는 jsessionid를 cookie에 담아 서버에 요청할 때 부가하는 방법을 이용하면 서버가 문제가 생겨 다른 서버로 이동할때에도 문제가 없게 된다. 다만, 서버가 많아 서로간의 session자료 공유가 메모리상 문제가 발생된다면 서버들을 특정 수만큼씩의 그룹으로 나눠 그 그룹내에서만 session자료를 공유하는 방향으로 해결할 수도 있다.

또한 session backup 구조를 이용한다면 서버들 끼리 세션자료를 공유할 필요조차 없어지며 자신이 보유한 sessionid 이외의 요청이 들어오면 backup server에 요청하여 세션자료를 가져와 이용하면 되는 구조이다.


Apache Tomcat load balancing architectures

앞의 내용에서 Apache Tomcat구조의 load balancing 예제를 간단히 살펴보긴 했는데 아래 그림과 같은 구조가 적합할 것이다.


그림에서와 같이 http 서버 전에 tcp/ip level의 load balancer를 LVS를 이용해 구성하고(backup까지 포함해서) Apache 서버에서는 application-level load balancing을 mod_proxy, mod_proxy_balancer를 통해 수행하여 ajp를 통해 뒷단의 tomcat에 전달할 수 있게 된다. 다만, tomcat도 session자료 등 공유해야할 자료가 있는 만큼 session server를 따로 두지 않고 tomcat의 clustering 구조를 이용하여 해결할 수 있다.

In conclusion

client-side load balancing은 쉽고 강력한 방법이긴 하지만 cross domain 문제와 같은 해결에 많은 자원이 소모되는 상황이 발생할 수 있다.

순수한 transport level load balancing은 쉽고, 유연하며 효율적이긴 하지만 cache의 문제와 session자료 문제를 해결하기 위한 공용장소의 필요가 생기게 되며 많은 수의 network traffic이 발생할 가능성이 높아진다.
이런 경우 client affinity를 구현하면 cache와 session에 대한 문제를 상당부분 해소할 수 있게 된다.


출처: http://redtiger.tistory.com/entry/Server-load-balancing-architectures
저작자 표시
Dev/linux 2010/02/09 08:38

현재 서버의 ftp 사용자 현황보기

크리에이티브 커먼즈 라이선스
Creative Commons License
FTP 접속자 알아보기

보통 root(시스템 관리자)가 접속 되어 있는 사람이 누군지 궁금할때 사용하는데요~
ftpcount 를 하게 되면 현재 ftp를 쓰는 사람들이 쭉 나오구요~

ftpwho 를 해도 비슷한 결과를 얻을 수 있습니다^^
저작자 표시
Dev/linux 2010/02/06 12:59

유용한 find 사용 방법

크리에이티브 커먼즈 라이선스
Creative Commons License

유용한 find 사용 방법  


출처 : http://linuxer.mireene.com/bbs/zboard.php?id=tips&page=2&sn1=&divpage=1&sn=off&ss=on&sc=on&select_arrange=headnum&desc=asc&no=40


* / 는 최상위 디렉터리를 뜻함. 만약 찾고자 하는 디렉터리가 있다면 그걸로 대체

- 파일 이름에 foobar 가 들어간 파일 찾기
   find / -name "foobar" -print

- 특정 사용자(foobar) 소유의 파일을 찾기
   find / -user foobar -print | more

- 최근 하루동안에 변경된 파일을 찾기
   find / -ctime -1 -a -type f | xargs ls -l | more

- 오래된 파일(30일 이상 수정되지 않은 파일) 찾기
   find / -mtime +30 -print | more

- 최근 30일안에 접근하지 않은 파일과 디렉터리를 별도의 파일로 만들기
   find / ! ( -atime -30 -a ( -type d -o -type f ) ) | xargs ls -l > not_access.txt

- 하위 디렉터리로 내려가지 않고 현재 디렉터리에서만 검색하기
   find . -prune ...

- 퍼미션이 777 인 파일 찾기
   find / -perm 777 -print | xargs ls -l | more

- others 에게 쓰기(write) 권한이 있는 파일을 찾기
   find / -perm -2 -print | xargs ls -l | more

- others 에게 쓰기(write) 권한이 있는 파일을 찾아 쓰기 권한을 없애기
   find / -perm -2 -print | xargs chmod o-w
      또는
   find / -perm -2 -exec chmod o-w {} ; -print | xargs ls -l | more

- 사용자이름과 그룹이름이 없는 파일 찾기
   find / ( -nouser -o -nogroup ) -print | more

- 빈 파일(크기가 0 인 파일) 찾기
   find / -empty -print | more
      또는
   find / -size 0 -print | more

- 파일 크기가 100M 이상인 파일을 찾기
   find / -size +102400k -print | xargs ls -hl

- 디렉터리만 찾기?
   find . -type d ...

- root 권한으로 실행되는 파일 찾기
   find / ( -user root -a -perm +4000 ) -print | xargs ls -l | more

- 다른 파일시스템은 검색하지 않기
   find / -xdev ...

- 파일 이름에 공백이 들어간 파일 찾기
   find / -name "* *" -print

- 숨겨진(hidden) 파일을 찾기
   find / -name ".*" -print | more

- *.bak 파일을 찾아 지우기
   find / -name "*.bak" -exec rm -rf {} \;

- *.bak 파일을 찾아 특정 디렉터리로 옮기기
   mv `find . -name "*.bak"` /home/bak/

- 여러개의 파일에서 특정 문자열을 바꾸기
   find / -name "*.txt" -exec perl -pi -e 's/찾을문자열/바꿀문자열/g' {} \;




출처 : http://blog.empas.com/rootmankr/19974627

--------------------------------------------------------
1. find 명령과 관련된 기본적인 옵션 사항들
--------------------------------------------------------
(1) -name pattern    
      화일의 이름이 pattern과 일치하면 참, pattern은 셸 메타문자 *,[] ?를 포함할 수 있다.


(2) -perm oct          
      화일의 허가 플래그의 8진수 표현이 oct와 일치하면 참


(3) -type ch            
      화일의 유형이 ch(b=block, c=char등)이면 참


(4) -user userId
      화일의 소유자가 userId이면 참
  

(5) -group groupId    
      화일의 그룹이 groupId이면 참


(6) -atime count      
      화일이 count 날 수 이내에 접근되었으면 참

  
(7) -mtime count      
      화일의 내용이 count 날 수 이내에 수정되었으면 참


(8) -ctime count      
      화일의 내용이 count 날 수 이내에 수정되었고,  화일의 속성이 바뀌었으면 참

  
(9) -exec cmd        
      수행중인 command의 종료 코드가 0이면 참. 명령은 ; 에 의해서 끝내야한다.
      만일 {}를 명령의 인수로 지정하면, 현재 화일의 이름으로 치환


(10) -print                
      현재 화일명을 프린트하고 참값을 반환


(11) -ls                    
       현재 화일의 속성을 보여주고 참값을 반환


(12) -cpio device      
       현재 화일을 cpio 형식으로 device에 쓰고 참값을 반환


(13) -!expression      
       expression의 논리 부정을 반환


(14) exp1 [-a] expr2  
      단축형 and: 만일 expr1이 거짓이면 거짓을 돌려주고, expr2는 수행하지 않고, 만일 expr1이 참이면 expr2의 값을 반환


(15) expr1 -o expr2    
      단축형 or: 만일 expr1이 참이면 참을 반환. 만일 expr1ㅣ 거짓이면 expr2의 값을 반환


--------------------------------------------------------
2. find 동작 예시
--------------------------------------------------------
(1) [root@root /root]# find / -name "*.c" -print
     : 최상위 디렉토리로 부터 모든 C 소스를 출력


(2) [root@root /root]# find / -mtime 5 -ls
     : 최상위 디렉토리에서 5일동안 수정된 화일들을 표시


(3) [root@root /root]# find / -name "*.bak" -exec rm -f {} ; 2>/dev/null
     : 최상위 디렉토리로부터 bak로 끝나는 화일들을 삭제처리함


(4) [root@root /root]# find / (-name "*.c" -o -name "*.bak" ) -print
     : 최상위 디렉토리에서 *.c 나 *bak 화일로 끝나는 모든 화일들의 이름을 출력


(5) [root@root /root]# find / -name "*.o" -o -name "*.tmp"
     : 파일 이름이 *.o 또는 *.tmp 와 일치하는 파일들에 대해서 참으로 평가


(6) [root@root /root]# find / -type f -atime +30 -print
     : 30일 이상 읽혀지지 않은 모든 파일들을 출력한다


(7) [root@root /root]# find / -atime +5 ( -name "*.o" -o -name "*.tmp" )
     : access 시간이 5일 이상이고 이름이 .o 나 .tmp 로 끝난다.


(8) [root@root /root]# find / ! -atime +5 ( -name "*.o" -o -name "*.tmp" )
     : 4번과의 반대로 의 결과를 얻는다. 








Find 용법 Sysadmin 
2007/03/12 19:49


http://blog.naver.com/dreamworkers/70015231124

출처 : 유닉스 파워툴


* / 는 최상위 디렉터리를 뜻함. 만약 찾고자 하는 디렉터리가 있다면 그걸로 대체

- 파일 이름에 foobar 가 들어간 파일 찾기
find / -name "foobar" -print

- 특정 사용자(foobar) 소유의 파일을 찾기
find / -user foobar -print | more

- 최근 하루동안에 변경된 파일을 찾기
find / -ctime -1 -a -type f | xargs ls -l | more

- 오래된 파일(30일 이상 수정되지 않은 파일) 찾기
find / -mtime +30 -print | more

- 최근 30일안에 접근하지 않은 파일과 디렉터리를 별도의 파일로 만들기
find / ! ( -atime -30 -a ( -type d -o -type f ) ) | xargs ls -l > not_access.txt

- 하위 디렉터리로 내려가지 않고 현재 디렉터리에서만 검색하기
find . -prune ...

- 퍼미션이 777 인 파일 찾기
find / -perm 777 -print | xargs ls -l | more

- others 에게 쓰기(write) 권한이 있는 파일을 찾기
find / -perm -2 -print | xargs ls -l | more

- others 에게 쓰기(write) 권한이 있는 파일을 찾아 쓰기 권한을 없애기
find / -perm -2 -print | xargs chmod o-w
또는
find / -perm -2 -exec chmod o-w {} ; -print | xargs ls -l | more

- 사용자이름과 그룹이름이 없는 파일 찾기
find / ( -nouser -o -nogroup ) -print | more

- 빈 파일(크기가 0 인 파일) 찾기
find / -empty -print | more
또는
find / -size 0 -print | more

- 파일 크기가 100M 이상인 파일을 찾기
find / -size +102400k -print | xargs ls -hl

- 디렉터리만 찾기?
find . -type d ...

- root 권한으로 실행되는 파일 찾기
find / ( -user root -a -perm +4000 ) -print | xargs ls -l | more

- 다른 파일시스템은 검색하지 않기
find / -xdev ...

- 파일 이름에 공백이 들어간 파일 찾기
find / -name "* *" -print

- 숨겨진(hidden) 파일을 찾기
find / -name ".*" -print | more

- *.bak 파일을 찾아 지우기
find / -name "*.bak" -exec rm -rf {} \;

- *.bak 파일을 찾아 특정 디렉터리로 옮기기
mv `find . -name "*.bak"` /home/bak/

- 여러개의 파일에서 특정 문자열을 바꾸기
find / -name "*.txt" -exec perl -pi -e 's/찾을문자열/바꿀문자열/g' {} \;

find에 대한 참고문

find는 유닉스 및 리눅스 환경에서 중요한 유틸리티 중 하나이다. find는
파일의 이름부터 시작해서 수정 시간에 이르기까지 주어진 파라미터들과
일치하는 파일들을 찾아준다.

여기에서는 find에 대해 일부분만 다룬다. 조금더 알고싶은 유저는 한빛미디어
"유닉스 파워툴"을 참조하시기 바란다.

find의 기본문법

find path operators

path는 경로이다. 이 부분에 대해선 다음부분에서 약간 더 자세하게
설명할 것이다.
operators 는 연산자이다. 쉽게 풀이하자면 옵션인 셈이다. 여기에 들어갈
수 있는 것은 지금부터 소개할 것이다.

-name filename

우리가 가장 일반적으로 사용하는 옵션이다. filename에는 와일드 카드(별표)
가 들어갈 수 있지만 쉘이 변환하지 않도록 인용부호 쿼트(")로 둘러싼다

-perm mode

주어진 액세스 모드를 가진 파일을 찾는다. 액세스 모드는 8진수 값을 갖는다.
뒤에서 다시 설명한다

-type c

지정된 타입에 관해서 파일을 찾는다. c는 한글자로 된 코드이다. 예를 들면,
f는 일반 파일, b는 블록 특수 파일, l은 심볼릭파일을 나타낸다. 뒤에서 다시
설명한다.

-user name

이 옵션은 name에 해당하는 사용자 파일을 찾는다. name에는 사용자 id뿐만 아니라
사용자의 UID도 들어갈 수 있다.

-group name

이 옵션은 name에 해당하는 그룹의 파일을 찾는다. name에는 그룹명 뿐만 아니라
GID가 들어갈 수도 있다.

-size n

해당되는 사이즈의 파일을 찾는다. n은 블록길이의 파일을 찾는다. 한 블록은 512와 같다.
+n 이란 표시가 들어가면 n 블록보다 더 긴 파일을 찾는다라는 뜻이다. 파일이 클때
유용하다. nc라는 표현은 n 문자 길이의 파일들을 찾는다는 의미이다. ++nc는 무엇을
뜻할까? 뒤에서 다시 다룬다

-inum n

inode 번호가 n인 파일을 찾는다. 그다지 자주 사용되는 옵션은 아니여서 자세한
설명은 요약한다.

-atime n

n일 전에 액세스한 파일들을 찾는다. +n은 n일 이전에 액세스한(즉 n일 동안 액세스
하지 않은)파일들을 찾는다는 의미이다. 그러면 -n은 무엇을 의미할까? (즉, n일 동안
액세스한) 파일들을 찾는다" 의미이다. 뒤에서 다시 언급한다

-mtime n

파일의 내용이 수정된 시간을 검사한다는 것을 제외하고는 atime과 유사하다.

-ctime n

inode의 마지막으로 변경된 시간을 확인한다는 것을 제외하고는 atime과 유사하다.
"변경되다"라는 것은 파일이 수정되거나 그 특성 중의 하나가 변경되었다는 것(예를
들면, 그 소유자)을 의미한다.

-newer file

주어진 file보다 더 최근에 수정된 파일을 찾는다.

그런데 여기까기 find의 옵션을 살펴 보았는데 때때로 여러분은 조건을 만족하는
파일을 찾기 원할 것이다. 이럴때 쓰는 연산자가 있다. 다음이 그 연산자이다.

operator1 -a operator2

and 연산에 해당한다. -a는 생략이 가능하다. 두개의 검색 패턴이 같이 쓰여지면
find는 2개 모두와 일치하는 파일들을 원하는 것으로 가정한다.

operator1 -o operator2

or 연산에 해당한다. 둘 중 하나가 속하는 파일을 찾는다.

! operator

not 연산에 해당한다. operator에 해당하지 않는 파일들을 찾는다.

\(expression\)

논리 우선순위를 의미한다. 복잡한 표현식에서 위와 같이 지정해 주면 이 부분을
나머지 부분보다 빨리 계산한다. 여기서 (를 \( 로 표현했는데. 쉘이 해석할 수
있기 때문이다. php를 사용해 보신분이라면 무슨 얘기인지 대충 감 잡으셨을 것이다.

이번 부분은 find가 파일들을 찾았을때의 행위를 지정하는 그룹의 연산자들이다.

-print

파일의 이름을 표준출력으로 출력한다. 뒤에서 조금 더 다룬다..

-exec command

찾은 파일들을 command로 처리한다. command에서 찾은 파일의 경로명을 포함
시키려면 중괄호를 사용한다 {} command는 명령을 실행시키고 난 뒤에는 반드시
백슬래시와 세미콜론을 사용한다. (\;)

-ok command

기본적으로 -exec 옵션과 같다. 그러나 해당 command를 실행하기 전에 명령을
실행할지에 대해 물어본다. 일반적으로 find를 테스트하는 데 많이 쓰인다고 한다.

위 옵션은 가장 일반적인 옵션들이지만 때때로 막강한 시스템 관리자들은 추가 또는
삭제하여 사용하기도 하니 여러분의 시스템에서 man find를 하게 되면 더 많은 옵션을
볼 수 있을 것이다.

1. 깊은 디렉토리 파고 들어가기

find의 가장 분명한 용도는 오래되고 큰 자료를 찾는 것이다. 또는 사용되지 않는
파일들의 위치를 찾아내는 능력이다. 그러나 근본적으로 가장 중요한 find의 특징은
서브 디렉토리로 내려가는 것이다.

보통 쉘은 인자 목록을 명령어에 제공해 준다. 그것은 UNIX 프로그램들에게 디렉토리명이
아닌 파일명들이 주어지는 이유이다. 단지 몇몇 프로그램들만이 디렉토리 이름을 받아서
서브디렉토리의 이름을 받아서 검색해서 내려갈 수 있다. find, tar, du, 그리고 diff 같은
프로그램이 그렇게 한다. chmod, chgrp, ls, rm 그리고 cp의 몇몇 버전들도 -r이나 -R
옵션이 주어질 때는 그럴 수 있다.

일반적으로는 대부분의 명령어들은 디렉토리 구조를 완전이 이해하지 못하며 쉘이 와일드
카드를 디렉토리 명으로 확장해 주는데 의존한다. 그러므로 어떤 디렉토리 그룹에서 .o로
끝나는 모든 파일들을 삭제하려면 다음과 같이 입력할 수 있다

find *.o */*.o */*/*.o

이렇게 하는 것은 입력하기 귀찮을 뿐 아니라 검색하는 모든 파일들을 찾을 수 없을지도
모른다. 쉘은 어떤 맹점이 있다. 점으로 시작하는 이름을 가진 디렉토리 내의 파일들은
찾을 수 없을 것이다. 그리고 */*/*/*.o 로 찾아지는 파일들이 있다면 삭제되지 않을 것이다.

또 다른 문제점은 위와 같이 입력하게 되면 Arguments too long이라는 에러 메시지를 내 뱉는다.
이것은 여러분이 입력한 와일드 카드를 쉘이 너무 많은 인자들로 확장했음을 의미한다.

find는 이런 문제점에 대한 해결책이다.

find의 가장 간단한 예는 다음이다

find . -print

find의 첫번째 인자는 디렉토리 또는 파일들의 경로이다. 위의 예제는 해당 디렉토리의
모든 파일들을 찾아준다. 경로명 뒤의 인자들은 항상 - 부호 (하이픈또는 대시라고 부른다)가
붙게 된다. 이것에 유의하기 바란다. 그리고 이 인자는 find가 무엇을 찾았을 때 어떤 행동을
취하는 가에 대해 명시한다. 그리고 다른 말로 이것은 검색 연산자들이다. 이경우엔 파일명이
출력된다. 특정 경로 이외에 C쉘에서는 틸드(~)도 사용할 수 있다. 예를 들어본다

find ~ ~barnett /usr/local -print

그리고 만약 따분하다면 다음과 같이 명령을 내릴 수도 있다

find / -print

위의 예제는 디스크에 있는 모든 파일들을 검색한다. 이 예제는 자신이 쓰는 워크스테이션에선
상관 없겠지만 여러 사람이 쓰는 웍 스테이션이나 서버에서는 범죄 행위일 정도로 디스크를
공회전 하게 낭비한다. 왠만해선 참아주기 바란다. 그러나 정말 필요하다고 생각될 시엔
/* 를 사용해 주기 바란다.

find는 결과를 표준 출력(stdin)으로 뿌리게 되니 발견한 파일의 목록을 다른 명령어로 보낼 수 있다.
이 기능을 사용한 한가지 방법은 치환이다. 다음 예제를 보자.

ls -ld 'find . -print'

find의 명령어의 실행 결과 출력이 역 인용부호 전체를 대신한다. ls는 find의 결과를 볼뿐 find
가 사용되었다는 것을 모른다. 또 다른 명령어는 xargs를 사용하는 방법이 있으나
여기에서 더 다루지 않겠다. 관심있는 유저는 한빛미디어 "유닉스 파워툴"을 보기 바란다.

2. -print 를 잊지 말자..

가끔 나는 find에 -print를 붙이는 것을 잊는다. 이것을 붙이지 않으면 검색결과가 출력되지 않는다.
(물론 GNU 버전에서는 그렇지 않으나 GNU 버전이 아닌 find에서는 꼭 붙여주어야 한다. 일부 버전에서는
-ls도 사용한다)
이것은 오래된 시스템 관리자도 가끔 잊고 초보 사용자들이 가장 잘 실수하는 내용 중 하나이니 조심하자
그리고 일부 버전은 -print를 추가해 주기도 하지만 기대해선 안된다.

3. 특정한 이름을 가진 파일 찾기

find 명령을 내릴때 메타 문자를 사용할 수 있는데 정규 표현식(grep과 같진 않다)를 사용할때 -name
연산자의 인자로 사용해서 그것들이 변경되지 않고 find로 넘겨지게 하려면 인용 부호로 감싸야 한다.
여기서 인용부호로는 어떤것을 사용해도 관계 없다.

find . -name \*.o -print
find . -name '*.o' -print
find . -name "[a-zA-Z]*.o" -print

파일 경로의 디렉토리들은 -name 연산자와 일치하지 않고 경로의 마지막에 있는 이름만이 일치한다.
예를 들어, 위의 명령어들은 ./subdir/afile이란 경로명과 일치하진 않지만 ./subdir/prog.o와는 일치한다.

경로의 중간에 있는 디렉토리과 일치하는 방법이 있다.

alias ff "find . -name '*\!{*}*' -ls"

파일이나 디렉토리의 이름을 넘겨주면 이 앨리어스는 그 인자를 포함하는 모든 파일이나 디렉토리
이름의 목록을 출력할 것이다.

4. 오래된 파일 찾기

7일된 파일을 찾고 싶으면 -mtime 연산자를 사용하면 된다

find . -mtime 7 -print

또 다른 방법은 시간의 범위를 지정하는 것이 있다.

find . -mtime +6 -mtime -8 -print

mtime은 파일의 최종 수정 시간이다. 사용되지 않은 파일을 찾아보려면 -atime 인자로 액세스 시간을 확인
하면 된다. 30일 이상 읽혀지지 않은 파일을 찾으려면 다음과 같이 하면 된다.

find . -type f -atime +30 -print

find 명령어가 디렉토리의 시간을 수정하기 실제로 액세스 되지 않은 디렉토리를 찾기란 어렵다. 각 파일과
관련된 연관된 또 하나의 시간이 있는데. ctime이라 불리는 inode 변경 시간이다. 그러나 여기에선 더 이상
자세하게 다루지 않는다.

5. find 검색의 최고봉이 되어보기

find는 확실히 까다롭다. 그러나 그 능력을 자유롭게 다루면 그 까다로움에 감사하게 될 것이다.(아직 필자는
그런 능력을 가지고 있지 않다)

find의 명령어들은 명령행의 복잡도와 상관없이 실제로는 위와 같은 것의 변형들일 뿐이다. 많은 다른 이름을
명시할 수 있고 오래된 파일들을 찾을 수 있다. 그 복잡함에 관계없이 실제로는 시작점이 어디이고 어떤
파라메터를 주고, 그리고 찾아낸 파일들을 어떻게 처리할 것인지 대해 명시하는 것 뿐이다.

더 복잡한 방법으로 find를 사용하는 것의 핵심은, 검색 파라미터는 실제로는 find가 평가하는 "논리 표현식(logical
expression)이라는 것을 깨닫는 것이다.(실제 find를 사용하는 대 부분의 유저는 논리 표현식을 사용하지 않는다)

즉. find는
한번에 하나씩 모든 파일들을 본다(솔직히 이것은 사실이다. 그러나 우리눈에 보일정도로 느리진 않다)
명령행 연산자가 제공한 표현식을 평가하기 위해 indoe에 들어있는 정보를 사용한다.(앞서 inode는 많이 사용하지
않는다는 얘기를 들어 생략했다)
표현식의 값이 참이면 지정된 행동을 한다.(예를 들면 파일의 이름을 출력하기 위해)

예를 들어 다음 표현식은 참이다
find / -name "*.c"

이런식으로 생각하게 되면 논리 연산자도 쉽다. 다음 표현식은 2개의 확장자에 해당되는 파일을 찾는다

-name "*.o" -o -name "*.tmp" -print

위 예제는 *.o와 *.tmp로 끝나는 파일들을 찾는다. 그럼 위의 확장자를 가진 파일을 찾는다면 다음의 표현식을
넣어 액세스 시간이 맞는지 검색한다

-atime +5 \( -name "*.o" -o -name "*.tmp" \)

find 안에 괄호를 넣으면 해당 부분을 먼저 계산한다. 앞에서 잠깐 설명했지만 괄호 앞에 \ 를 넣은건
서브 쉘 연산자로 의식하지 말라고 넣은 것이다.

그러나 위의 예제를 다음과 같이 바꾸면 참이 아니다.

atime +5 -name "*.o" -o -name "*.tmp"

위의 예제는 이름이 *.tmp로 끝난다. 이면 참이라는 틀린 식이 된다. 이 잘못된 표현식은 .tmp로 끝나는
모든 파일들에 대해 그 파일이 언제 액세스 되었간 간에 참이 될 것이다. 즉 -atime이 적용되지 않는다.
그러나 위의 표현식은 틀린 식이 아니다. 그러나 우리가 원하는 일을 하지 않을 뿐이다.

위의 예제를 조금 더 응용해서 현재 디렉토리에 있는 파일들을 찾으려면 다음과 같이 내리면 된다.

find . -atime +5 \( -name "*.o" -o -name "*.tmp" \) -print

그러나 반대로 위의 파일들만 찾지 않는다면 ! 연산자를 사용하면 된다..

find . ! -atime +5 \( -name "*.o" -o -name "*.tmp" \) -print

그러나 위의 표현식은 -atime 연산자에 대해서만 적용한다. 모든 연산자에 사용하려면 -atime 연산자에도
괄호를 아래와 같이 사용하면 된다.

find . ! \( -atime +5 \( -name "*.o" -o -name "*.tmp" \) \)-print

-print도 표현식이다. 이것은 항상 참으로 평가된다. 이외에 -ok, -exec 도 항상 참으로 평가된다.
이 표현식들이 좋게 사용될 때가 있긴 하다. 뒤에서 다시 다룬다.

그리고 여러분들이 find를 사용할 때 실수 하는 것 중 하나는 공백을 넣지 않는 것이다. 모든 연산자에는
공백이 필요함을 기억하기 바란다.

find가 찾는 시간들

일반적으로 -atime 부류의 연산자들에 대해서는 아쉽게도 문서화가 되어 있지 않다. 이 시간들은 일반적으로
일 단위이다.

부호없는 숫자. 예를 들어 3은 정확하게 3일 전에 끝난 24시간을 의미한다.(달리 말하면 96시간과 72시간 전 사이)

마이너스 부호를 가진 숫자는 그 시간 이후의 기간을 가리킨다. 예를 들어, -3은 지금과 3일 전 사이의 모든 시간이다.
(달리 말하면 0시간 전과 72시간 전 사이)

플러스 부호가 붙은 숫자는 그 시간 전의 24시간 기간을 가리킨다. 예를 들면 +3은 3일 이상 된 시간이다. (달리 말하면
96시간 이상)

정확한 파일 비교

"이 부분에 대해서는 언급을 생략한다. 위에서 언급한 책을 보면 자세하게 잘 나와있으니 참고하기 바란다."

찾은 파일 실행하기

find에서 찾은 파일을 실행할 수 있는데 여기서 -exec 연산자는 끝 부분에 항상 \;를 넣는다. 그러나 find가 다르게
취급하는 인자가 있는데 이 인자는 바로 중괄호이다. {} 이 두문자들은 find가 발견하는 파일의 이름을 갖는 변수이다.
예제를 보면 더 확실할 것이다. 다음 예제는 간단한 경우로써 -print 연산자를 흉내내는 echo 연산자가 있다.

find . -exec echo {} \;

c쉘은 {} 문자를 사용하지만 {}를 바꾸진 않으므로 이 문자를 인용부호로 덮어쌓일 필요는 없다. 그러나 \;에서 \는
''로 대체가 가능하다. 세미 콜론은 항상 ';'로 C쉘에서는 하는 걸로 익히자..

그리고 find안에 또 다른 find의 호출이 가능하다

여기에선 또 다른 호출에 대해서는 생략한다

-exec 커스터 테스트하기

-exec 연산자를 이용해서 커스템 테스트를 할 수 있는데 앞서 잠시 얘기했지만 되도록 -exec 연산자를 피하는게 좋다
사용해야 한다면 -ok 를 사용하는 방법과 확실히 그걸 실행해야 하는지 확인해 본다. 그리고 -exec 연산자는 꼭 find
명령의 뒤쪽에 놔두도록 한다.

HandTip

여기엔 기재하지 않았지만 \ 를 줄 바꿈 연산자로 사용할 수 있다. SQL에서도 사용가능하니 유용할 것이다. 다량의
명령어를 내릴때 상당히 유용한 기능이다.

find의 진정한 역할?

find의 진짜 역활은 파일의 위치를 찾는 것이 아니라 표현식을 평가하는 것이다. 그렇다. find는 확실히 파일의 위치를
찾아준다. 그러나 그것은 부수적인 것이다. 이점을 이해하는 것이 find를 이용하는 데에 있어 이해가 빠르고 find를
훨씬 더 자유롭게 유용하게 만드는 개념적인 발전이 될 수도 있다.

-type 연산자의 유형들

b - 블록 특수 파일("장치 파일")
c - 문자 특수 파일("장치 파일")
d - 디렉토리
f - 일반파일
l - 심볼릭 파일
p - 이름 파이프 파일
s - 소켓 파일

// 이 아래부분에서 더 이상 설명를 다루지 않습니다.

find . -size 1234c -print

- 보다 더 작은 , + 보다 더 큰

find . -name \*.o -perm 664 -print

find . -type d -perm 777 -print

----w---- 패턴은 -20과 같다.

퍼미션 8진 값
rwxrwxrwx 777
rwxrwxr-x 775
rw-rw-rw- 666
rw-rw-r-- 664
rw-rw---- 660

find . -perm -100 -print

실행가능한 --x------ 파일을 찾는다.

-perm 인자가 마이너스 부호를 가지게 되면 setuid 설정 비트를 포함한 모든 퍼미션 비트들이 검사된다.

저작자 표시
TOTAL 114,290 TODAY 48