RSS구독하기:SUBSCRIBE TO RSS FEED
즐겨찾기추가:ADD FAVORITE
글쓰기:POST
관리자:ADMINISTRATOR

last modified by Takayoshi Kimura on 02/14/12 - 02:36

Issue

The 2.6.11 Linux kernel introduced certain changes to the lpfc (emulex driver) and qla2xxx (Qlogic driver) Fibre Channel Host Bus Adapter (HBA) drivers which removed the following entries from the proc pseudo-filesystem: /proc/scsi/qla2xxx, /proc/scsi/lpfc. These entries had provided a centralized repository of information about the drivers and connected hardware. After the changes, the drivers started storing all this information within the /sys filesystem. Since Red Hat Enterprise Linux 5 uses version 2.6.18 of the Linux kernel it is affected by this change.

Using the /sys filesystem has the advantage that all the Fibre Channel drivers now use a unified and consistent manner to report data. However it also means that the data previously available in a single file is now scattered across a myriad of files in different parts of the /sys filesystem.

One basic example is the status of a Fibre Channel HBA: checking this can now be accomplished with the following command:

# cat /sys/class/scsi_host/host#/state

where host# is the H-value in the HBTL SCSI addressing format, which references the appropriate Fibre Channel HBA. For emulex adapters (lpfc driver) for example, this command would yield:

# cat /sys/class/scsi_host/host1/state
Link Up - Ready:
Fabric

For qlogic devices (qla2xxx driver) the output would instead be as follows:

# cat /sys/class/scsi_host/host1/state
Link Up - F_Port
Environment

Red Hat Enterprise Linux 5

Resolution

Obviously it becomes quite impractical to search through the /sys filesystem for the relevant files when there is a large variety of Fibre Channel-related information of interest. Instead of manual searching, the systool (1) command provides a simple but powerful means of examining and analyzing this information. Detailed below are several commands which demonstrate samples of information which the systool command can be used to examine.

To examine some simple information about the Fibre Channel HBAs in a machine:

# systool -c fchost -v

To look at verbose information regarding the SCSI adapters present on a system:

# systool -c scsihost -v

To see what Fibre Channel devices are connected to the Fibre Channel HBA cards:

# systool -c fcremoteports -v -d

For Fibre Channel transport information:

# systool -c fctransport -v

For information on SCSI disks connected to a system:

# systool -c scsidisk -v

To examine more disk information including which hosts are connected to which disks:

# systool -b scsi -v

Furthermore, by installing the sg3utils package it is possible to use the sgmap command to view more information about the SCSI map. After installing the package, run:

# modprobe sg

sg_map -x

Finally, to obtain driver information, including version numbers and active parameters, the following commands can be used for the lpfc and qla2xxx drivers respectively:

# systool -m lpfc -v

systool -m qla2xxx -v

ATTENTION: The syntax of the systool (1) command differs across versions of Red Hat Enterprise Linux. Therefore the commands above are only valid for Red Hat Enterprise Linux 5.

last modified by Ray Dassen on 08/13/11 - 04:57

Issue

What is the SysRq facility and how do I use it?

Environment
  • Red Hat Enterprise Linux 3, 4, 5, and 6
Resolution
What is the "Magic" SysRq key?

According to the Linux kernel documentation:

It is a 'magical' key combo you can hit which the kernel will respond to regardless of whatever else it is doing, unless it is completely locked up.

The sysrq key is one of the best (and sometimes the only) way to determine what a machine is really doing. It is useful when a system appears to be "hung" or for diagnosing elusive, transient, kernel-related problems.

How do I enable and disable the SysRq key?

For security reasons, Red Hat Enterprise Linux disables the SysRq key by default. To enable it, run:

# echo 1 > /proc/sys/kernel/sysrq

To disable it:

# echo 0 > /proc/sys/kernel/sysrq

To enable it permanently, set the kernel.sysrq value in /etc/sysctl.conf to 1. That will cause it to be enabled on reboot.

# grep sysrq /etc/sysctl.conf
kernel.sysrq = 1

Since enabling sysrq gives someone with physical console access extra abilities, it is recommended to disable it when not troubleshooting a problem or to ensure that physical console access is properly secured.

How do I trigger a sysrq event?

There are several ways to trigger a sysrq event. On a normal system, with an AT keyboard, sysrq events can be triggered from the console with the following key combination:

Alt+PrintScreen+[CommandKey]

For instance, to tell the kernel to dump memory info (command key "m"), you would hold down the Alt and Print Screen keys, and then hit the m key.

Note that this will not work from an X Window System screen. You should first change to a text virtual terminal. Hit Ctrl+Alt+F1 to switch to the first virtual console prior to hitting the sysrq key combination.

On a serial console, you can achieve the same effect by sending a Breaksignal to the console and then hitting the command key within 5 seconds. This also works for virtual serial console access through an out-of-band service processor or remote console like HP iLO, Sun ILOM and IBM RSA. Refer to service processor specific documentation for details on how to send a Breaksignal; for example, How to trigger SysRq over an HP iLo Virtual Serial Port (VSP).

If you have a root shell on the machine (and the system is responding enough for you to do so), you can also write the command key character to the/proc/sysrq-trigger file. This is useful for triggering this info when you are not on the system console or for triggering it from scripts.

# echo 'm' > /proc/sysrq-trigger
When I trigger a sysrq event that generates output, where does it go?

When a sysrq command is triggered, the kernel will print out the information to the kernel ring buffer and to the system console. This information is normally logged via syslog to /var/log/messages.

Unfortunately, when dealing with machines that are extremely unresponsive, syslogd is often unable to log these events. In these situations, provisioning a serial console is often recommended for collecting the data.

What sort of sysrq events can be triggered?

There are several sysrq events that can be triggered once the sysrq facility is enabled. These vary somewhat between kernel versions, but there are a few that are commonly used:

  • m - dump information about memory allocation

  • t - dump thread state information

  • p - dump current CPU registers and flags

  • c - intentionally crash the system (useful for forcing a disk or netdump)

  • s - immediately sync all mounted filesystems

  • u - immediately remount all filesystems read-only

  • b - immediately reboot the machine

  • o - immediately power off the machine (if configured and supported)

  • f - start the Out Of Memory Killer (OOM)

  • w - dumps tasks that are in uninterruptable (blocked) state

1. PXE BOOT?

사전 부팅 실행 환경 또는 간단히 PXE(Pre-boot eXecution Environment)는 네트워크 인터페이스를 통해 컴퓨터를 부팅할 수 있게 해주는 환경이다.

 

2. PXE 구성 요소

요즘 대부분의 서버들에도 PXE 지원하는 네트워크 카드가 설치 되어 있으니 만약 DVD-ROM이 없거나, Bootable USB가 인식이 되지 않을 때 유용하다.

 

l  PXE Server - 부트 이미지 파일을 포함한 설정정보 교환.

l  TFTP Server - 부트 이미지 파일을 전송.

l  PXE Client - PXE 지원 네트워크 카드 필요(2000년 이후 출시된 제품에는 대부분 장착)

 

3. TFTP 설정법

다운로드 : http://tftpd32.jounin.net/

 

기본 실행 화면



GLOBAL 설정 화면

 

기본적으로 TFTP Server DHCP Server는 켜 있어야 한다.

 

TFTP server boot 이미지를 전송하는 프로토콜이며, 실질적은 FTP 서버가 아님을 기억하자.

 

DHCP PXE 부팅을 하기 위해 IP를 할당 받기 위한 서버이다.

 

 



TFTP
설정

 



TFTP
설정은 기본으로 두면 된다.

TFTP는 기본적으로 UDP 69포트를 사용한다.

 

만약 구성하고 있는 서버에 다수의 대역의 IP를사용 중이라면 Bind TFTP to this address 항목에서 사용할 대역을 설정 해 준다.

이렇게 하면 조금 더 빨리 IP할당을 해 준다.



DHCP
설정 화면


 


DHCP
설정이 가장 중요하다.

 

리눅스 DHCP설정과 별반다를 것이 없지만 여기에서 가장 중요한 것은 pxelinux.0 파일 설정

 

이 파일은 linux 설치 시 syslinux 패키지에 포함 되어 있다. 해당 버전을 다운 받아 놓자.

 

* CAUTION

RHEL 5버전의 pxeliux.0 menu.c32파일을 가지고는 RHEL 6버전의 PXE 부팅이 되지 않는다! 필히 최신버전인 RHEL 6버전의 pxelinux.0 menu.c32파일을 구비 해 두자.

 

 

 

4. 디렉토리 구성

TFTP압축을 풀면 달랑 파일 몇 개만 있다. 이 상태로만 쓸 수 있는 것이 아니며, 하위 폴더에 파일 및 디렉토리를 생성하여야 한다.

 


필수 디렉토리

pxelinux.cfg : syslinux.cfg 파일과 동일한 역할을 하는 디렉토리로, 디렉토리 안에 default 라는 파일이 있어야 한다.(구성은 syslinux.cfg 파일과 100% 동일하니 잘 구성된 syslinux.cfg 파일이 있다면 이름만 바꾸어서 사용해도 된다.)

 

필수 파일

pxelinux.0 : 부트로더 파일

menu.c32 : 설치 시 메뉴를 보여주기 위한 파일

 

기타 설정 파일

ks : kickstart 용 파일을 모아 둠

vesamenu.c32 : 그래픽 한 환경설정을 위한 파일

rhel5.X : rhel 5.X 버전의 ISO를 풀어서 넣어둠

rhel6.X : rhel 6.X 버전의 ISO를 풀어서 넣어둠

 

5. 참조 URL

http://tftpd32.jounin.net/tftpd32_download.html

http://www.syslinux.org/wiki/index.php/PXELINUX

간혹 서버에 설치 하기 위해 돌아다니다 보면 DVD-ROM이 없는 서버가있다.
꼭 그럴경우가 아니라 장애대응을 나갔다가 OS를 재 설치 해야하는경우가 생긴다. 이럴 경우 간단히 ISO 파일을 가지고 설치용 USB를 만들 수 있다.

이전글 :  2012/02/21 - [My Advanced Linux/Advanced Linux] - How do I create a bootable USB pen drive to start a Red Hat Enterprise Linux installation?

하지만 Windows에서도 간단히 만들 수 있게해주는 오픈 소스가 있어 소개 한다.

http://iso2usb.sourceforge.net/ 

ISO를 Bootable USB로 만들어 주는 여러 툴이 있는데, RHEL과 CentOS라면 이 툴을  추천한다.
(이 툴은 UNetbootin을 기반으로 만들어 졌기 때문에 사실상 인터페이스는 똑같다)

 
 

1. Diskimage에 5.x/6.x버전에 해당하는 ISO 이미지를 넣는다

2. Type에 USB와 Dirve을 지정한다.

3. OK를 클릭한다 


생각보다 금방 완료가 된다.
별도로 해 줄 작업이 없이 해당 USB를 꼽으면 기존 DVD를 넣고 설치하는 것과 동일한 모습을 볼 수 있다.


그리고 몇 가지 팁을 더 주자면 syslinux.cfg를 수정하여 멀티 설치버전 이미지를 넣을 수 있다.
syslinux.cfg 수정법은 조금만 검색하면 쉽게 알 수 있으니 별도로 설명 하진 않겠다. 이걸 이용하여 kickstart파일까지 만들면 USB 삽입 후 클릭 한번으로 OS 설치가 가능해진다 ~


이건 참 리눅스에 대단한 강점이라고 할 수 있는 부분이다.

놀랍지 아니 한가!


여기에서는 perl을 이용하였지만, sed 를 이용하여서도 가능하다.


그리고 혹시 모를상황을 대비하여 백업파일을 생성하고 싶다면

perl -pi -e 에서 perl -pi.bak -e 를 추가하면 자동적으로 "파일이름.bak"가 생성된다.


파일속 mms: 찾기
find . -type f -name "dunetCont.html" -exec grep "mms://vod.xxxx.co.kr" {} /dev/null \;


파일 속 IP 변경하기

find . -type f -name "dunetCont.html" -exec perl -pi -e 's/211.xx.xx.39/vod.xxxx.co.kr/g' {} \;
find . -type f -name "i_pg*.html" -exec perl -pi -e 's/211.xx.xx.39/vod.xxxx.co.kr/g' {} \;
find . -type f -name "[0,1][0-9].html" -exec perl -pi -e 's/211.xx.xx.39/vod.xxxx.co.kr/g' {} \;

압축
for i in $(find . -name 'Cont.html'); do tar -rvf Cont.tgz $i; done


K-IFRS(04.html , 09.html , 14.html , 19.html , 24.html)
for i in $(find *_10103* -name [0,1,2][4,9].html); do tar -rvf IFRS.tar $i; done
find . -type f -name [0,1,2][4,9].html -exec perl -pi -e 's/211.xx.xx.39/vod.xxxxt.co.kr/g' {} \;


수정하기 스크립트
find . -type f -name "dunetCont.html" -exec perl -pi -e 's/211.xx.xx.39/vod.xxxx.co.kr/g' {} \;
find . -type f -name [0,1,2][4,9].html -exec perl -pi -e 's/211.xx.xx.39/vod.xxxx.co.kr/g' {} \;

리눅스에선 파일명을 한번에 쉽게 변경할수 있는 방법이 있다.

바로 rename 이라는 명령어를 사용하는 방법


a_01.html, a_02.html, a_03.html 파일명을
01.html       , 02.html,    03.html 같은 패턴으로 변경할때 유용하다.

# find . -name "*.html" -exec rename a_ / {} \;

Jeus 설치

설치 이전에 자바를 설치 해 준다.
/etc/profile에 자바 PATH를 정확하게 잡아 줄 것.

#JAVA
JAVA_HOME=/usr/java/jdk1.6.0_03
export JAVA_HOME
PATH=$PATH:$JAVA_HOME/bin
CLASSPATH=$CLASSPATH:$JAVA_HOME/lib
export PATH

이후 JEUS 설치 파일을 실행 시켜준다.

# ./jeus50-unix-generic.bin

라이센스 화면에서 y를 입력하고 이 후

Choose Platform
---------------

Choose current system ( platform-architecture )
1)HP-UX PA-RISC
2)HP-UX ITANIUM
3)Solaris Ultra-Sparc
4)Solaris x86
5)AIX 5.x PowerPC
6)Linux i386
7)Linux ITANIUM
8)Linux x86_64(AMD)
Quit) Quit Installer

Choose Current System (DEFAULT: 6):

에서 설치할 플랫폼을 선택한 후, 사용 디렉토리만 설정 해 주면 설치는 끝.
JEUS의 PATH를 잡아 준다.

/etc/profile
#JEUS
export JEUS_HOME=/data/jeus5
export JEUS_HOME
PATH=$PATH:$JEUS_HOME:$JEUS_HOME/lib/system:$JEUS_HOME/webserver/bin
export PATH


* PHP 연동
PHP configure
기본적으로 PHP는 어디에 설치되던 상관은 없다.  php.ini파일은 php설치 한 곳에 카피한다.
# ./configure --prefix=/data/jeus5/webserver/php

# vi /data/jeus5/webserver/config/ws_engine.m
*SVRGROUP
htmlg       NODENAME = "uzoogom", SVRTYPE = HTML
cgig        NODENAME = "uzoogom", SVRTYPE = CGI
ssig        NODENAME = "uzoogom", SVRTYPE = SSI
jsvg        NODENAME = "uzoogom", SVRTYPE = JSV
phpg        NODENAME = "uzoogom", ScriptLoc="/php/bin/php" ,SVRTYPE = PHP

*SERVER
html        SVGNAME  = htmlg, MinProc = 1,  MaxProc = 2
cgi         SVGNAME  = cgig,  MinProc = 1,  MaxProc = 2
ssi         SVGNAME  = ssig,  MinProc = 1,  MaxProc = 2
MyGroup     SVGNAME  = jsvg,  MinProc = 1, MaxProc = 5
php         SVGNAME  = phpg,  MinProc = 3, MaxProc = 10

*EXT
htm         MimeType = "text/html",  SvrType = HTML
jsp             Mimetype ="application/jsp",  Svrtype=JSV,  SvrName=MyGroup
php         MimeType = "application/x-httpd-php", SvrType = PHP
php3        MimeType = "application/x-httpd-php3", SvrType = PHP

위와 같이 수정 후, 저장

환경파일을 읽어들이기
# wscfl -i ws_engine.m
# wsboot (WebtoB 실행)
# wsdown -i (WebtoB 정지)

간혹 로그를 보다보면 쓸모없는 이미지로그 때문에(특히 thumnail) 하루에도 몇 백메가까지 차오르는 것을 봤다.

그런 것을 방지하기 위한 쓸모 없는 로그 안남기는 법!

httpd.conf에 아래와 같이 설정
<IfModule mod_setenvif.c>
        SetEnvIfNoCase Request_URI "\.(gif|jpg|js|css|png|swf|txt|ico)$" do_not_log
        SetEnvIf Remote_Addr "::1" do_not_log
</IfModule>

각 도메인별 로그 부분에서 아래와 같이 설정해주면 된다.

CustomLog uzoogom.com-access_log combined env=!do_not_log


참 조잡하다 = ㅂ=)a
그래도 유용하게 잘 돌아간다~

#!/bin/bash
# scripts by uzoogom

export LANG_ALL=ko_KR.eucKR
day=$(date +%Y-%m-%d)
backuplist=$(cd /backup/ && ls -d *)
list="$day"backup_check.txt

echo "$day backup status" > $list
echo " " >> $list
echo "Success list--------------------------------" >> $list

echo " " > bad.txt
echo "Fail list--------------------------------" >> bad.txt

for checkname in $backuplist
do
        check=$(find /backup/$checkname -type f -name "backupTime($day).txt" | wc -l )

        if [ $check == 1 ]
        then
                echo "$checkname backup is successfully Done!" >> $list
        else
                echo "$checkname backup is Fail. plz check your system." >> bad.txt
        fi

done
cat bad.txt >> $list
success=$(grep "successfully" $list | wc -l)
nonsuccess=$(grep "Fail" $list | wc -l)
sed "1a Success  :"$success"\nFailure:"$nonsuccess"" $list > last.txt
cat last.txt > $list
cat $list | mail -s ""$day" real server backup status" uzoogom@dunet.co.kr serverbin@dunet.co.kr
mv $list /root/SH/checklog
rm -f /root/backup/*.txt

출처 : 대전국제IT교육센터 정성재 강사

 

1. NIS에 대하여
(1) 개요: 1980년대 중반 Sun Microsystems사에서는 두 가지 protocol을 내놓았는데 하나는 NFS
          (Network File System)이고 또 다른 하나가 NIS(Network Information System)이다. NIS는
          말 그대로 네트워크정보를 가지고 이것을 제공해주는 서비스를 말한다. 여러 대의 서버를
          운영하고 있고 각각의 로그인이 필요한 경우 사용자는 각 서버에 대해 모두 사용자계정과
          패스워드를 가지고 있어야 한다. NIS는 하나의 사용자계정과 패스워드, 그룹 등을 공유하
          여 다른 시스템에 제공하는 서비스를 말한다.
(2) 역사: NIS의 최초 버전은 YP(Yellow Pages)라 불리우는데, 이것은 British Telecom의 등록
          상표이며, NIS version 1이라고 부른다. 그 이후 Sun Microsystems 에서 NIS 2와 NIS 3을
          개발하였다. NIS 3 은 NIS+ 라고 불리우며 기존의 NIS에 보안을 강화한 것으로 RPC 에서
          데이터의 암호화와 인증을 지원한다. 그러나 NIS+는 서버 운영하기에 매우 복잡하여 현재
          대부분 NIS 2 를 사용한다.

2. NIS 서버구성하기
(1) 개요: NIS를 사용하기 위해서는 서버와 클라이언트에서 공통적으로 해 주어야할 작업들이 있다.
          NIS는 기본적으로 DNS를 사용하지 않으므로 /etc/host.conf 파일 수정등의 작업이 필요하
          다.
(2) NIS 구성을 위한 공통작업
   1) /etc/host.conf 파일 수정
    ㄱ. 설명: DNS를 이용하지 않게 하기 위해 DNS보다 NIS를 먼저 참조하도록 설정한다.
    ㄴ. 예
       [root@nis root]# cat /etc/host.conf
       order hosts,nis,bind
       multi on
   2) /etc/hosts 파일 등록
    ㄱ. 설명: 각각의 서버와 클라이언트 호스트들을 등록하여 좀 더 원할하게 사용할 수 있다.
             물론 DNS서버를 사용하는 경우 이 파일의 설정이 필요없다.
    ㄴ. 예
       [root@linux245 root]# cat /etc/hosts
       # Do not remove the following line, or various programs
       # that require network functionality will fail.
       127.0.0.1               linux245 localhost.localdomain localhost
       203.247.50.245          nis.test.co.kr
       203.247.50.246          nis_client.test.co.kr
(3) NIS 서버 구성하기
   1) 패키지의 설치
    ㄱ. 설명: NIS 서버용 프로그램은 ypserv이다. RHEL ES 3.0 기준으로 설치된 패키지는
             ypserv-2.8.1.i386.rpm 이다.
    ㄴ. 주요데몬
      a. ypserv : NIS 서버 데몬이다.
      b. yppasswdd : NIS 클라이언트에서 패스워드를 변경하도록 해주는 데몬이다.
      c. ypxfrd : NIS서버와 클라이언트간의 맵핑 속도를 높여주는 데몬이다.
   2) NIS 도메인 네임결정하기
    ㄱ. 설명: NIS에서 사용할 도메인이름을 결정해야 한다. nisdomainname 이라는 명령어를 이용하
             여 지정해도 되지만 부팅시에도 적용하려면 /etc/sysconfig/network 파일에 등록하도록
             한다.
    ㄴ. 예
      a. 명령어사용
        [root@linux245 root]# nisdomainname test.co.kr
          => NIS 도메인이름을 test.co.kr 이라고 지정하였다. 확인하려면 인자없이 nisdomainname
            입력하면 된다.
      b. /etc/sysconfig/network 파일에 한라인 추가
        NISDOMAIN=test.co.kr
   3) 테스트 계정 생성
    ㄱ. 설명: 테스트할 계정을 생성한다.
    ㄴ. 예
       useradd testuser
       passwd testuser
   4) 서버 시작하기
    ㄱ. 설명: 서버로 사용하기 위해서는 /etc/rc.d/init.d 디렉토리에 있는 ypserv와 yppasswdd를
             작동시켜야 한다.
    ㄴ. 예
       /etc/rc.d/init.d/ypserv start
       /etc/rc.d/init.d/yppasswdd start
    ㄷ. 참고: 부팅시에도 적용하려면 ntsysv 라는 명령실행후 ypserv와 yppasswdd 를 선택하도록
             한다.
   5) 서버의 작동확인
    ㄱ. 설명: 정상적으로 데몬이 작동중인지 확인한다.
    ㄴ. 예
       [root@linux245 root]# ps -aux |grep yp
       root      7683  0.0  0.2  1472  604 ?        S    00:59   0:00 ypserv
       root      7708  0.0  0.1  1636  488 ?        S    01:00   0:00 rpc.yppasswdd
       root      7738  0.0  0.2  4628  640 pts/1    S    01:03   0:00 grep yp
   6) 정보갱신
    ㄱ. 설명: 서버에서 사용자 추가등 설정한 내용이 변경되면 해당 정보를 갱신시켜야 한다.
    ㄴ. 방법: 2가지 방법중 하나를 한다.
      a. cd /var/yp ; make
      b. make -C /var/yp
    ㄷ. 참고
      a. make 작업을 수행하면 /var/yp 디렉토리에 지정한 nis서버이름으로 디렉토리(예를 들면 nis
        .test.co.kr)가 생성되고 그 디렉토리안에 관련정보를 가지고 있는 맵파일들이 생성된다.
      b. 서버에서 사용자가 새롭게 추가되면 추가된 정보를 지속적으로 갱신시켜줘야 한다. 이 경우
        클론을 사용해서 주기적으로 업데이트하도록 한다.
        예) [root@linux245 root]# cat /etc/crontab
            0 * * * * root make -C /var/yp > /dev/null 2>&1
              => 한시간 간격으로 업데이트하도록 설정한 예이다.
(4) NIS 클라이언트 구성하기
   1) 패키지의 설치: NIS 클라이언트로 사용하기 위해서는 ypbind와 yp-tools 라는 패키지가 설치
                    되어 있어야 한다. RHEL ES 3.0 버전에는 ypbind-1.12-1.i386.rpm과
                    yp-tools-2.8-1.i386.rpm 패키지가 설치되어 있다.
   2) NIS 도메인 이름 설정하기
    ㄱ. 설명: 서버 구성시 지정한 NIS 도메인이름을 지정한다. nisdomainname이라는 명령어를 사용
             해도 되고, 부팅시마다 적용시키기 위해 /etc/sysconfig/network 파일에 등록시킨다.
    ㄴ. 예
      a. 명령어사용
        [root@linux245 root]# nisdomainname test.co.kr
          => NIS 도메인이름을 test.co.kr 이라고 지정하였다. 확인하려면 인자없이 nisdomainname
            입력하면 된다.
      b. /etc/sysconfig/network 파일에 한라인 추가
        NISDOMAIN=test.co.kr
   3) NIS 서버와 nisdomain 설정
    ㄱ. 설명: /etc/yp.conf 파일에 지정한다.
    ㄴ. 예
       server nis.test.co.kr
       ypserver nis.test.co.kr
       domain test.co.kr
   4) ypbind 시작
    ㄱ. 설명: NIS 클라이언트는 ypbind라는 데몬을 작동시켜야 한다. 또한 ntsysv라는 명령어를
             실행시켜 부팅시에도 작동하도록 선택한다.
    ㄴ. 예
       /etc/rc.d/init.d/ypbind start
(5) NIS 클라이언트에서 사용하기
   1) 인증변경
    ㄱ. 설명: NIS 서버를 통한 인증을 받도록 설정을 변경해야 한다.
    ㄴ. 방법 : authconfig(또는 setup명령후에 Authentication configuration 선택)후에 NIS 사용을
              선택하고 '도메인'과 '서버'를 지정한다.
    ㄷ. 설정예
       도메인: test.co.kr
         서버: nis.test.co.kr
   2) 로그인해보기
    ㄱ. NIS 클라이언트에서 telnet localhost 명령을 내린다.
    ㄴ. 서버에 생성된 계정인 testuser로 로그인한다.
   3) 확인: 인증이 성공하면 다음과 같이 로그인된다.
     예)
     Red Hat Enterprise Linux ES release 3 (Taroon)
     Kernel 2.4.21-4.EL on an i686
     login: nisman
     Password:
     No directory /home/testuser!
     Logging in with home = "/".
     -bash-2.05b$
       => 일반적으로 리눅스에서 로그인하게 되면 '/home/계정'디렉토리로 접근하게 되는데,
         NIS는 인증만을 해주므로 사용자 홈디렉토리가 존재하지 않아 위와 같은 메시지가 나타나고
         로그인하게 된다. 이러한 경우 NFS와 autofs를 사용하여 외부에서 홈디렉토리도 가져오거나
         아니면 NIS클라이언트에 해당 사용자의 홈디렉토리와 환경설정파일을 부여할 수도 있다.
   4) 참고: NIS 클라이언트에서 홈디렉토리생성하여 복구하기
    ㄱ. 설명: NIS 서버는 NIS 클라이언트에게 계정과 패스워드 관련정보만을 제공한다. 따라서 일
             반 로컬사용자처럼 사용하려면 사용하고자할 디렉토리를 생성하고 권한을 부여해야
             한다.
    ㄴ. 방법: 서버에 지정된 사용자가 testuser인 경우
      a. 디렉토리 생성
        mkdir /home/testuser
      b. 환경파일 복사해오기
        cp /etc/skel/.* /home/testuser
      c. 소유권 변경
        chown -R testuser.testuser /home/testuser

3. NIS 관련명령어
(1) nisdomainname
   1) 설명: NIS 도메인이름을 보여주거나 지정하는 명령이다.
   2) 사용법
     nisdomainname [NIS 도메인이름]
   3) 사용예
    ㄱ. [root@linux245 root]# nisdomainname
        test.co.kr
         => 현재 설정된 NIS 도메인이름을 보여준다.
    ㄴ. [root@linux245 root]# nisdomainname test.co.kr
         => NIS 도메인을 test.co.kr로 지정한다.
(2) ypwhich
   1) 설명: NIS 클라이언트에서 사용하는 명령어로 NIS 서버의 이름과 관련 맵파일을 보여준다.
   2) 사용법
     ypwhich [option]
   3) option
     -m : NIS 서버관련 맵파일을 보여준다.
   4) 사용예
    ㄱ. [root@linux246 root]# ypwhich
        nis.test.co.kr
         => NIS서버의 보여준다.
    ㄴ. [root@linux246 root]# ypwhich -m
         => NIS 서버관련 맵파일을 보여준다.
(3) ypcat
   1) 설명: NIS 클라이언트에서 사용하는 명령어로 NIS 서버의 데이타베이스라고 할 수 있는 맵파일
           의 내용을 확인하는 명령이다.
   2) 사용법
     ypcat 맵파일
      => NIS 서버의 맵파일 정보를 보여준다. 맵파일의 확인은 'ypwhich -m' 명령을 이용한다.
   3) 사용법
    ㄱ. [root@linux246 root]# ypcat hosts.byname
         => 호스트관련정보를 보여준다.
    ㄴ. [root@linux246 root]# ypcat passwd.byname
         => NIS 서버의 사용자관련 정보를 보여준다.
(4) yppasswd
    1) 설명: NIS 클라이언트에서 NIS 서버에 등록된 사용자의 패스워드를 변경하는 명령이다. 물론
           변경하려면 NIS 서버의 root 패스워드도 알아야 한다.
    2) 사용법
      yppasswd 사용자계정
    3) 사용예
      ypasswd testuser
(5) ypchsh
   1) 설명: NIS 클라이언트에서 NIS 서버에 등록된 사용자의 쉘을 변경하는 명령이다.
   2) 사용법
     ypchsh 사용자계정
   3) 사용예
     ypchsh testuser
(6) ypchfn
   1) 설명: NIS 클라이언트에서 NIS 서버에 등록된 사용자의 정보를 변경하는 명령이다.
   2) 사용법
     ypchfn 사용자계정
   3) 사용예
     ypchfn testuser

* 참고: NIS 통한 인증이 가능한 서비스
  NIS로 telnet, samba, ssh(openssh 3.6버전이상) 등이 가능하다. RHEL 3에 설치되어 있는
openssh는 패치를 해야만 NIS를 통한 인증이 가능하다.

출처 : 대전국제IT교육센터 정성재 강사

 

1. 아파치 2.0 에 대하여
(1) 개요: 아파치 2.0 버전은 기존의 1.3버전에서 업그레이드된 버전으로 레드햇 리눅스 8.0 부터
          기본으로 설치되고 있다. 1.3버전에 비해 많은 부분이 달라졌으므로 기존의 버전과 비교
          해서 그 차이점을 알아야 한다. 아파치 2.0은 가장 큰 변화는 멀티스레딩(MultiThreading)
          의 지원이다. 1.3버전은 각 요청을 프로세스에 의존하는 방식이었으나 스레드 기능의 추가
          로 아파치 2.0은 확장성과 유연함을 더 하였다. 아파치에서는 MPM(Multi-Processing Modul
          es)이라고 한다.
(2) MPM(Multi-Processing Modules)
   1) 설명: 아파치 2.0이 소개되면서 바뀐 가장 큰 변화로 기존의 1.3 버전이 안고 있는 한계인
           확장성 부분에 초점을 두고, 이에 대한 솔루션으로 하이브리드(Hybrid)웹서버를 표방하였
           다. 기존의 프로세스 방식과 스레드를 혼용한 것으로 하나의 프로세스가 제공해 주지
           못하던 신뢰성을 스레드개념을 도입하여 문제를 해결하도록 하였다. 이러한 방법은 신뢰
           성과 확장성을 제공한다. MPM은 주로  세가지 모듈형태로 많이 사용하는데, 이 중 하나의
           모듈을 선택하여 사용하면 된다. 특별히 선택하지 않으면 1.3 버전과 같은 형태인
           prefork 모듈을 사용한다.
   2) MPM 모듈의 종류
    ㄱ. prefork: 1.3 프로세스 모듈과 같은 방법으로 각 요청에 프로세스가 매핑되어 서비스 요청이
                많게 되면 프로세스의 수가 증가하게 된다. 프로세스를 제어하는 부모 프로세스는
                클라이언트의 요청이 들어올 경우 대기하고 있다가 자식 프로세스의 생성여부 등을
                관리하는 방식이다. 'MinSpaerServers', 'MaxSpareServers', 'Maxservers'의 프로
                세스 관련 지시어를 바탕으로 프로세스의 상태를 관리하며, 스레드를 지원하는 않는
                오래된 플랫폼의 경우나 스레드없이 작동하기를 원할 때 사용한다.
    ㄴ. worker: 'prefork MPM'에 기반을 두고 있는 모듈로 지정된 만큼의 스레드에 얼마나 많은 자
               식 프로세스를 생성할 것인지 지정하는 것이다. 페이지 요청이 들어오면 스레드는
               요청을 받게 되고 그에 따라 자연히 응답한다. 그러나, 이미 요청을 처리하는데 있어
               서 한계를 넘는 경우 새로운 자식 프로세스를 생성하게 된다.
    ㄷ. perchild: 서버시작시에 고정적인 프로세스 개수를 정의하며 각 프로세스는 특정 스레드
                 개수로 동작한다. 이 프로세스가 증가하게 되면 정의되어 있는 기능에 의해 자연히
                 스레드 개수는 증가된다. 프로세스는 요청이 많은지 그렇지 않은지를 판별하여 최
                 소/최대 여유분의 스레드 개수를 유지하게 된다. 또한, 각 자식 프로세스에 대하여
                 각기 다른 사용자와 그룹을 지정할 수 있다. 이 기능은 mod_perl, PHP 등을 포함한
                 CGI 스크립드들이 자식프로세스의 소유주 아이디로 작동이 가능하기 때문에 웹서버
                 입장에서는 보안적인 기능을 제공해준다고 볼 수 있다. 이 프로세스 모듈이 요즘
                 스레드를 지원하는 대부분 플랫폼환경에서 사용되어 질 수 있으며, 최대한 많은 요
                 청을 처리하기 위하여 CPU 사용량을 줄일 수 있는 방안도 될 수 있다.
    ㄹ. 기타 MPM모듈: 기타 MPM모듈로 WinNT, BeOS, NetWare, OS/2, 등이 있다.
(3) 기타 특징
   전자상거래와 같이 안전한 전송을 위해 쓰여지고 있는 SSL(Secure Socket Layer)을 핵심모듈의
  수정없이 지원한다. 또한 한 모듈의 출력을 다른 모듈에서 수정하여 클라이언트에게 보내는 필터링
  기능이 추가되었으며, IPV6도 지원한다.

2. 아파치 2.0 버전이 1.3버전에 비해 달라진 점
(1) 아파치 2.0은 아파치 데몬이 단독모드(Standalone)으로만 동작하도록 지원하기 때문에 서버의
   운영타입과 관련된 지시자인 ServerType 지시자가 없어졌다.
(2) StartServers, MinSpareServers, MaxSpareServers, MaxClients, MaxRequests-PerChild 등의
    지시자는 서버의 프로세스 개수를 지정하는 지시자였는데 이 모든 지시자들의 MPM모듈의 메뉴로
    흡수되었다.
(3) 1.3버전에서 포트넘버를 지정하던 Port라는 지시자를 없애고 Listen이라는 지시자를 사용한다.
    또한 포트넘버를 Listen 지시자 이외에 ServerName 지시자뒤에 호스트명에서 지정해야 한다.
(4) 개인 사용자의 웹 디렉토리의 경로는 나타내는 UserDir 지시자의 기본값이 disable로 설정되어
    있다. 만약 활성화시키려면 disable을 public_html 등으로 변경해야 한다.
(5) 1.3 버전에서는 DSO 모듈 설정을 위해 httpd.conf파일안에 AddModule, ClearModuleList 등의
   지시자를 사용하였지만 2.0에서는 Include지시자를 이용하여 conf.d디렉토리에 있는 conf파일을
   불러 읽어 들이게 할 수 있다. 물론 Include지시자를 사용하지 않으면 기존의 설정대로 할 수
   있다.
(6) srm.conf와 access.conf 파일을 독립적으로 사용하려면 Accessconfig와 ResourceConfig 지시자
   를 사용하였지만 2.0에서는 Include지시자를 사용한다.
(7) ErrorDocument 지시자로 메시지를 출력할 때 겹따옴표를 사용하지 않았지만, 2.0에서는 반드시
   겹따옴표를 사용해야 한다.
(8) 그 외에 AgentLog, ReferLog, RefererIgnore, FancyIndexing 등이 사용되지 않는다.

3. apache의 환경설정
(1) apache의 환경설정파일
   아파치 2.0 버전에서도 httpd.conf 파일에서 모든 환경설정을 다하도록 되어 있다.
(2) httpd.conf
   1) 구성: 1.3 버전과 마찬가지로 크게 3가지 부분으로 구성된다.
    ㄱ. Global Environment: 아파치를 전반적으로 제어하는 부분(전체환경설정)
    ㄴ. Main Server Configuration: 가상호스트에서 처리되는 않는 요청을 모두 처리해주는 주서버
                                  또는 기본 서버의 작동을 제어하는 부분(메인서버 환경설정)
    ㄷ. Virtual Host: 다른 IP와 호스트 이름을 처리하는 가상호스트 설정부분
   2) 주요설정 : httpd.conf파일은 세가지 섹션 설정으로 구성되어 있다.
    ### Section 1: Global Environment
     -ServerRoot "/usr/local/apache": 웹서버가 설치되는 디렉토리를 나타낸다. 이 곳에 환경설정
                                     파일, log파일, 에러파일, 실행바이너리 등이 위치한다.

     -ScoreBoardFile /usr/local/apache/logs/httpd.scoreboard
       => Internal server process정보를 기록할 때 사용한다. 모든 아키텍쳐에서 요구되는 것은 아
         니며, 필요한 경우 아파치 실행 프로세스의 값이 겹치지 않도록 해주면 된다.

     -PidFile /usr/local/apache/logs/httpd.pid : 서버가 시작할 때 자신의 프로세스 ID를 기록할
                                                파일을 나타낸다.

     -Timeout 300 : 받기/보내기 타임 아웃 시간을 설정한다. 설정시간 단위는 초이다.

     -KeepAlive On : 지속적인 접속을 허가할 것인지 말 것인지를 설정하는 부분이다. 즉, 하나의
                    프로세스가 실행됐을 때 처음부터 끝까지 이 프로세스를 요청한 사용자에게 작
                    업을 할 수 있도록 하는 기능이다. 이것을 사용하는 이유는 성능저하 때문인데,
                    예를 들면 자식프로세서가 한 가지 일만 처리하고 죽는 것이 아니라 다음의 일
                    도 처리함으로써 성능 향상을 꾀한다.

     -MaxKeepAliveRequests 100 : KeepAlive가 설정되어 있을 때, 지속적인 접속 기간 동안 처리할
                                수 있는 요청 갯수를 설정하는 부분이다. 클라이언트의 요청을 몇
                                번이나 처리하고 다시 처음 상태로 돌아가는지를 설정한다. 최대
                                요청갯수 0을 넣으면 무한대이다. 높은 성능을 내기 위해서는 높은
                                값을 써 넣는다.

     -KeepAliveTimeout 15 : keepAlive가 설정된 상태에서 클라이언트의 요청이 타임 아웃되는 시간
                           을 나타내며 초단위이다.

     -# prefork MPM
      <IfModule prefork.c>
      StartServers       8             // 몇개의 자식 프로세스를 처음에 미리 띄울것인지 지정
      MinSpareServers    5             // 최소로 유지해야할 여분의 자식프로세스수
      MaxSpareServers   20             // 최대 제한되어야 할 여분의 자식프로세스수
      MaxClients       150             // 클라이언트들이 동시에 접속할 수 있는 최대의 수 지정
      MaxRequestsPerChild  1000        // 자식 프로세스가 죽기전에 처리할 수 있는 요청의 개수
      </IfModule>
       => 아파치 1.3 버전에서 사용되는 모듈형태로 하나의 부모 프로세스가 작동하고 클라이언트의
         요청이 들어오면 자식프로세스를 생성하는 방식이다.

     -# worker MPM
      <IfModule worker.c>
      StartServers         2
      MaxClients         150
      MinSpareThreads     25   // 최소 여분의 스레드값
      MaxSpareThreads     75   // 최대 여분의 스레드값
      ThreadsPerChild     25   // 각 자식 프로세스당 생성하는 스레드값
      MaxRequestsPerChild  0   // 값이 0이면 자식프로세스는 죽지않고 계속 처리한다.
      </IfModule>
       => 프로세스 기반으로 작동하는 prefork MPM 방식과 각 자식 프로세스가 스레드로 클라이언트
         요청에 응답하는 혼합된 멀티 스레드 방식이다. 지정된 만큼의 프로세스와 각 프로세스마다
         스레드를 준비하여 많은 클라이언트의 요청을 받아들인다. prefork MPM에 비해 시스템 자원
         을 덜 소모한다.

     -# perchild MPM
      <IfModule perchild.c>
      NumServers           5  // 시작할 프로세스의 개수를 지정
      StartThreads         5  // 자식 프로세스에 의해서 실행되는 스레드의 수
      MinSpareThreads      5  // 최소 여분의 스레드수
      MaxSpareThreads     10  // 최대 여분의 스레드수
      MaxThreadsPerChild  20  // 자식프로세스가 생성할 수 있는 최대 스레드의 수
      MaxRequestsPerChild  0
      </IfModule>
       => 고정된 프로세스 개수를 정의하고 각 프로세스는 특정 스레드개수로 동작한다.

     -Listen 80 : 아파치 웹서버의 포트를 설정한다. 아파치 1.3버전의 Port 지시자를 대체한다.

     -Include conf.d/*.conf
       => 웹서버와 연동하는 프로그램과 관련된 환경파일을 불러오도록 지정한다.

     -LoadModule access_module modules/mod_access.so
       => 동적 객체 지원(Dynamic Shared Object, DSO)방식으로 관련 모듈을 적재한다. PHP 등을
         사용하려면 이 부분에 설정되어 있어야 한다.

     -#ExtendedStatus On
       => server-status 핸들러가 호출될 때 아파치 서버 상태를 좀 더 상세히 체크할 때 쓴다.

    ### Section 2: 'Main' server configuration
     -User apache
      Group apache
       => apache라는 사용자와 그룹을 가진 사용자들의 요청에 의해 웹서버가 실행되게 된다. httpd
        가 다른 사용자 또는 그룹 권한으로 실행하게 하려면 우선은 httpd가 root사용자 권한으로
        실행되고 나서 설정한 다음에 사용자권한으로 전환한다.

     -ServerAdmin root@posein.com : 서버에 문제가 발생했을 경우 보낼 관리자의 이메일주소를 적
                                   는다.

     -ServerName www.posein.com:80 : 서버의 도메인이름을 적는다. 만약 도메인이 없을 경우에는
                                    IP를 적는다. 실제 이름이 아닌 가상의 이름도 가능하고,
                                    추가로 2.0버전부터는 도메인명 뒤에 포트번호를 명기하도록
                                    하고 있다.

     - UseCanonicalName On : 아파치가 자신의 URL 생성시 어떤 특정한 법칙에 따라 생성을 하도록
                            지정하는 지시자이다. On이면 서버이름과 포트를 이용한 명칭을 생성
                            하고, Off이면 클라이언트에게 제공하는 호스트이름과 포트를 생성하게
                            된다.

     -DocumentRoot "/usr/local/apache/htdocs": URL상의 서버 root문서가 위치하는 디렉토리를 적
                                              는다.

     - <Directory /usr/local/apache/htdocs>
           Options Indexes FollowSymLinks
           AllowOverride None
           Order allow,deny
           Allow from all
       </Directory>
        => 특정 디렉토리를 제어할 때 사용하는 지시자를 <Directory /> ... </Directory>의 형태로
          작성하며, 각각의 디렉토리에 관한 권한등의 여러 설정등을 한다.
          * Options
            NONE : 어떤 옵션도 이용할 수 없으므로 모든 접근을 거부
            ALL : MultiViews 옵션을 제외한 모든 옵션을 부여
            Indexes : URL에 지정된 디렉토리에(index.html 같은) 지정된 파일이 없을 경우 디렉토
                     리의 파일목록을 보여주는 옵션
            Includes : 서버측의 추가적인 정보를 제공(SSI:Server Side Includes)
            FollowSymLinks : 디렉토리의 심볼릭 링크 사용 가능
            ExecCGI : CGI 스크립트를 실행할 수 있도록 함
            IncludesNOEXEC : SSI는 허용하지만 #exec 명령과 CGI 스크립트 #include 불허
            MultiViews : All 옵션이 설정되었을 때만 지정된 목록의 multiviews를 허용하는 것으로
                        유사한 파일이름을 찾아주는 기능을 실행한다. 예를 들면 index라고만 입력하
                        더라도 index.*를 찾아서 보여준다.
          * AllowOverride: 사용자 인증에 관련된 지시자로 클라이언트가 웹서버의 특정 디렉토리에
                          접근할 때 해당 디렉토리에 있는 유저 인증 파일인 .htaccess 파일을
                          읽게 되는데, 여기를 None으로 설정하면 아파치 서버는 이 파일을 무시
                          하게 된다.
           None : AllowOverride를 사용하지않는다. 즉 유저 인증파일을 사용하지 않는다.
           All : httpd.conf파일의 AccessFileName 지시자로 설정한 파일을 사용하며 또한 지시자를
                사용할 수 있다.
           AuthConfig : AccessFileName 지시자에 명시한 파일에 대해서 사용자 인증 지시자 사용을
                       허락한다. AuthDBMGroupFile, AuthDBMUserFile, AuthGroupFile, AuthName,
                       AuthType, AuthUserFile, require등을 사용할 수 있다.
           FileInfo : AccessFileName 지시자로 설정한 파일에 대해서 문서 유형을 제어하는 지시자
                     사용을 허락한다. AddEncoding, AddLanguage, AddType, DefaultType, ErrorDo
                     cument, LanguagePriority등을 사용할 수 있다.
           Indexes : AccessFileName 지시자로 설정한 파일에 대해서 디렉토리 Indexing을 제어하는
                    지시자 사용을 허락한다. AddDescription, AddIcon, AddIconByEncoding, AddIco
                    nByType, DefaultIcon, DirectoryIndex, FancyIndexing, HeaderName, IndexIgno
                    re, IndexOptions, ReadmeName등을 사용할 수 있다.
           Limit : AccessFileName 지시자로 설정한 파일에 대해서 호스트 접근을 제어하는 지시자
                  사용을 허락한다. Allow, Deny, order 등을 사용할 수 있다.
           Options : AccessFileName 지시자에 명시한 파일에 대해서 Options 그리고 XBiHack 등과
                    같은 지시자 사용을 허락한다. Options, XBitHack등을 사용할 수 있다.
          * Order
            => Order명령은 해당 디렉토리에 대한 IP, DNS 필터링의 순서를 설정한다. Allow는 호스
              트 접근을 허락하며, Deny는 접근을 불허한다. Allow from all은 모든 호스트로부터의
              접근을 허락한다는 뜻이며, Deny from all은 모든 호스트로부터의 요청을 거부한다는
              뜻이다.
                예) Order deny, allow
                    Deny from all
                    Allow from 호스트명

     - #<Directory /home/*/public_html>
       #    AllowOverride FileInfo AuthConfig Limit
       #    Options MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec
       #    <Limit GET POST OPTIONS PROPFIND>
       #        Order allow,deny
       #        Allow from all
       #    </Limit>
       #    <LimitExcept GET POST OPTIONS PROPFIND>
       #        Order deny,allow
       #        Deny from all
       #    </LimitExcept>
       #</Directory>
         => 개인 홈페이지 디렉토리에 대한 접근 권한을 설정한다. <Limit> ~ </Limit>로 각각의 접근
           을 제어할 수 있다.

     -UserDir public_html
       => 사용자의 개인 홈페이지의 문서가 위치하는 디렉토리명을 적는다. 기본값이 public_html
         이지만, 너무 길다고 생각되면 www나 web등으로 바꿔도 된다.

     -DirectoryIndex index.html index.php
       => 디렉토리의 인덱스파일(처음열리는 파일)로 사용할 파일이름을 적는다. 기본 index.html에
         index.htm, index.php, index.php3 index.shtml등을 추가하도록 한다.

     - AccessFileName .htaccess
        => 각각의 디렉토리의 접근을 제어하는 정보를 가진 파일 이름을 지정하며 웹 클라이언트들
          이 .htaccess파일을 볼 수 없도록 설정한다. 여기에서 사용하는 .htaccess는 권한정보를
          가지고 있으므로 보안유지 차원에서 접근을 허용해서는 안된다. 즉, 파일을 제어하려는
          디렉토리에 넣어 사용한다.

     - <Files ~ "^\.ht">
           Order allow,deny
           Deny from all
       </Files>
         => 웹 클라이언트들에게 .htaccess파일을 볼 수 있는지 여부를 결정한다.

     -TypesConfig /usr/local/apache/conf/mime.types
        => mine.types파일 또는 이에 해당하는 파일을 찾을 위치를 결정한다. MIME은 Multipurpose
          Internet Mail Extension의 약자로 클라이언트 브라우저에게 어떠한 유형의 자료를 전송
          할 것인지를 조절해 주는 기능이다.

     - DefaultType text/plain : 파일 확장자를 정의해 두는 것으로 MIME타입을 알 수 없는 문서에
                              대하여 사용할 기본 MIME타입을 설정한다. 기본값은 text/plain이며,
                              이 값으로 설정하면 Mime Type을 결정하지 못할때는 기본 텍스트문
                              서 결정한다. 주로 서버에 문서 파일이 많을 경우에 사용한다. 웹 브
                              라우저상에서 실행 프로그램이나 이미지 등 바이너리인 경우 웹브라
                              우저가 바이너리라고 해석하게 하기 위해서 "application/octet-str
                              eam" 과 같은 형식을 적어주어야 한다. 이것은 웹브라우저가 실행파
                              일 등을 텍스트문서로 착각하고 브라우저상에 표시하지 않게 하기
                              위함이다.

     - <IfModule mod_mime_magic.c>
           MIMEMagicFile /usr/local/apache/conf/magic
       </IfModule>
         => mod_mime_magic 모듈을 사용할 경우 해당 파일의 내용으로 파일 타입 힌트를 얻는 역할
           을 한다. MIMEMagicFile명령은 암시를 정의하는 모듈이 어디에 위치하고 있는지를 알려
           주는 것으로 이것을 사용하기 위해서는 해당 모듈을 탑재해야 한다.

     -HostnameLookups Off : 클라이언트에서의 접속 이름 또는 IP주소만을 기록할 지를 여부를 체크
                           한다. 예를 들면 posein.com은 On값이 되며, 192.168.0.1은 Off값이다.

     - ErrorLog /usr/local/apache/logs/error_log
       => 웹서버가 에러가 발생했을 경우 에러에 관한 기록파일을 설정한다. 참고로 <VirtualHost>
         지시자에서 ErrorLog 설정을 하지 않았다면 여기에서 언급한 설정을 따른다. 로그 파일의
         경우는 계속해서 사용량이 증가하므로 수시로 용량을 줄여야 한다.

     - LogLevel warn
        => 로그메시지의 크기를 제어하는 부분이다. 옵션에는 debug, info, notice, warn, error,
          crit, alert!, emerg 등이 있다.

     - LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
       LogFormat "%h %l %u %t \"%r\" %>s %b" common
       LogFormat "%{Referer}i -> %U" referer
       LogFormat "%{User-agent}i" agent
        => CustomLog 지시자에서 사용할 별명을 정의하는 곳으로 각각의 의미는 다음과 같다.
          %h : 호스트명
          %l : 리모트 로그이름
          %u : 사용자 인증에 사용된 유저명
          %t : 시간
          %r : 요청한 내용의 첫번째 줄
          %s : 서버상태
          $b : 전송량(헤더 포함) -바이트수
          %{헤더} : 요구된 헤더 내용
          %U : 요구한 URL

     - CustomLog /usr/local/apache/logs/access_log common
        => 클라이언트들이 웹서버에 접근한 정보를 기록해 주는 access_log 파일의 위치를 설정한
          다. <VirtualHost> 지시자에서 이 설정 부분이 없을 경우 여기서 설정한 위치로 모
          두 저장된다. 가상 호스트별로 따로 접근 로그파일을 만들고 싶으면 이 설정을 각각의
          <VirtualHost> 지시자 안에 넣으면 된다.

     - #CustomLog /usr/local/apache/logs/referer_log referer
       #CustomLog /usr/local/apache/logs/agent_log agent
         => 브라우저(agent)와 접속자(referer) 기록 파일을 갖고자 한다면 위 주석을 제거한다.

     - #CustomLog /usr/local/apache/logs/access_log combined
         => access, agent, referer 정보를 하나의 파일에 모두 저장하기를 원한다면 combined 옵션
           을 이용한다.


     - ServerTokens Full
       => 아파치에서 헤더에 의해 전송되는 정보를 어디까지 보여줄 것인가를 설정하는 지시자이다.
         * 값에 따른 정보 제공
          Prod[ductOnly] : 웹서버 종류만 표기된다. 예) Server:Apache
          Major : 아파치의 주버전 정보까지만 보여줌 예) Apache/2
          Minor : 아파치 하위버전 정보까지 보여줌 예) Apache/2.0
          Min[imal]: Prod 키워드 제공정보 + 웹서버 버전 예) Server:Apache/2.0.46
          OS: Min 키워드 제공 정보 + 운영체제 예) Server:Apache/2.0.46 (Unix)
          Full: OS 키워드 제공정보 + 설치된 모듈(응용프로그램) 정보
               예) Server: Apache/2.0.46 (Unix) PHP/4.3.2

     - ServerSignature On
        => 아파치 서버가 생성하는 페이지(에러문서, FTP 디렉토리 list, mod_status, mod_info,
          output, CGI 생성 문서 제외)에 서버 버전과 가상호스트 이름을 포함하는 행을 넣는 것을
          설정한다. 옵션에는 On | Off | Email 등이 있고 On으로 설정하면 서비스중인 가상호스트
          의 이름과 서버 버전을 포함한 라인을 보여주고, Email의 경우 ServerAdmin으로의 mailto:
          링크도 포함된다.

     - Alias /icons/ "/usr/local/apache/icons/"
        => 웹 문서 루트 디렉토리(DocumentRoot dir)외의 다른 디렉토리에서도 문서를 저장할 수
          있게 해 주는 별칭을 설정하는 부분으로 별칭의 설정은 Alias /별칭/ "path"하면 된다.
          디렉토리 설정은 앞에서 사용한 옵션을 사용하면 되고, 별칭은 하나 이상 여러 개를 만들
          어 사용 가능하기 때문에 필요한 만큼 만들어 사용하면 된다.

     - ScriptAlias /cgi-bin/ "/var/www/cgi-bin/"
        => Alias와 같은 기능을 하는 지시자로 CGI 스크립트파일이 있는 경로를 지정한다.

     - # Redirect permanent /foo http://www.example.com/bar
        => 하나의 도메인으로 메일 서버와 웹서버를 사용하는 경우에 유용하다. 즉 domain.com 을
          메일서버로 쓰고, www.domain.com을 웹서버를 쓰는 경우 www.domain.com만 입력하면 웹페
          이지가 열리고 domain.com을 입력하면 웹페이지가 안 열리는 경우 아래와 같이 입력하면
          된다.
            예) Redirect permanet /    http://www.domain.com

     - IndexOptions FancyIndexing VersionSort
        => 디렉토리 목록을 표시해 줄 때 표준으로 보여줄 것인지, 아니면 파일에 대한 약간의 정보
          를 추가해서 표시해 줄 것인지를 결정한다. 만약 표시한 파일이 존재하지 않을 경우 디렉
          토리와 파일들의 목록을 보여줄 때 디렉토리와 속성에 따른 아이콘, 파일 크기, 파일 시간
          을 사용할 지 여부를 설정한다. 추가로 VersionSort라는 것이 있는데 이것은 파일버전순으
          로 인덱스해주는 옵션이다.

     - AddIconByEncoding (CMP,/icons/compressed.gif) x-compress x-gzip

       AddIconByType (TXT,/icons/text.gif) text/*
       AddIconByType (IMG,/icons/image2.gif) image/*
       AddIconByType (SND,/icons/sound2.gif) audio/*
       AddIconByType (VID,/icons/movie.gif) video/*

       AddIcon /icons/binary.gif .bin .exe
       AddIcon /icons/binhex.gif .hqx
       AddIcon /icons/tar.gif .tar
       AddIcon /icons/world2.gif .wrl .wrl.gz .vrml .vrm .iv
       AddIcon /icons/compressed.gif .Z .z .tgz .gz .zip
       AddIcon /icons/a.gif .ps .ai .eps
       AddIcon /icons/layout.gif .html .shtml .htm .pdf
       AddIcon /icons/text.gif .txt
       AddIcon /icons/c.gif .c
       AddIcon /icons/p.gif .pl .py
       AddIcon /icons/f.gif .for
       AddIcon /icons/dvi.gif .dvi
       AddIcon /icons/uuencoded.gif .uu
       AddIcon /icons/script.gif .conf .sh .shar .csh .ksh .tcl
       AddIcon /icons/tex.gif .tex
       AddIcon /icons/bomb.gif core

       AddIcon /icons/back.gif ..
       AddIcon /icons/hand.right.gif README
       AddIcon /icons/folder.gif ^^DIRECTORY^^
       AddIcon /icons/blank.gif ^^BLANKICON^^
         => IndexOptions에서 FancyIndexing으로 설정되어 있을 경우에 사용되며 각각의 파일 및
           확장자에 따른 아이콘의 모양을 정해준다.

     - DefaultIcon /icons/unknown.gif
         => 앞에서 설정되어 있지 않은 파일에 대하여 사용하는 아이콘이다.

     - #AddDescription "GZIP compressed document" .gz
       #AddDescription "tar archive" .tar
       #AddDescription "GZIP compressed tar archive" .tgz
         => 서버에서 만들어지는 인덱스에 있는 파일 뒤에 짧은 주석을 달 수 있도록 한다. 위의
           경우에는 확장자가 .gz이면 "GZIP compressed document"라는 설명을 보여주게 된다.

     - ReadmeName README
       HeaderName HEADER
        => 서버가 디렉토리 목록 뒤에 붙여넣을 README 파일의 이름을 설정하며, HeaderName은 디렉
          토리 인덱스 앞에 내용을 넣을 파일의 이름을 설정한다. 즉, 디렉토리 목록을 보여줄 때
         화면 아래부분에 간단한 설명이 들어갈 파일을 지정한다. 예를 들면, 서버는 처음 name.ht
         ml 파일을 찾고 존재하면 그 내용을 포함한다. 만약 파일이 존재하지 않는다면 name.txt를
         찾고 txt내용을 포함한다.

     - IndexIgnore .??* *~ *# HEADER* README* RCS CVS *,v *,t
        => 디렉토리를 인덱스할 때 파일을 보이지 않게 설정하는 부분이다.

     - AddEncoding x-compress Z
       AddEncoding x-gzip gz tgz
        => 일부 브라우저에서 전송을 받으면서 정보를 압축해제할수 있도록 허용할 때 사용하는 것
          으로 모든 브라우저에서 이 기능을 지원하지는 않는다.

     - AddLanguage da .dk
         => 문서의 언어를 표시한다. 즉, 내용 협상 과정을 통해 브라우저가 이해하는 언어의 문서를
           제공할 수 있다. 폴란드어의 경우 펄과 구분하기 위해 pl .po로 포기한다.

     - LanguagePriority en da nl et fr de el it ja kr no pl pt pt-br ru ltz ca es sv tw
         => 내용 협상 과정에서 같은 순위를 가질 때 어느 언어에게 우선권을 부여할 것인지를 설정
           한다. 설정은 내림차순으로 나열한다.

     - AddDefaultCharset ISO-8859-1
        => 기본적으로 적용되는 웹문서의 언어를 지정한다. 만약 웹페이지에 한국어를 기본으로
          지정하려면 EUC-KR 이라고 설정한다.

     - AddCharset ISO-8859-1  .iso8859-1  .latin1
        => 추가로 지원하는 웹 문서의 언어를 설정한다.

     - AddType application/x-tar .tgz
       => 추가적으로 지원될 파일들을 적는다.
        예) php4를 사용할 경우
           AddType application/x-httpd-php .php .htm .html .inc .php4 .php3
           AddType application/x-httpd-php-source .phps
            => 즉 mime.types의 수정없이 mime을 설정가능하게 해준다.

     - #AddHandler cgi-script .cgi
        => 특정 파일 확장자나 처리기에 연결하거나 특정 파일 타입에 특정 동작 연결을 설정하는
          부분이다. 즉, 어떤 파일 확장자를 파일 종류와 무관하게 작동할 수 있게 "Hander"에 결
          합되도록 설정해 주는 것이다.

     - # Format: Action media/type /cgi-script/location
       # Format: Action handler-name /cgi-script/location
        => 매칭되는 파일이 불려질 때마다 해당 미디어 타입에 맞는 스크립트를 실행할 수 있으며,
          이 설정은 자주 사용되는 CGI 파일 프로세서에 대해 반복적으로 URL을 사용하지 않아도
          된다.

     - # Customizable error responses come in three flavors:
       # 1) plain text 2) local redirects 3) external redirects
       #
       # Some examples:
       #ErrorDocument 500 "The server made a boo boo."
       #ErrorDocument 404 /missing.html
       #ErrorDocument 404 "/cgi-bin/missing_handler.pl"
       #ErrorDocument 402 http://www.example.com/subscription_info.html

         => 존재하지 않는 페이지를 요청받을 경우 또는 해당 디렉토리의 퍼미션이 없을 경우 보여
           주는 에러 메시지설정이다. 관리자 임의로 다음 3가지 중 선택해서 출력해 줄 수 있다.
             1) plain text - 보통 텍스트 화면
             2) local redirects - 내부 URL로 방향 전환
             3) external redirects - 외부 URL로 방향 전환
           또한 각 에러에 대한 문서전달 방법을 예이다. 아파치 1.3버전에서는 큰따옴표(") 하나로
           오류 메시지를 전달하였으나 2.0버전에서부터는 양쪽으로 큰따옴표를 붙여 사용한다.

     - BrowserMatch "Mozilla/2" nokeepalive
       BrowserMatch "MSIE 4\.0b2;" nokeepalive downgrade-1.0 force-response-1.0
        => HTTP 응답 방식을 수정한다. 첫번째 지시자는 Netscape 2.x와 유사한 브라우저에 대해
          KeepAlive기능을 사용하지 못하게 하는 설정이다. 두번째 지시자는 HTTP/1.1을 잘못 구현
          한 301,302(redirect)응답에 대해 KeepAlive를 제대로 지원하지 못하는 MS Explorer 4.0b2
          를 위한 설정 등이다.

     - BrowserMatch "RealPlayer 4\.0" force-response-1.0
       BrowserMatch "Java/1\.0" force-response-1.0
       BrowserMatch "JDK/1\.0" force-response-1.0
         => HTTP/1.1 응답도 제대로 처리하지 못해 HTTP/1.1 spec를 위반하는 브라우저에 대해
           HTTP/1.1응답을 하지 않게 하는 설정이다.

     - #<Location /server-status>
       #    SetHandler server-status
       #    Order deny,allow
       #    Deny from all
       #    Allow from .your-domain.com
       #</Location>
         => 서버 상태정보를 허용할 서버이름을 적어준다. 이 설정을 하면 웹브라우저를 이용하여
           http://localhost/server-status 라고 입력하면 웹서버의 상태를 파악할 수 있다.

     - #<Location /server-info>
       #    SetHandler server-info
       #    Order deny,allow
       #    Deny from all
       #    Allow from .your-domain.com
       #</Location>
         => 원격 서버의 환경 설정을 보고받을 수 있다. 주의할 점은 mod_info.c가 로드되어 있어야
           한다. http://localhost/server-info 라고 입력하면 서버의 환경 설정을 확인할 수 있다.

     - #    ProxyVia On
        => HTTP/1.1 "Via:"헤더를 처리할 지 여부를 설정하는 부분이다. 옵션에는 Off | On | Full
          | Block 등이 있으며 Full은 서버 버전을 포함하며, Block은 나가는 모든 자료에 "Via"를
          제거한다.

     - #    CacheRoot "/usr/local/apache/proxy"
       #    CacheSize 5
       #    CacheGcInterval 4
       #    CacheMaxExpire 24
       #    CacheLastModifiedFactor 0.1
       #    CacheDefaultExpire 1
       #    NoCache a-domain.com another-domain.edu joes.garage-sale.com
        => 캐쉬 기능을 enable하기 위해서는 #을 제거한다.


    ### Section 3: Virtual Hosts : 가상 도메인을 설정하는 부분으로 웹호스팅할 경우에 설정한다.
     -NameVirtualHost : 한 서버에서 여러도메인을 사용할 경우 설정해야 한다.
     예) 192.168.1.125라는 IP하나를 가지고 서버를 구축하여 abc.co.kr이라는 도메인을 웹호스팅
        할 경우의 설정
        NameVirtualHost 192.168.1.125
        ------------------------------------
       <VirtualHost 192.168.1.125>
          ServerAdmin admin@abc.co.kr
          DocumentRoot /home/abc/www
          ServerName www.abc.co.kr
          ServerAlias *.abc.co.kr                   // abc.co.kr앞에 붙는 모든 2차도메인을 모
                                                    //두 abc.co.kr이라는 홈페이지가 열리도록
                                                    //설정을 할 때 쓴다.
          ErrorLog logs/abc-error-log
          CustomLog logs/abc-access_log common
       </VirtualHost>

4. apache의 실행
(1) 데몬파일을 이용한 실행
  /usr/local/apache/bin/httpd stop 한 후에 /usr/local/apache/bin/httpd start한다.
   또는
  /usr/local/apache/bin/httpd restart
(2) 스크립트파일을 이용한 실행(권장)
  /usr/local/apache/bin/apachectl stop 한 후에 /usr/local/apache/bin/apachectl start한다.
   또는
  /usr/local/apache/bin/apachectl restart
(3) 부팅할 때마다 자동적으로 실행하도록 설정하기
  /etc/rc.d/rc.local파일에 /usr/local/apache/bin/apachectl start라고 추가한다.

5. httpd명령의 사용
(1) 사용법
   httpd [option] [command] [file_name]
(2) option
   -t : 환경파일인 httpd.conf의 파일설정을 점검한다.
   -f : 새로 설정한 conf파일이 있을 경우 그 설정파일로 아파치 데몬을 띄운다.
   -S : 현재 시스템에 설정되어 있는 가상 호스트를 보여준다.
   -l : 현재 컴파일된 모듈에 대한 목록을 보여준다.
(3) 사용예
   1) /usr/local/apache/bin/httpd -t  => 문법적으로 httpd.conf의 파일 설정을 점검한다.
      Syntax OK                       => 아무 이상이 없음을 나타낸다.
   2) /usr/local/apache/bin/httpd -f httpd_test.conf => httpd_test.conf파일의 설정대로 데몬을
                                                       띄운다.
   3) [root@linux245 root]# httpd -l
      Compiled in modules:
        core.c
        prefork.c
        http_core.c
        mod_so.c

(참고) apachectl 스크립트를 이용한 httpd.conf파일의 설정 점검
/usr/local/apache/bin/apachectl configtest

6. apache의 확인
(1) 데몬의 확인 : 아파치데몬이 떠 있는지 확인한다.
   [root@house apache]# ps -aux |grep httpd 또는 ps -aux |grep apache
    root      1515  0.0  1.2  3464 1652 ?        S    23:22   0:00 /usr/local/apache
    nobody    1516  0.0  1.6  3748 2064 ?        S    23:22   0:00 /usr/local/apache
    nobody    1517  0.0  1.3  3548 1720 ?        S    23:22   0:00 /usr/local/apache
    nobody    1518  0.0  1.3  3548 1720 ?        S    23:22   0:00 /usr/local/apache
    nobody    1519  0.0  1.3  3548 1720 ?        S    23:22   0:00 /usr/local/apache
    nobody    1520  0.0  1.3  3548 1720 ?        S    23:22   0:00 /usr/local/apache
    nobody    1523  0.0  1.3  3552 1740 ?        S    23:22   0:00 /usr/local/apache
     => 어떠한 명령을 가지고 실행했느냐에 따라 달라진다. 만약 정상적으로 작동한다면 아파치데몬
       의 리스트를 보여준다. 웹서비스 프로세스들은 초기에 구동된 httpd 데몬 1개만 root권한이고
       나머지는 nobody권한으로 데몬이 실행된다. 일반사용자들이 웹브라우저를 통해서 연결되는
       데몬은 nobody권한의 httpd이다.

7. 가상호스트(VirtualHost) 구성하기
(1) 설명: 서버를 구성하면 하나의 IP주소에 하나의 도메인이 부여되어 웹서버를 구성하게 된다.
          가상호스트란 하나의 IP주소를 가진 서버에 또 다른 여러 도메인이 부여되어 각각의 웹페
          이지를 보여주게 하는 것을 말한다.
(2) httpd.conf의 가상호스트 구성
   1) 개요: httpd.conf의 가상호스트는 이 파일의 마지막 부분인 'Section 3: Virtual Hosts'라는
           부분에서 설정하면 된다.
   2) 기본구성
    ㄱ. 기본예
       #NameVirtualHost *

       #<VirtualHost *:80>
       #    ServerAdmin webmaster@dummy-host.example.com
       #    DocumentRoot /www/docs/dummy-host.example.com
       #    ServerName dummy-host.example.com
       #    ErrorLog logs/dummy-host.example.com-error_log
       #    CustomLog logs/dummy-host.example.com-access_log common
       #</VirtualHost>
    ㄴ. 주요항목설명
      a. NameVirtualHost *
          => 하나의 IP주소로 이름기반 가상호스트를 할 경우에 사용한다. 기본적으로 주석처리가
            되어 있는데, 주석을 제거하고 *부분에 IP주소를 적으면 된다.
      b. <VirtualHost *> ~ </VirtualHost>
          => 가상호스트를 지정하는 태그이다. 이 태그안에 가상호스트관련 설정을 하면 된다.
      c. ServerAdmin webmaster@dummy-host.example.com
          => 해당도메인을 관리하는 관리자 이메일주소를 적는부분이다.
      d. DocumentRoot /www/docs/dummy-host.example.com
          => 기본 웹문서가 위치하는 디렉토리를 적는다.
      e. ServerName dummy-host.example.com
          => 도메인을 적는다.
      f. ErrorLog logs/dummy-host.example.com-error_log
          => 에러로그를 기록할 파일을 적는다.
      g. CustomLog logs/dummy-host.example.com-access_log common
          => 접속기록등 일반적인 로그를 기록할 파일을 적는다.
      h. ServerAlias *.example.com
          => 지정한 기본 도메인이외에 또 다른 호스트네임도메인을 적을 때 사용할 수 있다.
            조회하는 서브 도메인에 대하여 resolving이 되어야 한다.
            보통 ServerName항목과 연동해서 사용한다.
              예) ServerName    linux.co.kr
                  ServerAlias   www.linux.co.kr
(3) 실습
   1) 개요: 리눅스에서는 임의의 도메인을 가지고 DNS보다 먼저 참조하는 /etc/hosts를 이용하여
           가상호스트를 실습할 수 있다.
   2) 조건
    ㄱ. 서버로 사용할 IP주소를 192.168.10.120이라고 가정한다.
    ㄴ. 주 도메인을 www.linux.com이라 하고, 웹문서는 기본 웹문서가 위치하는 /usr/local/apache/
       htdocs에 위치시킨다.
    ㄷ. 추가로 구성할 도메인을 www.flower.com이라 하고, 이 도메인의 웹문서는 flower라는 계정
       사용자의 기본 홈디렉토리인 /home/flower/public_html로 지정한다.
    ㄹ. 로그는 각각의 도메인을 포함하여 구성한다. 즉 www.linux.com은 linux.com-access_log로
       하고, www.flower.com은 flower.com-access_log로 구성한다.
   3) 아래와 같이 미리 작업을 하도록 한다.
     [root@www root]# vi /etc/hosts
     # Do not remove the following line, or various programs
     # that require network functionality will fail.
     127.0.0.1       linux224        localhost.localdomain   localhost
     192.168.10.120  www.linux.com
     192.168.10.120  www.flower.com
     192.168.10.120  flower.com
(4) 구성하기
    [root@www root]# vi /usr/local/apache/conf/httpd.conf
    NameVirtualHost 192.168.10.120:80

    <VirtualHost 192.168.10.120:80>
    ServerAdmin webmaster@linux.com
    DocumentRoot /usr/local/apache/htdocs
    ServerName www.linux.com
    ServerAlias *.linux.com            // resolve가 되어야 한다.
    ErrorLog logs/linux.com-error_log
    CustomLog logs/linux.com-access_log common
    </VirtualHost>
    <VirtualHost 192.168.10.120:80>
    ServerAdmin flower@flower.com
    DocumentRoot /home/flower/public_html
    ServerName www.flower.com
    ServerAlias flower.com            // resolve가 되어야 한다.
    ErrorLog logs/flower.com-error_log
    CustomLog logs/flower.com-access_log common
    </VirtualHost>
(5) 테스트
    [root@www root]# /usr/local/apache/bin/httpd -S
    VirtualHost configuration:
    192.168.10.120:80      is a NameVirtualHost
                           default server www.linux.com (/usr/local/apache/conf/httpd.conf:947)
                           port 80 namevhost www.linux.com (/usr/local/apache/conf/httpd.conf:947)
                           port 80 namevhost www.flower.com (/usr/local/apache/conf/httpd.conf:954)

출처 : 대전국제IT교육센터 정성재 강사

 

1. IP 주소와 도메인
  인터넷에 연결된 수많은 서버와 클라이언트 컴퓨터는 각자 고유한 IP주소를 가지고 있는데 이 IP는
오직 자기만의 주소이다. 주민등록번호가 다르듯이 IP주소도 똑같은 경우가 없다. IP는 숫자로 된
배열로 되어있는데(IP에 대해서는 네트워크 책 참조), 많은 수의 갯수를 외우기는 상당히 어렵다.
따라서, 알기 쉽게 등장한 것이 도메인 네임이다.

2. DNS서버에 대하여
우리는 흔히 특정한 사이트에 접속하기 위해 도메인이름을 입력한다. 그러나 실제적으로 인터넷은
IP주소기반이기 때문에 해당사이트의 IP주소를 알아야 한다. 이 때 우리가 이용하는 것이 네임서버
이다. 네임서버는 특정한 클라이언트로부터 특정한 도메인에 대한 요청이 왔을 경우 Root 네임서버와
다른 네임서버로 부터 정보를 얻어 요청한 도메인에 대한 IP주소를 알려주는 역할을 한다. 또한 각각
의 도메인네임서버들은 2차도메인도 부여하고, 다른 서버로부터 오는 도메인에 대한 요청도 응답한다.



3. DNS서버의 종류와 역할
(1) 설명: DNS서버는 크게 Primary서버, Secondary서버, Caching Only서버로 나뉜다. 자신의
          도메인을 가지기 위해서는 가장 기본이 되는 것이 Primary서버이고, Secondary서버 및
          Caching Only서버는 보조 및 백업 서버 혹은 속도를 빠르게 하기 위해서 필요한 서버이다.
          일반적으로 Secondary서버는 Primary 서버가 다운되었을 경우를 대비해 백업할 경우에
          사용하고,  Caching Only서버는 기간망간의 캐싱을 위해서 사용한다.
(2) 종류와 역할
   1) Primary Name Server: 도메인 네임서버 사용시에 꼭 구축해야 하고, 보통 Master DNS라고
                          부른다.
   2) Secondary Name Server: 주 도메인서버인 Master DNS의 백업을 담당하고 Slave DNS라고
                            부른다. 반드시 구축할 필요는 없다.
   3) Caching Only Server: 서버에 기록된 정보가 요청이 올 경우에 응답해주는 서버이다. 즉 한번
                          요청한 정보를 서버에 기록해 두었다가 다시 동일한 요청이 왔을 때 직접
                          조회하지 않고 바로 응답하도록 해주는 서버이다.

4. 네임서버 구축의 개요
(1) 개요: 네임 서버를 운영하기 위해서는 서버에서 도메인 네임 서비스를 수행하는 프로그램을 설
          치해야 한다. Red Hat은 BIND(Berkeley Internet Name Domain)이라는 DNS서버용
          소프트웨어(데몬)을 제공한다. 또한 이 네임서버의 데몬이름은 named이다.
(2) RedHat Linux와 rpm 패키지
   RedHat Linux는 3개의 rpm패키지로 제공한다. DNS 서버관련 패키지는 bind 및 bind-utils이고,
  기본 환경설정파일 관련 패키지는 caching-nameserver로 제공이 된다.
(3) bind관련 파일 및 디렉토리
   1) 주환경설정파일
     /etc/named.conf
      => named데몬이 작동할 때 처음으로 참조하는 파일로 환경설정과 밀접한 관련이 있다.
        이 파일에서는 도메인별 zone파일을 지정하는 역할을 주로 한다.
   2) 시스템 부팅시 자동 실행 스크립트 파일
     /etc/rc.d/init.d/named
      => named데몬을 실행시킴에 있어 최적화시킨 파일이다. 네임서버를 작동시키고 중단시킬 때
        사용한다. 보통 stop, start, restart, reload 등의 인자값을 사용하는데, DNS에서는
        restart하면 caching정보가 사라지므로, 보통 reload를 많이 사용한다.
   3) /var/named 디렉토리: 루트 도메인 서버에 대한 정보가 담긴 zone파일인 named.ca와
                          localhost에 대한 zone파일인 localhost.zone, reverse zone파일인
                          named.local 파일 등 도메인 설정을 위한 zone파일이 위치하는
                          디렉토리이다.
   4) localhost와 루트 네임서버 정보 데이터베이스파일
    ㄱ. /var/named/named.ca       : 루트(.) 네임서버에 대한 정보가 있는 데이터베이스 파일이다.
    ㄴ. /var/named/localhost.zone : 리눅스 시스템에 부여되는 호스트이름인 localhost에 대한
                                   zone파일로 일종의 sample파일이라고 보면 된다.
    ㄷ. /var/named/named.local    : localhost의 Reverse zone파일이다. Reverse zone파일 구성을
                                   위한 sample파일이라고 볼 수 있다.
(4) DNS 설정하기
   1) 설명: DNS설정에서 핵심은 named.conf파일과 존파일이다. 이 두 가지의 파일을 설정하면 된다.
           존파일의 이름은 관리자가 임의로 부여하여 사용할 수 있다. named.conf 파일이
           DNS설정의 뼈대이고, 실제 서버의 내용은 존파일에 기록한다.
   2) 역할
    ㄱ. /etc/named.conf: 서버에서 사용하는 도메인별로 존파일을 지정한다. 리버스존파일의 선언도
                        해준다.
    ㄴ. zone파일: named.conf파일에서 지정한 경로에 파일을 정해진 포맷으로 만든다. 이 존파일의
                 역할은 2차도메인 부여 등 사용하는 도메인에 대해 주 설정을 담당한다.

5. /etc/named.conf파일
(1) 파일의 구성과 특징
   1) 파일의 구성은 크게 주석문과 구문으로 구성되어 있다.
   2) 기본구문은 DNS서버 구동시 꼭 필요하므로 지우지 않도록 한다.
   3) 주석은 실제 내용의 설정과 관계없이 설명 등을 붙힐 때 사용한다. 주석은 C나 C++에서 사용하
     는 스타일과 같다.
      예) // => 한줄정도의 주석을 달 경우, 또는 '#'도 사용가능하다.
          /*  */  => 여러라인의 주석을 달 경우 사용한다.
   4) 각 설정은 세미콜론(;)으로 한다.
(2) 기본설정
    // generated by named-bootconf.pl
    options {
            directory "/var/named";
            /*
             * If there is a firewall between you and nameservers you want
             * to talk to, you might need to uncomment the query-source
             * directive below.  Previous versions of BIND always asked
             * questions using port 53, but BIND 8.1 uses an unprivileged
             * port by default.
             */
            // query-source address * port 53;
    };

    //
    // a caching only nameserver config
    //
    controls {
        inet 127.0.0.1 allow { localhost; } keys { rndckey; };
    };
    zone "." IN {
            type hint;
            file "named.ca";
    };

    zone "localhost" IN {
            type master;
            file "localhost.zone";
            allow-update { none; };
    };

    zone "0.0.127.in-addr.arpa" IN {
            type master;
            file "named.local";
            allow-update { none; };
    };
    include "/etc/rndc.key";
(3) Options
   1) 설명: 네임서버가 동작함에 있어 필요한 여러가지 설정을 하는 영역이다. 네임서버에 쓰이는
           존파일의 위치를 적는 directory 항목은 꼭 적어야 한다.
   2) 항목
    ㄱ. directory "/var/named";
         => 네임서버에서 데이터베이스 역할을 하는 존(zone)파일의 위치를 설정한다. 보통 기본값
           으로 /var/named 디렉토리가 지정된다.
    ㄴ. dump-file "/var/tmp/named_dump.db";
         => named는 정보가 갱신될 때 dump파일로 저장하는데 그 덤프파일이 생성될 위치와 파일명
           을 지정한다.
    ㄷ. statistics-file "/var/tmp/named.stats";
         => 네임서버의 통계를 낼 경우에 사용하는 옵션으로 메모리 통계 파일을 생성할 위치와
           파일명을 지정한다.
    ㄹ. forward (only|first);
         => 보통 forwarders 옵션과 함께 사용되며, only나 first 두 값 중 하나를 갖는다. only는
           자신에게 들어온 도메인 질의를 지정한 다른 서버로 넘기도록 하는 것으로 다른 서버가
           그에 대한 응답이 없을 경우 그 자신도 그 질의에 대해 응답하지 않을 경우에 설정한다.
           first는 타 서버에서 응답이 없을 때 자신이 응답하도록 할 때 설정한다.
    ㅂ. forwarders { 네임서버주소1; 네임서버주소2;....};
         => 도메인에 대한 질의를 다른 서버로 넘길 때 사용하는 옵션으로 복수 형태로
           지정가능하고 구분은 세미콜론(;)으로 한다.
    ㅅ. allow-query { 192.168.0/24; };
         => 네임서버에 질의할 수 있는 호스트를 지정한다. 위와 같이 지정하면 192.168.0.0 네트
           워크주소를 가진 호스트만이 질의할 수 있다.
    ㅇ. allow-transfer { 192.168.0/24; };
         => zone 파일의 내용을 복사할 대상에 제한을 걸 때 지정한다. 이 항목을 명기하지 않았을
          경우 기본적으로는 제한이 없다.
   3) 참고: ACL
    ㄱ. 설명: ACL이란 Access Control List의 약자로 여러 호스트를 하나의 명칭으로 지정하여
             사용하는 방법이다. allow-query나 allow-transfer 사용시 ACL을 이용하여 리스트를
             만든 후 사용가능하다.
    ㄴ. 사용예
        acl  "accesslist" { 192.168.0/24; 192.168.1.20; };
    ㄷ. 주의점: acl의 선언은 options {  }; 이전에 해야 한다.
   4) 사용예
     acl "member" { 210.96.52.100; 203.247.40/24; 211.58.96.100; };
     options {
             directory "/var/named";
             allow-transfer { 203.247.50/24; 203.247.51.30; };
             dump-file "/var/named/named_dump.db";
             statistics-file "/var/named/named.stat";
             forward only;
             forwarders { 203.247.32.31; };
             allow-query { 203.247.50/24; 203.247.51.33; member; };
     };
(4) zone 구문
   1) 설명: 실제적으로 도메인을 관리하는 데이터베이스파일인 zone파일을 지정한다. 이 zone구문
           은 크게 master, slave, hint(캐쉬서버)의 세가지 타입이 있다. 위의 예에서 보면
           zone "."이라는 항목이 있다. "."는 가장 상위도메인을 나타낸다. (참고로 말하면 원칙적
           으로 도메인을 칠때는 맨뒤에 "."을 붙여야 한다. 예를 들면 다음과 같이 "www.linux.co.
           kr."해야 한다. 그러나, 보통은 생략해서 사용해도 된다.) 도메인을 찾을 때는 가장 상위
           도메인서버에서 차례대로 트리구조형태로 찾는다. 또한 참조하는 파일인 named.ca는 일종
           의 캐시파일로서 인터닉(Internic)에서 배포하는 파일이므로 그 부분은 수정해서는 안된
           다. Reverse zone파일도 설정할 수 있다. Reverse zone 파일이란 IP를 도메인으로 변경하
           기 위해서 필요한 존파일이다. 몰론 설정안해도 무방하다. 또한 zone "0.0.127.in-addr.
           arpa"는 로컬호스트에서의 Reverse 파일에 관한 부분으로 이 부분 역시 설정그대로 둔다.
   2) 기본설정형식
     zone "도메인이름" {
       type (master | slave | hint);
       file "존파일이름";
       allow-update { none; };
     };
   3) 항목설명
    ㄱ. 도메인이름
      a. 설명: 일반적으로 해당 도메인이름을 적는다. 그 외에 "."은 캐시서버를 의미하고,
              리버스존파일의 선언은 "0.0.127.in-addr.arpa" 형태로 한다.
      b. 설정예
        1. zone "linux.co.kr"
        2. zone "50.247.203.in-addr.arpa"
    ㄴ. type
      a. 설명: type은 1차 네임서버와 2차 네임서버의 종류를 구분할 때 사용한다. 값에는master,
             slave, hint가 오는 데 이것은 DNS서버의 종류중에서 primary, slave, cache only
             서버를 뜻한다.
      b. 설정예
        1. type master;
            => Primary Name Server를 뜻한다.
        2. type slave;
           masters { primary_Name_Server_IP주소; };
    ㄷ. file
      a. 설명: 사용하고자할 존파일의 이름을 적는다. 보통 "도메인명.zone"으로 설정하고 리버스
              존파일인 경우에는 "도메인명.rev"로 설정한다.
      b. 설정예
        1. file "mybestone.zone";
        2. file "mybestone.rev";
    ㄹ. allow-update
      a. 설명: bind 9버전부터 등장한 항목으로 이 지시자는 아래의 Key설정영역과 함께 작동한다.
              역할은 Primary Name Server의 zone정보가 Slave Name Server에 업데이트될 때 사용
              한다. 이 지시자는 Primary Name Server와 Slave Name Server간에 인증을 위한 공유가
              설정되어 있어야 하고, 만약 공유키를 지정하지 않고, IP주소로 Slave Name Server를
              지정하고자 한다면 Slave Name Server의 IP주소를 적으면 된다. 물론 Slave Name Ser
              ver를 운영하지 않는다면 필요없는 항목이다.
      b. 설정예
        1. allow-update { key 공유키; };
        2. allow-update { 192.168.0.100; };
   4) 설정예:  도메인이 linux.co.kr이고, IP주소가 192.168.0.2인 경우
    ㄱ. zone파일지정(linux.zone)
       zone "linux.co.kr" {
              type master;
              file "linux.zone";
       };
    ㄴ. 리버스 zone파일지정
       zone "0.168.192.in-addr.arpa" {
             type master;
             file "linux.rev";
       };
(5) Key 설정 영역
   1) 설명: Bind 9 버전에 새롭게 추가된 보안 설정 영역으로 다른 서버에 존 설정관련 데이터들이
           전달될 때 서버 인증에 필요한 공유키를 설정하는 영역이다. 키 이름은 임의로 설정할 수
           있으나, 공유키 생성시에 지정한 키 이름과 같이 생성해야 한다. 역시 원격서버로 zone파
           일을 백업하지 않는다면 필요하지 않다.
   2) 기본구조
     key 키이름 {
           algorithm       알고리즘방식지정;
           secret          공유키값;
     };
      => bind 9에서는 HMAC-MD5알고리즘을 사용하고 공유키값은 dnssec-keygen이라는 것에 의해
        생성된다.
   3) 키생성
    ㄱ. 설명: Bind 9 에서는 RSA, DSA, HMAC-MD5 알고리즘중에서 HMAC-MD5만 지원한다. -a옵션으로
            알고리즘을 지정하고 -b 옵션으로 암호길이를 지정하면 된다. 최고 512bit로 지정할 수
            있다. -n HOST 뒤에 두 네임서버간의 공유키이름을 지정한다.
    ㄴ. 사용법
       dnssec-keygen -a hmac-md5 -b 128 -n HOST 키이름
    ㄷ. 사용예
       [root@www root]# dnssec-keygen -a hmac-md5 -b 128 -n HOST posein
       Kposein.+157+57372
       [root@www root]# ls K*
       Kposein.+157+57372.key  Kposein.+157+57372.private
        => 두 개의 키가 생성되는 데 두 키 가운데 하나를 선택하여 에디트하면 다음의 내용을 볼
          수 있다.
       [root@www root]# cat Kposein.+157+57372.key
       posein. IN KEY 512 3 157 6BPkem9J9/JOtfnWQ6Eahw==
        => 위의 내용을 편집해서 만들면 된다.
           key "posein" {
                 algorithm           "hmac-md";
                 secret              "6BPkem9J9/JOtfnWQ6Eahw==";
           };
(6) controls 설정 영역
   1) 설명: 이 영역은 rndc 유틸리티에 의해서 네임서버에 명령을 전달하여 네임서버를 구동시킬 때
           사용되는 제어 채널을 설정하는 부분이다.
   2) 기본구조
     controls {
        inet 127.0.0.1 allow { localhost; } keys { rndckey; };
     };
   3) 사용법
     inet 아이피주소 포트 allow { 허가주소; } keys { 키이름; };
   4) 사용예
    ㄱ. inet 127.0.0.1 allow { localhost; } keys { rndckey; };
      => 아이피주소 다음에 포트를 지정하지 않을 경우 기본값인 953으로 지정된다. allow 다음에
        설정한 localhost에서만 가능하고 키이름은 rndckey를 가진 경우에만 가능하다.
    ㄴ. inet * allow { any; } keys { key_list; };
      => *는 포트를 사용하지 않음을 나타내고, key_list라는 키를 가진 모든 호스트에서 가능하다.
(7) include "/etc/rndc.key" 설정 영역
    rndc라는 유틸리티의 접속을 위한 키설정부분이다. 이 내용은 /etc/rndc.key의 내용을 그대로
   가져와 control 영역의 키로 사용한다는 뜻이다.

6. 존(zone)파일
(1) 개요: 존파일은 /etc/named.conf의 정의하에 /var/named에 위치한다. /etc/named.conf에 정의된
          zone파일인 'named.ca', 'localhost.zone', 'named.local'는 BIND설치시 기본적으로
          제공해 주는 파일로, DNS 서버의 주 역할인 Resolving을 할 수 있도록 해주고(named.ca),
          개별 도메인 설정을 위한 샘플 파일같은 역할을 해준다.(localhost.zone, named.local)
          도메인을 설정하기 위해서는 zone 파일을 사용자가 지정해줘야 하는데, 임의로 생성하면
          된다. 예를 들면 linux.zone과 linux.rev 형태로 지정할 수 있는데, linux.zone파일은
          기본적인 도메인을 위해 필요한 것이고, linux.rev파일은 IP를 도메인으로 바꿔주는 역할
          (보통 Reverse라고 표현)을 하는 존파일이다. 물론 이 리버스 파일은 설정 안해도
          상관없다.
(2) 존파일의 역할: 사용하는 메인 도메인뿐만아니라, 2차 도메인을 관리하는 역할을 한다. 예를
                   들면 linux.co.kr이라는 도메인을 사용할 경우 2차도메인으로 game.linux.co.kr,
                   edu.linux.co.kr등을 사용할 수 있는데, 이러한 2차도메인의 지정을 담당하는
                   파일이다.
(3) 존파일의 구성
   1) 구성: 존파일은 도메인에 대한 실제적인 DNS정보를 담는 파일이다. 이 파일은 크게 SOA record
           와 실제내용으로 나뉜다.
   2) 기본구조
     $TTL    86400
     @ IN SOA nameserver contact-email-address (
     serial_number  ; Serial
     refresh_number ; Refresh
     retry_number   ; Retry
     expire_number  ; Expire
     minium_number  ; Minimum
     )
     [도메인] [ttl] [class] [type] [rdata]
   3) 항목설명
    ㄱ. $TTL: Time To Live의 약자로 bind 9 버전에서부터는 첫줄에 무조건 적도록 되어있다. TTL
             은 다른 서버에서 자신의 정보를 가져갔을 경우 그 쪽 서버의 캐시에 해당 정보가 얼
             마나 머물지를 결정한다. 값은 0~2147483647까지 가능하며, 단위는 초단위로 보통
             86400(1일)을 설정한다.
    ㄴ. SOA record : SOA(Start of Authority) 레코드는 zone의 시작을 가리키는 데 사용한다. 설정
                    시에 주석이 필요하면 세미콜론(;)을 입력하고 뒤에 문자열을 적는다.
      a. 맨 앞의 '@'는 현재 도메인을 나타낸다. 처음은 이것으로 시작한다.
      b. nameserver는 네임서버의 호스트명과 도메인명을 기록한다.그리고 마지막은 꼭 루트도메인
        을 뜻하는 '.'을 찍는다. 그러나 호스트명만을 입력할 때는 '.'을 생략할 수 있다.
         예) 도메인이 'linux.co.kr'인 경우 다음의 두 경우는 같다.
            ns                     IN           A          203.xxx.xxx.xxx
            ns.linux.co.kr.        IN           A          203.xxx.xxx.xxx
      c. contact-email-address는 관리자의 e-mail주소를 적는다. 일반적인 표기법은 'root@domain.
        com'이라고 표기하지만, 여기서는 'root.domain.com.'이라고 표기한다. 이 부분도 뒤에 꼭 
        '.'를 붙인다.
      d. serial_number : 일련번호로서 만약 도메인 데이터베이스가 갱신되어지면 숫자가 더 크도록
                        수정한다. 일반적으로 'YYYYMMDDNN'의 형식을 사용한다.'YYYYMMDD'는 해당
                        년월일을 적고, 'NN'은 수정한 횟수를 적어주면 된다.
      e. refresh_number : 2차 네임서버가 자신의 정보를 업데이트하기 위해서 1차네임서버에 얼마
                         나 자주 체크할 것인가를 설정하는 항목이다.
      f. retry_number : 만약 2차 네임서버가 1차 네임서버에 접속을 실패했을 경우 재시도할 시간
                       을 설정한다.
      g. expire_number : 2차 네임서버가 자신의 zone데이터를 사용할 수 있는 유효기간을 정한다.
      h. minimum_number : 데이터의 저장한도를 나타낸다. 시간들의 단위는 초단위이다.
        (참고) 2차 네임서버를 운영하지 않는다면 serial_number등의 항목은 무의미하다. 또한
              최근에 값설정시에 초단위값 대신에 W(weeks), D(Days), H(Hours), M(Minutes) 붙여
              사용해도 된다.
    ㄷ. [도메인] [ttl] [class] [type] [rdata]
      - 도메인: 도메인이름, 호스트명, 공백, @, * 등이 올 수 있다. @는 현재 도메인을 가리키고,
               *는 모든 도메인을 뜻한다. 호스트명만 기입하면 "호스트명.도메인이름"로 인식한다.
               공백은 바로 위 자원을 이어서 사용하고, 전체 도메인으로 지정시에는 반드시 도메인
               이름 맨 뒤에 꼭 맨 뒤에 '.'을 붙여야 한다.
      - ttl : 해당 레코드에 대한 TTL을 설정한다. 생략해도 무방하다.
      - class: 레코드에 대한 클래스를 지정하는 부분으로 일반적으로 Internet 클래스인 IN을 사용
             한다.
      - type: 레코드 타입을 지정한다.(A, MX 등)
      - rdata: 실제정보를 입력한다.
    ㄹ. type
      a. NS : Name Server를 지정한다.
        1. 사용법
          IN NS name_server_hostname
        2. 사용예
          IN NS ns.linux.co.kr.
      b. A : Address, 즉 특정호스트명에 대한 IP주소를 입력한다. 실제의 도메인 데이터베이스를
            구축하는 항목이다.
        1. 사용법
          hostname IN A IP_address
        2. 사용예
          www.linux.co.kr.      IN       A        211.36.134.226
      c. PTR : Domain Name Pointer, 이것은 위와 반대로 IP주소를 도메인으로 변환할 때 사용되는
              타입으로 reverse zone에서만 사용한다.
        1. 사용법
          IP_address           IN       PTR      hostname
        2. 사용예
          252     IN      PTR     mybestone.com.
        3. 참고: 이것은 꼭 안써주어도 상관은 없지만, 어떤 인터넷 서비스는 특정 호스트를 인증할
                때 IP역추적을 통해서 도메인이 등록이 되어 있는지를 인증하는 경우가 있다. 이때
                에는 이 항목을 사용하여야 한다.
      d. CNAME : Canonical Name 레코드이다. 일종의 Alias(별칭)을 의미한다.
        1. 사용법
          Alias  IN CNAME Canonical-hostname
        2. 사용예
          www                     IN A            192.168.3.224

          www1                    IN CNAME www
          www2                    IN CNAME www
      e. MX : Mail Exchanger의 약어로 일종의 Fowarding개념으로, 특정 도메인(호스트)에 대해서
             메일을 다른 메일서버로 보내게 된다.
       1. 사용법
         (도메인명 또는 호스트)      IN       MX       preference value     (메일서버)
          => 여기서 preference value는 '0'또는 양의 정수값이다. 여러개의 값이 존재할 경우에는
            낮을수록 우선권이 높다.
       2. 사용예 : linux.co.kr이라는 도메인으로 메일을 받을 경우
            IN    MX    10    linux.co.kr.
       3. 응용예 : 두개의 메일서버를 구축했을 경우
         IN     MX    10       mail
         IN     MX    20       mail2
         => 위의 예제는 이메일이 도착할 경우에는 먼저 mail서버로 먼저 보내고, 응답이 없을경우
           에는 mail2서버로 이메일을 보낸다. mail서버를 하나만 구축했을 경우에는 큰 의미가
           없다.
      f. HINFO: Host INFOrmation의 약자로 호스트정보를 제공할 때 쓴다.
       1. 사용법
         www    IN    HINFO     CPU정보    운영체제정보
       2. 사용예
         www    IN    HINFO     "i686"    "RedHat 9"
   4) 설정예: 여기서는 /etc/named.conf파일에서 존파일을 linux.zone으로 지정하고 Reverse 존파일
             을 linux.rev로 지정했다고 가정하자.
      예) 도메인이 linux.co.kr이고 IP가 192.168.0.2인 경우 다음과 같이 설정한다.
         1.linux.zone
          $TTL    86400
          @       IN      SOA     ns.linux.co.kr. root.linux.co.kr.  (
                                      2001022200 ; Serial
                                      28800      ; Refresh
                                      14400      ; Retry
                                      3600000    ; Expire
                                      86400 )    ; Minimum
               IN      NS      ns.linux.co.kr.
        linux.co.kr.           IN    A    192.168.0.2
                               IN    MX    10    linux.co.kr.
        www.linux.co.kr.       IN    A    192.168.0.2
       (주의) 이 파일을 설정시에는 도메인 네임뒤에 루트를 뜻하는 '.'을 꼭 찍어야 한다. 또한
            이 파일에서 도메인 네임을 설정한 것만 접속이 된다.
       (참고) 여기에서 @는 origin을 뜻하는 특수 문자이다. 즉 메인도메인인 'linux.co.kr'를 의
             미한다. 또한 linux.co.kr이라는 도메인으로 메일을 받는다.
         2. linux.rev
           @       IN      SOA     ns.linux.co.kr. root.linux.co.kr.  (
                                      2001022301 ; Serial
                                      28800      ; Refresh
                                      14400      ; Retry
                                      3600000    ; Expire
                                      86400 )    ; Minimum
                      IN      NS      ns.linux.co.kr.
          2               IN      PTR     ns.linux.co.kr.
          => 윗부분의 설정은 linux.zone의 설정과 같고, 아랫부분의 설정만 해주면 된다. 값은
            전체IP중에서 맨 숫자만 적어주면 된다. 왜냐하면 /etc/named.conf에서 linux.rev설정에
            서 일부를 지정했기 때문이다.

7. DNS관련 유틸리티
(1) rndc
   1) 설명: rndc는 네임서버 데몬을 관리하는 프로그램이다.
   2) 관련파일
    ㄱ. /etc/rndc.conf: rndc의 주 환경설정 파일이다.
    ㄴ. rndc-confgen: rndc의 주환경설정파일인 /etc/rndc.conf를 생성하는 명령이다.
   3) /etc/rndc.conf 기본설정예
     options {
        default-server  localhost;
        default-key     "rndckey";
     };

     server localhost {
             key     "rndckey";
     };

     include "/etc/rndc.key";
   4) /etc/rndc.conf의 항목
    ㄱ. options {};
       => default-server, default-key, default-port를 지정한다. 각각 서버, 키이름, 포트를 지정
         한다.
    ㄴ. server 서버주소 {};
       => 서버의 주소를 지정한 후 { }; 안에 사용할 식별키이름을 지정한다.
    ㄷ. key "키이름" {};
       => named.conf 파일과 같이 설정하거나 위의 항목처럼 include해도 된다.
         예) key "rndckey" {
                     algorithm       hmac-md5;
                     secret "2gNzw5u5z4ypwigLARTOgcA9cBQ94l4whKyjOBa5Rm4iu8P7XVt5LT8wht6x";
             };
   5) rndc-confgen
    ㄱ. 설명: /etc/rndc.conf 파일을 생성해주는 명령이다.
    ㄴ. 사용법
       rndc-confgen [option]
    ㄷ. option
       -a : /etc/rndc.key 키파일을 생성한다.
    ㄹ. 생성예
       [root@www root]# rndc-confgen -a
        => /etc/rndc.key 파일을 생성한다.
       [root@www root]# chmod 640 /etc/rndc.key
        => 퍼미션 변경
       [root@www root]# chown named.named /etc/rndc.key
        => 소유권 변경
       [root@www root]# rndc-confgen > /etc/rndc.conf
        => 리다이렉션기호를 사용하여 /etc/rndc.conf 파일로 저장할 수 있다.
   6) rndc 사용하기
    ㄱ. 조건: 네임서버 데몬이 작동하고 있어야 하며, /etc/named.conf 파일에 controls구문이 설정
             되어 있어야 한다.
    ㄴ. 사용예
       [root@www root]# rndc reload
        => named 데몬의 설정을 다시 로딩한다.
(2) redhat-config-bind: 레드햇 8.0부터 제공하는 GUI기반 BIND 설정도구이다.

(3) named-checkconf
   1) 설명: 네임서버의 주 환경 설정 파일인 /etc/named.conf의 문법적 오류를 찾아주는 명령이다.
   2) 사용법
     named-checkconf [filename]
      => 기본적으로 /etc/named.conf 파일의 오류를 검사하고, 다른 경로의 named.conf파일을
        검사하려면 파일의 경로를 적어주면 된다.
   3) 사용예
    ㄱ. [root@linux224 named]# named-checkconf
          => /etc/named.conf 파일의 문법적 오류를 찾는다.
    ㄴ. [root@linux224 root]# named-checkconf ~/named.conf
        /root/named.conf:12: unknown option 'acl
          => ~/named.conf의 문법적 오류를 찾는다.

(4) named-checkzone
   1) 설명: zone파일의 문법적 오류를 찾아주는 명령이다.
   2) 사용법
     named-checkzone 도메인명 zone파일경로
   3) 사용예
     [root@linux224 root]# named-checkzone linux.com /var/named/linux.zone
     /var/named/linux.zone:1: no TTL specified; using SOA MINTTL instead
     zone linux.com/IN: loaded serial 2005070802
     OK

8. DNS서버 구성예
(1) 단일서버
   1) 설명: 부여받은 IP주소가 192.168.1.125이고 신청한 도메인이 linux.co.kr이고, 하나의 시스템
           에 DNS, WEB, Mail서버 운영하는 경우
   2) 설정하기
    ㄱ. /etc/named.conf 파일의 설정: 이 파일에는 기본적으로 zone파일의 위치하는 디렉토리와
                                    2개의 존파일이 선언되어 있는 데, 기본설정은 건드리지 말고
                                    내용만 추가해야 한다.
      (예)
       [root@www root]# vi /etc/named.conf
       // generated by named-bootconf.pl

       options {
               directory "/var/named";
               /*
                * If there is a firewall between you and nameservers you want
                * to talk to, you might need to uncomment the query-source
                * directive below.  Previous versions of BIND always asked
                * questions using port 53, but BIND 8.1 uses an unprivileged
                * port by default.
                */
               // query-source address * port 53;
       };

       //
       // a caching only nameserver config
       //
       controls {
               inet 127.0.0.1 allow { localhost; } keys { rndckey; };
       };
       zone "." IN {
               type hint;
               file "named.ca";
       };

       zone "localhost" IN {
               type master;
               file "localhost.zone";
               allow-update { none; };
       };

       zone "0.0.127.in-addr.arpa" IN {
               type master;
               file "named.local";
               allow-update { none; };
       };
       zone "linux.co.kr" {         // 사용하고자 하는 도메인을 선언
               type master;         // 기본 primary로 사용시에는 master로 선언한다.
               file "linux.zone";   // 사용하고자하는 zone파일의 이름을 선언한다. 물론 이름은
       };                            임의로 선언. 여기서는 linux.zone이라고 함.

       zone "1.168.192.in-addr.arpa" {   // 부여받은 IP중 마지막 자리를 뺀 나머지를 역으로
               type master;                선언한다. nslookup등을 이용하여 IP주소로 도메인이름
               file "linux.rev";           을 조회할 때 사용. 타입은 master이고, zone파일의
       };                                  이름은 임의로 지정할 수 있으며, 여기서는 linux.rev
                                           라 함.

       include "/etc/rndc.key";
    ㄴ. zone파일의 생성: /etc/named.conf파일에서 zone파일들이 위치하는 디렉토리가 /var/named
                        라고 정의되어 있으므로 이 디렉토리에 생성한다. 아울러, 이 디렉토리에
                        localhost의 zone파일인 localhost.zone파일이 존재하므로 이 파일을
                        위에서 설정한 zone파일인 linux.zone으로 변경한뒤에 편집하고 리버스
                        존파일인 linux.rev는 linux.zone파일을 복사하여 설정하면 된다.
       (예)
      1. linux.zone파일의 설정
       [root@www named]# vi linux.zone
       $TTL    86400
       @       IN      SOA     ns.linux.co.kr. root.linux.co.kr.  ( // 네임서버와 관리자 메일
                                        2001071500 ; Serial           설정시 도메인명 뒤에
                                        28800      ; Refresh          반드시 '.'를 표기
                                        14400      ; Retry
                                        3600000    ; Expire         // 예전에는 초단위의 값을
                                        86400 )    ; Minimum          사용했으나 현재는 H(시),
                              IN   NS       ns.linux.co.kr.           D(일)등의 단위도 사용
       linux.co.kr.           IN   A        192.168.1.125
                              IN   MX 10    linux.co.kr.        // 메일서버의 우선순위를 지정
       www.linux.co.kr.       IN   A        192.168.1.125

         (참고) 2차 도메인 전부를 설정하는 경우
               *.linux.co.kr.         IN   A       192.168.1.125
           => (생략법)
               *                      IN   A       192.168.1.125

      2. linux.rev 파일의 설정
       [root@www named]# vi linux.rev
       $TTL    86400
       @       IN      SOA     ns.linux.co.kr. root.linux.co.kr.  (
                                        2001020201 ; Serial
                                        28800      ; Refresh
                                        14400      ; Retry
                                        3600000    ; Expire
                                        86400 )    ; Minimum
                       IN NS      ns.linux.co.kr.
       125             IN PTR     ns.linux.co.kr.    // 125는 부여받은 IP의 맨 마지막을 표기한
       125             IN PTR     linux.co.kr.         것이며. PTR은 리버스존에서 정의해주는
       125             IN PTR     www.linux.co.kr.     것으로 IP주소로 도메인을 변환할 때 사용
                                                       한다.
   3) 테스트하기
    ㄱ. named 데몬을 작동시킨다.
       [root@www named]# /etc/rc.d/init.d/named start
         => named 시작시 [OK]메시지가 나타나도 /etc/named.conf파일의 설정이 잘못되면 데몬이
           작동되지 않으므로 데몬작동유무를 확인해야 한다.
    ㄴ. /etc/reslov.conf파일에 본인의 IP주소를 네임서버로 등록한다.
       예) [root@www named]# vi /etc/resolv.conf
           nameserver 192.168.1.125
    ㄷ. nslookup 명령등으로 테스트한다.
       예) [root@www named]# nslookup linux.co.kr
           Note:  nslookup is deprecated and may be removed from future releases.
           Consider using the `dig' or `host' programs instead.  Run nslookup with
           the `-sil[ent]' option to prevent this message from appearing.
           Server:         192.168.1.125
           Address:        192.168.1.125#53

           Name:   linux.co.kr
           Address: 192.168.1.125
(2) 단일서버2
   1) 설명: 위의 단일서버에 linux.com이라는 도메인 추가하기
   2) 설정하기
    ㄱ. /etc/named.conf 파일의 설정: 도메인이 추가된 경우에는 반드시 이 파일에 등록하고
                                    linux.com의 존파일을 선언해야 한다. 단순히 도메인만 추가
                                    하여 사용하는 경우에는 linux.com의 2차도메인인
                                    www.linux.com 등을 사용하기 위하여 새로운 존파일을
                                    생성해야 한다.
       (예)
      1. linux.zone파일의 설정
       [root@www named]# vi linux.com.zone
       $TTL    86400
       @       IN      SOA     ns.linux.com. root.linux.com.  ( // 네임서버와 관리자 메일
                                        2001071500 ; Serial       설정시 도메인명 뒤에
                                        28800      ; Refresh      반드시 '.'를 표기
                                        14400      ; Retry
                                        3600000    ; Expire         // 예전에는 초단위의 값을
                                        86400 )    ; Minimum          사용했으나 현재는 H(시),
                              IN   NS       ns.linux.com.             D(일)등의 단위도 사용
       linux.com.             IN   A        192.168.1.125
                              IN   MX 10    linux.com.        // 메일서버의 우선순위를 지정
       www.linux.com.         IN   A        192.168.1.125
      2. linux.rev 파일의 설정
       [root@www named]# vi linux.rev
       $TTL    86400
       @       IN      SOA     ns.linux.co.kr. root.linux.co.kr.  (
                                        2001020201 ; Serial
                                        28800      ; Refresh
                                        14400      ; Retry
                                        3600000    ; Expire
                                        86400 )    ; Minimum
                       IN NS      ns.linux.co.kr.
       125             IN PTR     ns.linux.co.kr.
       125             IN PTR     linux.co.kr.
       125             IN PTR     www.linux.co.kr.
       125             IN PTR     linux.com.            // 추가
       125             IN PTR     www.linux.com.        // 추가
    ㄷ. apache의 설정: 웹서비스를 하는 경우 아파치의 환경파일인 httpd.conf에서도 설정해줘야
                      한다.
        예) [root@www apache]# vi httpd.conf
            ---- 생략 -----
            NameVirtualHost 192.168.1.125              // 이 부분에 사용하는 IP를 적는다.
            ---- 생략 -----
            <VirtualHost 192.168.1.125>
                ServerAdmin admin@linux.com
                DocumentRoot /usr/local/apache/htdocs
                ServerName www.linux.com
                ServerAlias linux.com www.linux.com
                ErrorLog logs/linux.com-error-log
                CustomLog logs/linux.com-access_log common
            </VirtualHost>
              => 위의 ServerAlias 설정은 브라우저상에서 linux.com과 www.linux.com를 입력했을
                경우에 웹페이지가 열리도록 설정. 만약 2차도메인이 전부 이 동일한 웹페이지가
                열리도록 하려면 *.linux.com이라고 설정한다.
   3) 테스트하기
     [root@www named]# nslookup
     Note:  nslookup is deprecated and may be removed from future releases.
     Consider using the `dig' or `host' programs instead.  Run nslookup with
     the `-sil[ent]' option to prevent this message from appearing.
     > www.linux.co.kr                           // www.linux.co.kr 조회
     Server:         192.168.1.125
     Address:        192.168.1.125#53

     Name:   www.linux.co.kr
     Address: 192.168.1.125
     > www.linux.com                            // www.linux.com 조회
     Server:         192.168.1.125
     Address:        192.168.1.125#53

     Name:   www.linux.com
     Address: 192.168.1.125
     > 192.168.1.125                           // IP로 조회
     Server:         192.168.1.125
     Address:        192.168.1.125#53

     125.1.168.192.in-addr.arpa     name = linux.co.kr.
     125.1.168.192.in-addr.arpa     name = linux.com.
     125.1.168.192.in-addr.arpa     name = ns.linux.co.kr.
     125.1.168.192.in-addr.arpa     name = www.linux.co.kr.
     125.1.168.192.in-addr.arpa     name = www.linux.com.

(3) 다중 웹서버
   1) 설명: 웹서버 2대를 따로 운영할 경우 직접 www이라는 동일한 이름으로 지정가능하다.
   2) 사용예
     [root@linux224 named]# vi linux.zone
     @                        IN SOA ns.linux.com. posein.linux.com. (
                                             2005070501      ; serial (d. adams)
                                             3H              ; refresh
                                             15M             ; retry
                                             1W              ; expiry
                                             1D )            ; minimum

                              IN NS          ns.linux.com.
                              IN A           203.247.50.224
                              IN MX 10       203.247.50.224
     www                   0  IN A           203.247.50.227
     www                   0  IN A           203.247.50.228
       => TTL을 0으로 설정하면 caching을 하지 말도록 하는 설정이다.

(4) 2차도메인서버운영
   1) 개요: mybestone.com이라는 도메인으로 서버가 한 대 운영중이고 linux.mybestone.com이라는
           서브도메인(2차도메인)을 부여하여 이 서버가 독자적인 IP를 가지고 있고, 웹서버 및
           메일서버도 독자적으로 운영하려고 한다. 또한 이 서버의 서브도메인(3차도메인)도
           가능하게 설정하도록 한다.
   2) 조건
    ㄱ. mybestone.com (주 도메인)
         IP 주소         : 192.168.0.3
         zone 파일       : mybestone.zone
         Reverse zone파일: mybestone.rev
    ㄴ. linux.mybestone.com (서브 도메인)
         IP 주소         : 192.168.0.4
   3) 설정
    ㄱ. 주 네임서버(ns.mybestone.com)의 설정
      a. /var/named 디렉토리에 존재하는 mybestone.zone파일의 설정 추가
             linux            IN      NS      ns.linux
             ns.linux         IN      A       192.168.0.4
          => 첫번째줄의 설정을 풀어쓰면 다음과 같다.
              linux.mybestone.com.         IN       NS      ns.linux.mybestone.com.
            즉 linux.mybestone.com이라는 도메인의 네임서버를 ns.linux.mybestone.com이라는
            것으로 정한다는 뜻이다.
            두번째줄의 설정을 풀어쓰면 다음과 같다.
             ns.linux.mybestone.com.      IN       A      192.168.0.4
           즉, ns.linux.mybestone.com의 IP주소는 192.168.0.4라는 뜻이 된다.
       (참고) 단순히 2차 도메인 사용만 지정하려면
                linux             IN      A      192.168.0.4
              라고 한줄만 지정해도 된다.
       b. /var/named 디렉토리에 존재하는 mybestone.rev파일의 설정 추가
            linux            IN      NS      ns.linux.mybestone.com.
            4                IN      NS      ns.linux.mybestone.com.
    ㄴ. 서브 네임서버(ns.linux.mybestone.com)의 설정
      a. /etc/named.conf파일의 설정
          zone "linux.mybestone.com" {        // 위임받은 2차도메인 설정
                  type master;
                  file "linux.mybestone.zone";
          };

           zone "linux.0.168.192.in-addr.arpa" { // 위임받은 2차도메인의 역존 설정법
                   type master;
                   file "linux.mybestone.rev";
                 };
      b. linux.mybestone.zone파일의 설정
          @       IN      SOA     ns.linux.mybestone.com. root.linux.mybestone.com.  (
                                           2001071500 ; Serial
                                           28800      ; Refresh
                                           14400      ; Retry
                                           3600000    ; Expire
                                           86400 )    ; Minimum
                                         IN NS      ns.linux.mybestone.com.
          linux.mybestone.com.           IN A       192.168.0.4
                                         IN MX 10   linux.mybestone.com.
          www.linux.mybestone.com.       IN A       192.168.0.4
      c. linux.mybestone.rev 파일의 설정
          @       IN      SOA     ns.linux.mybestone.com. root.linux.mybestone.com.  (
                                           2001020201 ; Serial
                                           28800      ; Refresh
                                           14400      ; Retry
                                           3600000    ; Expire
                                           86400 )    ; Minimum
                       IN      NS      ns.linux.mybestone.com.
         4             IN      PTR     linux.mybestone.com.
         4             IN      PTR     ns.linux.mybestone.com.
         4             IN      PTR     www.linux.mybestone.com.
   ㄷ. httpd.conf파일에 설정한다.
        <VirtualHost 192.168.0.4>
            ServerAdmin root@linux.mybestone.com
            ServerName www.linux.mybesone.com
            DocumentRoot /usr/local/apache/html
            ErrorLog logs/linux.mybestone.com-error_log
            CustomLog logs/linux.mybestone.com-access_log common
        </VirtualHost>
(5) Slave DNS 구성하기
   1) 설명: Slave DNS는 Master DNS의 zone파일을 백업하는 역할을 하는 서버이다. Master DNS의
           IP주소를 192.168.1.125, 도메인 네임을 linux.co.kr이라고 가정하고, Slave DNS는
           192.168.1.126이라고 가정한다.
   2) 설정하기
    ㄱ. Master DNS(192.168.1.125)의 /etc/named.conf 파일에 허가할 Slave DNS의 설정
       [root@master root]# vi /etc/named.conf
       options {
               directory "/var/named";
               allow-transfer { 192.168.0/24; 192.168.1.126; };  // 허가할 Slave DNS IP주소
       };
       ----- 이하 생략 ------
    ㄴ. Slave DNS(192.168.126) 설정
      a. /etc/named.conf 파일의 설정: 다음의 항을 추가한다.
        [root@slave root]# vi /etc/named.conf
        ---- 생략 ----
        zone "linux.co.kr" IN {
                type slave;
                file "linux.zone";
                masters { 192.168.1.125; };
        };

        zone "1.168.192.in-addr.arpa" IN {
                type slave;
                masters { 192.168.1.125; };
                file "linux.rev";
        };
       b. zone파일을 복사할 /var/named의 허가권 조정: 복사를 해오는 named가 기본적으로
                                                     /var/named에 쓰기권한이 없다. 따라서,
                                                     허가권을 조정해야 한다.
         [root@www root]# ls -ld /var/named
         drwxr-x---    2 named    named        4096  8월 16 21:48 /var/named/
         [root@www root]# chmod g+w /var/named
         drwxrwx---    2 named    named        4096  8월 16 21:48 /var/named/
     ㄷ. slave DNS에서 named 데몬을 재가동하면 Master DNS의 존파일인 linux.zone, linux.rev
        파일을 복사해온다.


출처 : 대전국제 IT교육센터 정성재 강사

 

1. RHEL 4에서의 네트워크 설치 개요
RHEL 4에서도 리눅스 설치시 원격지에 FTP, NFS 서버 등으로 구축하고, 네트워크를 통하여 설치할
수 있다. RHEL 3 이전 버전과 달라진 점은 서버 구성은 같으나, 클라이언트의 CD-ROM 디렉토리의
경로가 다르고, 또한 설치 디스크의 이미지가 커져서 3.5" 플로피 디스크를 통한 설치가 불가능하다.
CD-ROM 드라이브의 경로는 기존의 /mnt/cdrom에서 /mnt/media로 변경되었고, 플로피 디스크
대신에 리눅스 설치 1번 CD를 사용하여 설치할 수 있다.

2. 리눅스 네트워크서버 설정 -NFS 서버이용
(1) 서버에 설치를 위한 소스 복사
   1) 설명: RHEL 4 버전인 경우에는 설치 CD에서 rpm패키지가 들어있는 RedHat디렉토리를 그대로
           복사해야 한다.
   2) 방법
    ㄱ. 소스가 위치할 디렉토리 생성
       [root@www root]# mkdir /redhat
         => 설치 디스크를 1번부터 4번장까지 복사해야 하므로 3-4GB의 여유 공간의 필요하다.
    ㄴ. 설치 CD 1번을 넣고 마운트한다.
       [root@www root]# mount /media/cdrom
         => RHEL 4부터 CD-ROM의 마운트 디렉토리가 /mnt/cdrom에서 /media/cdrom으로 변경되었다.
    ㄷ. rpm패키지를 /redhat에 복사한다.
       [root@www root]# cp -a /mnt/cdrom/RedHat /redhat
    ㄹ. 복사가 다 되었으면 마운트를 해제한다.
       [root@www root]# umount /media/cdrom
    ㅁ. 설치 디스크 2번 부터는 마운트하여 rpm패키지가 들어 있는 디렉토리인
       /media/cdrom/RedHat/RPMS/안의 내용만 복사하면 된다.
       [root@www root]# cp /media/cdrom/RedHat/RPMS/* /redhat/RedHat/RPMS
(2) NFS서버로 구축하기: 자세한 설명은 NFS서버 구축하기 참고
   1) /etc/exports 파일설정
    ㄱ. 기본설정법
       설치소스경로          클라이언트주소
    ㄴ. 설정예
       /redhat      *
      => /redhat 이라는 디렉토리에 모든 클라이언트의 접속을 허가하였다.
   2) NFS 서버를 작동한다.
    ㄱ. /etc/rc.d/init.d/portmap start    (보통 이 데몬은 기본적으로 작동한다.)
    ㄴ. /etc/rc.d/int.d/nfs start
(3) 네트워크 서버간의 차이
    네트워크 서버를 이용하여 리눅스를 설치 할 경우 FTP, HTTP, NFS 서버 등을 사용할 수 있으나,
   이 중 NFS서버를 많이 사용하는 이유는 아나콘다를 이용한 그래픽 설치가 가능하기 때문이다.

3. 클라이언트 설정 - NFS 서버 이용
(1) 개요: RHEL 3 버전까지는 부팅용 설치 디스크를 만들어서 사용했으나, RHEL 4에서는 설치용
          부팅디스크를 만들 수가 없다. 최근 플로피 디스크없이 CD-ROM만 기본 장착한 시스템들이
          많아 설치 CD 1번을 이용하여 네트워크 설치가 가능하다.
(2) 설치순서
   1) 설치 디스크 1번을 넣고 부팅한다.
   2) 초기화면이 뜨고 'boot:'라는 프롬프트가 나타나면 'linux askmethod'라고 입력하고
     [Enter]키를 누른다.
   3) 사용할 언어를 선택한다.(기본 English 선택)
   4) 키보드를 선택한다.(기본 us 선택)
   5) 인스톨 방법을 선택한다. NFS image, FTP, HTTP 방법이 있으며 이중에서 NFS image를 고른다.
   6) 네트워크 장치를 선택한다. eth0이나 eth1 등 맞는 것을 선택한다.
   7) TCP/IP 네트워크 설정을 한다. 해당 IP, Netmask, Gateway값등을 설정한다.
   8) NFS 서버를 설정한다.
    ㄱ. NFS server name : 서버네임이나 IP주소를 적는다.
        예) 192.168.4.100
    ㄴ. RedHat Enterprise Linux directory : 설치소스의 경로를 적는다.
        예) /redhat
   9) 설치를 시작한다.

출처 : 대전국제IT교육센터 정성재 강사

 

1. pico편집기란?
pico는 워싱턴대학에서 만든 유닉스용 편집기로 간단하고 메뉴 선택 방식의 텍스트 편집기이다. vi
나 emacs와 달리 윈도우의 메모장처럼 쉽게 사용할 수 있다. vi 편집기처럼 입력모드와 명령모드가
존재하지 않고 바로 텍스트를 입력할 수 있다. 글자를 지울때도 Delete 키나, BackSpace 키를 이용
하면 된다.


2. pico 시작하기
(1) 사용법
   pico [option] [filenames]
(2) option
   -w : 긴 라인에서 라인이 깨지는 경우가 있는데 이 옵션을 사용하면 된다.
(3) 사용예
   1) [posein@www posein]$ pico
        => 빈 파일 형태로 문서를 불어온다.
   2) [posein@www posein]$ pico /etc/passwd
        => /etc/passwd라는 파일을 불러온다.

3. pico 실행후의 주요 메뉴
Ctrl + o : 파일을 저장한다.
Ctrl + x : 파일을 빠져나온다. 저장이 안되어 있으면 저장할 것인지 물어본다.
Ctrl + r : 현재 커서 위치에 다른 파일을 불려온다.
Ctrl + a : 현재 행의 맨 앞으로 이동한다.
Ctrl + e : 현재 행의 맨끝으로 이동한다.
Ctrl + v : 이전 페이지로 이동한다.
Ctrl + y : 다음페이지로 이동한다.
Ctrl + t : 영문자의 철자를 확인해 준다.
Ctrl + c : 현재 커서에서 이 키를 누르면, 하단에 현재 라인이 몇 번째 라인인지, 전체 몇 글자
           중에 몇 번째 글자인지, 전체 문서의 몇 퍼센트에 위치하는지도 알려준다. 
Ctrl + j : 현재 행이 흩어져 있는 경우에 이용된다. 예를 들어 행간이 많이 벌어져 있거나 들여쓰
           기가 되어 있는 경우에 자동으로 정리하여 질서 정연한 문장으로 만들어준다. 
Ctrl + w : 이 키를 누르고 문자열을 입력하면 원하는 문자열을 찾을 수 있다. 
Ctrl + k : 현재 라인을 삭제한다.
Ctrl + u : 마지막으로 삭제된 라인을 복구하는데 이용한다.
Ctrl + l : 화면 갱신한다.
Ctrl + g : 도움말을 보여준다.

출처 : 대전국제IT교육센터 정성재 강사

 

1. AutoFS란?
Autofs는 자동 마운트 데몬(amd)의 작동을 제어하는 프로그램이다 자동마운트 데몬은 자동으로 파일
시스템을 마운트하며 파일 시스템이 사용되지 않고 일정 시간이 흐르면 자동으로 언마운트 한다. 네
트워크 파일 시스템, CD-ROM, 플로피 등을 마운트하는데 사용된다.


2. autofs 설치하기
리눅스 설치시에 전체선택을 하거나 사용자설치(Custom)모드에서 autofs rpm패키지를 선택하면 auto
fs가 설치되어 있을 것이다. 아니면 rpm 패키지를 찾아 설치하도록 한다. 설치방법은 생략한다.
(참고) autofs의 설치 확인
      rpm -qi autofs

3. autofs 설정하기
(1) 개요: /etc 디렉토리에 auto.master 라는 파일과 auto.misc라 불리우는 파일이 있는데 이 두개의
          파일이 환경설정 파일이다. 주 설정파일은 /etc/auto.master이다.
(2) /etc/auto.master
   1) 설명: automounter의 주된 설정파일이다. 이 파일은 3개의 필드로 구성되어 있다. 첫번째 필드
           는 마운트 포인트를 나타내고, 두번째 필드는 마운트포인트를 위한 맵파일이다. 세번째
           필드는 추가적인 옵션을 지정하는 부분이다.
   2) 파일의 예
     [root@www root]# cat /etc/auto.master
     # $Id: auto.master,v 1.2 1997/10/06 21:52:03 hpa Exp $
     # Sample auto.master file
     # Format of this file:
     # mountpoint map options
     # For details of the format look at autofs(8).
     /misc /etc/auto.misc  --timeout=60
      => /misc 라는 디렉토리를 /etc/auto.misc 파일의 설정을 가지고 사용하겠다는 뜻이다.
(3) /etc/auto.misc
   1) 설명: 실제 자동으로 마운트할 내용을 적는 파일이다. 이 파일명 이외에 다른 파일명으로
           /etc/auto.master라는 파일에 기록하면 여러 파일도 사용가능하다. 이 파일도 3개의 필드
           로 구성되어 있다. 첫번째 필드는 Key로 마운트 위치를 나타낸다. 두번째 필드는 옵션이
           고, 세번째 필드는 파일시스템의 특정한 위치를 나타낸다.
   2) 파일의 예
     [root@www root]# cat /etc/auto.misc
     # $Id: auto.misc,v 1.2 1997/10/06 21:52:04 hpa Exp $
     # This is an automounter map and it has the following format
     # key [ -mount-options-separated-by-comma ] location
     # Details may be found in the autofs(5) manpage

     cd              -fstype=iso9660,ro,nosuid,nodev :/dev/cdrom

     # the following entries are samples to pique your imagination
     #linux          -ro,soft,intr           ftp.example.org:/pub/linux
     #boot           -fstype=ext2            :/dev/hda1
     #floppy         -fstype=auto            :/dev/fd0
     #floppy         -fstype=ext2            :/dev/fd0
     #e2floppy       -fstype=ext2            :/dev/fd0
     #jaz            -fstype=ext2            :/dev/sdc1
     #removable      -fstype=ext2            :/dev/hdd
      => 현재 설정은 cd 라는 키에 /dev/cdrom을 옵션설정대로 연결시키라는 설정이다.

3. autofs 사용하기
(1) 데몬가동하기
    /etc/rc.d/init.d/autofs start  하거나
    service autofs start
(2) 사용하기
   1) CD-ROM에 디스크를 삽입한다.
   2) ls /misc/cd 명령을 내리면 디스크의 내용을 확인할 수 있다.

(참고) NFS와 연계해서 사용하면 편리하다.

출처 : 대전국제IT교육센터 정성재 강사

 

1. 파일 시스템이란?
파일 시스템(File System)이란 운영체제가 파일을 시스템의 디스크(흔히 블록디바이스라 불리우는
장치들) 또는 파티션에 기록될 수 있도록 구성하는 방식을 말한다. 운영체제는 시스템의 디스크 파티
션상에 파일들을 연속적이고 일정한 규칙을 가지고 저장하는데, 파일시스템은 이러한 규칙들의 방식
을 제시하는 역할을 한다.


2. 리눅스 파일 시스템의 구조
(1) 개요: 각각의 파일시스템들은 파일 시스템만의 독특한 시스템 특징을 가지고 있다. 그러나 대체
          적으로 대부분의 리눅스 파일 시스템은 비슷한 구조를 가지고 있으면 아래에 열거할 공통점
          을 가지고 있다.
(2) 리눅스 파일 시스템의 구성요소
   1) 슈퍼 블록(Super Block): 파일시스템의 전체적인 정보를 가지고 있다. 파일시스템의 크기, 매직
                             넘버, 마운트횟수, 블록그룹번호, 블록 크기, 첫번째 inode 등이 해당
                             된다.
   2) 아이노드(Inode) : 아이노드는 파일의 이름을 제외한 해당 파일의 모든 정보를 가지고 있으며
                       각 파일 이름에 부여되는 고유한 번호이다. Data Block의 위치정보, File형
                       태, 크기, 타임스탬프, File의 소유자, inode의 모드 등에 관한 정보를 가지
                       며, Inode로 이루어진 테이블에서 이 번호를 가지고 찾아 정보를 알려준다.
                       일반적으로 시스템에서는 파일이름으로 처리하는 것이 아니라 이 아이노드로
                       처리한다.
   3) 데이터 블록(Data Block) : 데이터 블록은 Inode에 포함된다. Inode가 몇 개의 데이터 블록을
                               포함하고 있다. 데이터 블록은 파일에서 데이터를 저장하기 위해
                               사용되는 공간이다.
   4) 디렉토리 블록(Directory Block) : 파일 이름과 Inode 번호를 저장하기 위해 사용된다.
   5) 간접 블록(Indirection Block) : inode에 Data Block의 위치 정보를 저장할 공간이 부족할 때,
                                    이 위치정보를 저장하기 위한 공간을 동적으로 할당하는데 이 공간
                                    이 간접 블록이다.
   6) 홀(Hole) : 홀은 Inode나 간접 블록안의 데이터 블록의 주소로 특별한 값을 저장한다. 홀은
                파일 시스템에 의해서 파일 안에 자리하게 된다. 하지만 이 홀을 위해 실질적으로
                디스크상에 공간은 할당되지 않는다. 단지 0바이트가 파일 안에서 특정 공간을 차지
                하고 있다고 가정하는 것이다.

3. 리눅스 파일 시스템의 종류와 특징
(1) 개요: 리눅스는 다양한 파일 시스템들을 지원하는데 중요 파일시스템들은 ext, ext2, minix,
          xia, umsdos, hpfs, iso9660, msdos, nfs, sysv 등이 있다.
(2) 파일 시스템의 종류와 특징
   1) ext
     리눅스 초기에 사용되던 파일 시스템으로 호환성이 없다. ext2의 구 버전으로 현재는 대부분
    사용하지 않고 있다.
   2) ext2
     현재 가장 많이 사용하는 파일 시스템으로 리눅스 파일 시스템의 대부분을 차지한다. 안정성이
    뛰어나고 속도가 빠르다. 호환성도 뛰어나고 업그레이드도 쉽게 설계되어 있다.
   3) minix
     과거 Minix에서 사용되었던 파일 시스템으로 가장 오래되고 기본이 되는 파일 시스템이다. 흔히
    가장 신뢰할 만할 파일 시스템이라고 하지만 몇가지 제한을 가지고 있다. 우선 몇몇 Time Stamp
    가 유실되고, 파일 이름은 30문자로 제한된다. 또한 파일 시스템마다 최대 64MB 성능 제한이
    있다. 대부분의 배포판의 부팅디스크는 보통 이 Minix 파일 시스템으로 구성되어 있다.
   4) xia
     Minix의 제한이었던 파일 이름과 파일 시스템에 대한 제한을 보안한 minix파일 시스템의 수정
    버전이지만 특별히 추가된 새로운 기능은 없다.
   5) msdos
     MS-DOS의 FAT파일시스템과 호환을 지원하는 파일 시스템이다. 또한 msdos는 OS/2와 윈도우 NT
    의 FAT파일시스템과도 호환된다.
   6) umsdos
     MS-DOS파일 시스템을 리눅스상에서 긴 파일명과 소유자, 접근권한, 링크와 장치 파일 등을 지원
    하도록 확장한 파일 시스템이다. umsdos는 일반적으로 DOS파일 시스템이 마치 리눅스 파일 시스
    템인 것처럼 보이도록 하는 기능을 제공하므로 따로 리눅스를 위한 파티션은 필요하지 않는다.
   7) iso9660
     ISO 기준을 따르는 CD-ROM의 표준 파일시스템이다. 이 파일시스템은 CD-ROM에 좀 더 긴 파일명
    을 사용할 수 있도록 확장한 록 브리지(Rock Bridge)가 기본으로 지원된다.
   8) hpfs
     OS/2의 파일 시스템이다. 하지만 현재는 읽기 전용인 파일 시스템으로 파일 시스템에 대한 읽기
    만 가능하다.
   9) nfs
     네트워크 파일 시스템(Network File System)이다. 네트워크상의 많은 컴퓨터들이 각각의 시스템
    에 가진 파일들을 서로 쉽게 공유하기 위해 제공되는 상호간의 파일 시스템 공유 파일시스템이다.
   10) sysv
     System V/386, Xenix 그리고 Coherent 파일 시스템이다.

4. ext2와 저널링파일시스템
(1) ext2 파일시스템
   1) 설명: Minix파일시스템은 리눅스가 처음으로 사용한 파일시스템이었다. 하지만 여러가지 제약
           조건이 있었고, 그 성능 또한 그리 뛰어나지 못했다. 이를 보안하기 위해 제시된 파일시
           스템이 확장 파일 시스템(EXT, Extended File System)이다. 특히 이 파일 시스템은 리눅
           스 전용으로 설계되어 1992년 4월 소개되었다. 하지만 이 파일시스템도 여러 문제점을
           가지고 있었고, 그래서 다시 ext파일시스템을 보완하기 위해서 1993년에 추가된 것이
           바로 2차 확장 파일 시스템(ext2, Extend File System 2)이다. ext2파일시스템은 자신이
           위치하고 있는 논리적인 파티션을 블록으로 다시 나누게 된다. 이 블록 그룹들은 파일시
           스템에서 무결성의 핵심을 이루는 정보를 중복해서 저장하여 실제 파일과 디렉토리를 정
           보와 데이터 블록으로 가진다. 블록 그룹들이 파일 시스템에 대해 무결성 정보를 가지고
           있는 이유는 파일시스템이 예기치 않는 시스템상의 재난으로부터 파일시스템을 복구하기
           위해서이다.
   2) 구성요소
     ㄱ. Inode: ext2 파일 시스템은 모든 파일을 ext2파일시스템에서 가장 기본이 되는 단위인 각각
               의 Inode에 의해서 표현한다. 또한 Inode는 각각을 구분할 수 있는 고유 번호를 가지
               게 되는데, 이러한 Inode의 역할은 파일의 데이터가 어느 블록의 어느 위치에 저장되
               어 있는지, 파일에 대한 접근 권한, 파일의 최종 수정시간, 파일의 종류 등의 정보를
               저장하는 것이다. 그리고 Inode는 Inode table에 저장된다.
         (참고) Inode 테에블에 저장되는 정보의 항목
               1. 모드(Mode) : Inode가 속한 파일에 대한 정보와 파일에 대한 접근 권한 정보가
                              저장된다. ext2에서 Inode는 단지 하나의 파일, 심볼릭 링크, 블록
                              장치, 문자장치 등만을 나타낸다.
               2. 소유자정보(Owner Information) : 소유자정보는 파일과 디렉토리에 대한 소유자와
                                                 그룹에 대한 식별자를 나타낸다. 소유자정보를
                                                 사용하여 파일이나 디렉토리에 대한 접근권한을
                                                 관리할 수 있다.
               3. 크기(Size): 크기(Size)는 파일의 크기 정보를 저장한다. 파일에 대한 크기정보는
                             바이트 단위로 저장된다.
               4. 타임스탬프(Time Stamp): 타임스탬프는 Inode가 생성된 시간과 최종적으로 수정을
                                         가한 시간에 대한 정보를 저장한다.
               5. 데이터 블록(Data Block): 데이터 블록은 Inode가 지정하고 있는 데이터 블록에
                                          대한 포인터를 저장한다. 데이터 블록에는 총 15개의 포
                                          인터가 존재하는데, 이 포인터들 중에서 선행의 12개 포
                                          인터는 해당 Inode가 지정하고 있는 데이터에 대한 실제
                                          블록의 포인터 정보를 가지고 있고, 나머지 3개의 포인
                                          터는 높은 수준의 간접 연결에 대한 정보를 가지고 있다.
                                          Inode는 또한 실제로 존재하지 않지만 시스템의 장치에
                                          접근할 수 있는 특별한 장치 파일의 표현에도 사용된다.
                                          리눅스시스템의 /dev디렉토리안에 위치하는 파일들이
                                          그것들이다.
     ㄴ. 슈퍼블록(Super Block): 슈퍼블록은 해당 파일시스템의 기본적인 크기나 형태에 대한 정보
                               를 저장한다. 파일시스템 관리자는 이 슈퍼블록의 정보를 이용하여
                               파일 시스템을 활용하고 유지할 수 있다.
        a. 매직 넘버(Magic Number): 마운트하는 소프트웨어에게 ext2파일 시스템의 슈퍼블록임을
                                   확인하게 하는 값이다. 현재 ext2파일 시스템에서 매직 넘버값
                                   은 OxEF53이다.
        b. 개정레벨(Revision Lever)
          개정레벨은 메이저 레벨(Major Level)과 마이너 레벨(Minor Level)로 구성되어 있으며,
         역할은 마운트프로그램이 어떤 특정한 버전에서만 지원되는 기능이 이 파일 시스템에서 지
         원되는 지에 대한 확인을 위해 사용된다. 또한 개정 레벨은 기능 호환성 항목을 포함하여
         마운트 프로그램이 해당 파일 시스템에서 안정적으로 사용할 수 있는 기능이 무엇인지를
         판단할 수 있는 기준을 제공한다.
        c. 마운트 횟수(Mount Count)와 최대 마운트 횟수(Maximum Mount Count)
         시스템은 마운트 횟수와 최대 마운트 횟수의 두 가지 정보를 이용하여 파일 시스템 전체를
         검사할 필요가 있는 지를 확인할 수 있다. 마운트 횟수는 마운트가 실행될 때마다 1씩 그
         값이 증가하며 만약 마운트 횟수가 최대 마운트 횟수에 도달하게 되면 시스템은 e2fsck를
         실행하라는 메시지를 내보낸다.
        d. 블록 그룹 번호(Block Group Number)
          블록 그룹 번호는 슈퍼 블록 복제본을 가지고 있는 블록 그룹의 번호를 나타낸다.
        e. 블록 크기(Block Size)
          블록 크기는 파일 시스템의 블록 크기를 표시한다. 블록 크기는 바이트 단위로 표시된다.
        f. 그룹당 블록 수(Blocks Per Group)
          그룹당 블록 수는 하나의 그룹에 속한 블록의 수를 나타낸다. 이 수는 블록의 크기와 마찬
         가지로 파일시스템을 만들 때 결정된다.
        g. 프리블록(Free Block) : 파일시스템 내부적으로 존재하는 프리블록의 수이다.
        h. 프리 아이노드(Free Inode): 파일시스템 내부적으로 존재하는 프리 아이노드의 수이다.
        i. 첫 아이노드(First Inode): 파일 시스템 내부적으로 존재하는 첫번째 아이노드의 번호를
                                    나타낸다. 리눅스 시스템에서 ext2파일 시스템의 첫번째 아이
                                    노드는 '/'디렉토리에 대한 엔트리를 나타낸다.
     ㄷ. 그룹 기술자(Group Descriptor): 각각의 블록 그룹을 기술하는 자료 구조이다. 그룹기술자
                                       는 슈퍼 블록과 같이 중복되게 블록 그룹에 복제되어 파일
                                       시스템의 파괴에서 안정적인 복구를 지원한다. 각 그룹의
                                       기술자에 저장되는 정보 항목은 다음과 같다.
        a. 블록 비트맵(Blocks Bitmap): 블록 비트맵은 블록 그룹에서 블록의 할당 상태를 나타내
                                      주는 비트맵으로 그 수는 블록의 수와 동일하다. 블록 비트
                                      맵은 블록을 할당하거나 해제할 경우 참고되는 정보이다.
        b. 아이노드 비트맵(Inode Bitmap)
          블록 그룹에서 블록의 아이노드 할당 상태를 나타내 주는 비트맵으로 그 수는 블록 비트맵
         과 같이 블록의 수와 동일하다. 아이노드 비트맵은 아이노드를 할당하거나 해제할 경우 참
         고 되는 정보이다.
        c. 아이노드 테이블(Inode Table)
          아이노드 테이블은 블록 그룹의 아이노드 테이블에서 시작 블록을 나타내며 그 수는 블록
         의 수와 동일하다.
        d. 기타: 프리 블록 개수(Free Block Count), 프리 아이노드 개수(Free Inode Count), 사용
                된 디렉토리 개수(Used Directory Count)가 있다. 그룹기술자(Group Descriptor)는
                연속적으로 나타나서 전체적으로 하나의 그룹 기술자 테이블을 형성하게 된다. 각
                블록 그룹(Block Group)에는 슈퍼 블록 바로 뒤에 그룹 기술자 테이블 전체가 위치
                하게 된다. 하지만 실제로 ext2파일 시스템에서 사용되는 것은 블록 그룹이 '0'인
                첫번째 복사본이다.나머지는 예상치 못한 시스템의 손상에 대비해 시스템 복구를
                준비하고 있을 뿐이다.
     ㄹ. ext2 디렉토리: ext2 파일시스템에서 디렉토리는 파일시스템상에서 파일에 대한 접근 경로를
                       생성하고 저장하는 특별한 의미의 파일로 취급된다. 각각의 디렉토리는 디렉
                       토리의 엔트리의 리스트로 나타낸다.
        a. 아이노드(Inode): 아이노드는 디렉토리 엔트르에 해당하는 Inode를 나타낸다. 아이노드값
                           은 블록 그룹의 Inode테이블에 저장되어 있는 Inode 배열에 대한 인덱스
                           값이다.
        b. 이름 길이(Name Length): 이름길이는 디렉토리 엔트리의 길이를 바이트로 나타낸 것을 의
                                  미한다.
        c. 이름(Name): 디렉토리 엔트리의 이름을 나타낸다.
(2) 저널링(Journaling) 파일시스템
   1) 설명: ext2 시스템은 파일의 내용과 그와 관련된 데이터(보통 메타데이터라고 부르고, 파일의
           위치, 크기, 소유자, 접근 권한등의 파일과 관련된 데이터들을 말한다.)들을 유지하고
           저장하는 체계이다. 그러나 ext2는 파일의 데이터와 메타데이터를 동시에 저장하지 않는
           비동기식 파일시스템이다. 즉, 메타데이터를 파일의 내용이 저장될 때 같이 저장하는 것
           이 아니라 일정 시간 메모리에 두었다가 시간 간격을 두고 저장한다. 이러한 시스템인
           경우 성능상의 장점도 있지만 시스템이 다운되거나 여러 문제가 발생할 경우 파일 시스템
           이 손상되는 단점을 가지게 된다. 또한 이를 위해 ext2는 fsck(File System Check)라는
           파일 시스템 복구 기능을 필요로 하고 복구하는데 시간이 많이 소요된다. 만약 파일 시스
           템의 크기가 크다면 파일시스템을 복구하는데 더욱 오랜 시간이 걸린다. 물론 이 시간
           동안 시스템은 사용할 수 없게 된다. 이러한 문제점을 해결하기 위한 방법중의 하나가 바
           로 데이터베이스에서 쓰이는 저널링 기술을 적용한 저널링 파일시스템이다. 이 기술은 일
           정부분을 기록을 위해 남겨두어, 백업 및 복구 능력이 있는 파일시스템을 말하며, 파일시
           스템 복구시간이 단축된다.
   2) 작동방법: 저널링 파일시스템은 사용자가 데이터를 입력 또는 수정하면 그 데이터를 바로 하드
               디스크에 기록하기 전에 관련 데이터를 로그에 기록한다. 만약 기록중에 정전이나 기
               타 다른 이유로 비정상적인 종료가 되면 다시 부팅할 때 로그에 기록된 데이터를 참
               고로 재작성하거나 복구한다.
   3) 사용부분: 저널링 파일시스템은 빈번한 업데이트를 하는 부분이 적합하다. /var디렉토리와 같
               이 메일 스풀링 및 데이터베이스의 저장공간, 로그 기록 등의 용도로 사용되는 곳이
               효과적이다.
(3) ext3 파일시스템
   1) 설명: ext3 파일 시스템은 ext2파일시스템에 저널링기술을 추가하여 만든 파일시스템이다. ext
           2 파일시스템이 가지고 있는 단점들을 극복하였다. 데이터 무결성은 물론 뛰어난 복구
           기능까지 가질 수 있게 되었다.
   2) ext3 파일시스템으로의 포팅 동기
     etx2 파일 시스템에서는 fsck(File System Check)라는 기능으로 파일시스템을 복구한다. 그러
    나, 이 fsck는 시간이 많이 걸린다는 단점이 있다. 특히 요즘 같은 대용량 하드디스크가 보편화
    되어 있는 상황에서는 더욱 그러하다. 또한 fsck는 시스템이 비정상적으로 셧다운되어 파일시스
    템에 손상이 되었을 경우 이외에도 슈퍼블록에 마운트 횟수를 저장하는 영역이 있어 마운트 횟
    수가 일정횟수 이상이 될 경우에는 자동으로 fsck를 실행해 오랜시간 동안 시스템을 사용할 수
    없게 되는 단점도 가지고 있다. 또한 ext2는 기능적인 측면보다는 파일 시스템의 효율과 퍼포먼
    스에 중점을 두고 디자인된 파일시스템이다. 그래서, ext2는 파일의 내용과 파일에 대한 허가권,
    소유권, 생성과 접근 시간과 같은 메타 데이터를 동기화하지 않는다.이럴 경우 만약 파일의 내용
    을 수정하는 도중에 시스템에 문제가 생길 경우 해당 파일의 메타데이터와 내용이 일치하지 않는
    문제점이 발생하게 된다. 따라서 이러한 문제점을 보안하기 위해서 저널링(Journaling)기술을
    이용한 ext3파일시스템이 대두된 것이다.
(3) 기타 저널링 파일시스템
   1) ReiserFS
     Reiser파일시스템은 독일의 한스 라이져(Hans Reiser)가 개발한 저널링 파일시스템으로 모든 파
    일 객체들을 단일 B트리에 저장하는 데 그 트리가 지원하는 사항으로 동적인 Inode 할당, 간결하
    고 색인화된 디렉토리, 크기 재조정이가능한 아이템, 60비트 오프셋 등이 있다. 트리에는 기본적
    인 4가지 형태의 아이템이 있는데, 이 4가지는 stat 데이터, 직접적인 아이템, 간접적인 아이템,
    디렉토리 아이템이 있다. 아이템은 키를 검색해 찾게 되는데 키에는 ID, 사용자가 찾으려 하는
    객체의 오프셋, 그리고 아이템타입에 대한 정보가 있다. Reiser파일시스템 디렉토리는 콘텐츠가
    변함에 따라서 늘어나기도 하고 줄어들기도 한다. 파일 이름의 해시데이터는 디렉토리에서 엔트
    리의 오프셋을 일정하게 유지하는데 이용된다. 이와 같이 해시데이터를 인덱싱하는 트리는 별다
    른 성능의 손실없이도 매우 큰 디렉토리를 이용할 수 있도록 해준다. 파일의 경우 간접적인 아이
    템은 데이터 블록을 가리키며, 직접적인 아이템은 압축된 파일데이터를 포함하고 있다. 이러한
    압축된 데이터는 트리에 직접 저장되며, 트리노드에서 다른 객체의 아이템과 공간을 경유하게
    된다. 따라서 대용량 파일의 경우 Reiser파일시스템은 ext2파일시스템이 사용하는 것과 유사한
    블록포인터를 저장하고 있지만, 작은 파일의 경우에는 데이터를 모으고 압축해서 공간 낭비를
    줄인다. 이러한 모든 아이템들은 트리를 재조정하면 크기를 변화시킬 수 있다. 사용자는 압축된
    파일에 데이터를 추가할 수도 있고, stat데이터에서 또 다른 필드가 필요한 경우 새로운 정보를 \
    포함할 수도 있다.
   2) JFS: IBM에서 독자적으로 개발한 저널링 파일시스템이다.
   3) XFS: SGI(실리콘 그래픽스)에서 개발한 저널링 파일시스템이다.

5. 파일시스템의 점검 및 고치기
(1) 설명: ext2파일시스템을 사용하면서 비정상적인 종료시에는 재부팅과정을 거치면서 파일시스템
          을 체크하도록 되어 있다. 체크하면서 아무런 문제가 없으면 OK 사인이 떨어지지만 문제가
          발생하는 경우에는 root패스워드를 입력하라는 화면이 나타나면서 부팅을 멈추게 된다.
          ext3파일시스템은 자동으로 복구가 되도록 되어있지만 ext2파일시스템은 상황에 따라 관리
          자가 파일시스템인 복구시에 사용하는 e2fsck명령으로 복구해야 한다.
(2) 파일시스템손상과 복구
   1) 파일시스템의 복구가 쉬운 경우: 이 경우에 /etc/fstab파일에 check가 설정되어 있으면 자동
                                    으로 복구시킨다.
    ㄱ. 참조되지 않은 inode
    ㄴ. 납득할 수 없이 큰 링크의 갯수
    ㄷ. 블록맵에 기록되지 않거나 사용되지 않는 데이터블록
    ㄹ. 파일에서 사용하고 잇지만 비어있다고 기록된 데이터블록
    ㅁ. 슈퍼블록에서 부정확한 요약정보
   2) 파일시스템의 복구가 어려운 경우 : e2fsck같은 명령어를 이용하여 수동복구해야 한다.
    ㄱ. 하나이상의 파일이 요구되는 블록
    ㄴ. 파일시스템의 범위밖에서 요구하는 블록
    ㄷ. 너무 작은 링크의 개수
    ㄹ. 셀수없는 블록
    ㅁ. 할당되지 않는 inode를 가리키는 디렉토리
    ㅂ. 다양한 포맷 에러

출처 : 대전국제IT교육센터 정성재 강사

 

1. Shell 프로그래밍의 개요
(1) 개요
   1) 사용자가 임의로 Shell파일을 만들어 필요시 마다 그 파일을 호출하여 실행한다.
   2) Shell은 보통언어가 가지고 있는 기본적인 특성을 가지므로 Shell을 이용하여 사용자 환경에
     맞도록 프로그래밍을 할 수 있다.
   3) Shell파일을 이용한 프로그램을 Shell프로그램 또는 Shell스크립트라고 한다.
   4) Shell프로그램의 수행방법
     ㄱ. chmod를 이용하여 수행하고자 하는 Shell파일에 실행권한을 부여한다.
     ㄴ. Shell파일에 인수를 주어 sh명령을 준다.
(2) 쉘스크립트 생성하는 법
   1) 첫라인에 사용할 쉘을 명시한다. bash쉘을 사용할 경우 보통 첫줄에 다음과 같이 표기한다.
     #!/bin/bash
   2) 스크립트를 실행 가능한 파일로 만든다.
(3) 실행예
   1) 예1
     ㄱ. [posein@www posein]$ cat sample1
         echo "sample1"
           => vi 편집기를 이용하여 입력한다.
         [posein@www posein]$ ls -l sample1
         -rw-rw-r--    1 posein   posein         15 Jun 25 02:49 sample1
           => 현재 실행권한이 없으므로 실행시킬 수가 없다.
         [posein@www posein]$ chmod 755 sample1
           => 실행권한을 부여하였다.
         [posein@www posein]$ ./sample1
         sample1
           => 현재디렉토리에 경로로 설정이 안되어 있으므로 './'를 붙여서 실행시켜야 한다.
     ㄴ. [posein@www posein]$ sh sample1
         sample1
          => 실행권한이 없더라도 앞에 'sh'를 붙여서 실행시킬 수 있다.
   2) 예2 : #!/bin/bash를 명기


2. Shell 프로그래밍 기초
(1) 리다이렉션과 파이프
   1) 다중명령어 사용
    ㄱ. 한 라인에 여러 개의 명령을 입력하면 여러 명령을 수행한다.
    ㄴ. 순차적으로 명령들을 수행할 때 명령들의 구분자는 ';'이다.
    ㄷ. 동시에 명령들을 수행할 때 명령들의 구분자는 '&'이다.
    ㄹ. 사용예
      a. [posein@www posein]$ date; ls -l; whoami
           => 순서대로 실행된다.
      b. [posein@www posein]$ date& ls -l& whoami
           => 동시에 실행된다.
   2) 입출력방향의 재지정
    ㄱ. 표준입출력
       -표준입력(stdin) : 내용입력, 0으로 표기
       -표준출력(stdout) : 내용출력, 1으로 표기
       -표준에러(stderr) : 에러메시지, 2로 표기
    ㄴ. 리다이렉션심볼
       < : 존재하는 파일로 부터 표준입력으로 읽음 (program < input)
       > : 표준 출력으로 파일에 씀 (program > output)
       >> : 존재하는 파일에 표준출력으로 추가함 ( program >> output)
    ㄷ. 입력재지정
      a. 설명: 키보드로부터 명령을 읽는 대신 파일에서 명령을 읽을 때 사용한다.
      b. 입력재지정 기호 : "<"
      c. 사용법
        command < file
      d. 사용예
        [posein@www posein]$ cat red
        ps
        ls
        [posein@www posein]$ sh < red
          PID TTY          TIME CMD
        25289 pts/1    00:00:00 bash
        25581 pts/1    00:00:00 sh
        25582 pts/1    00:00:00 ps
        Desktop  bbb
    ㄹ. 출력재지정
     a. 설명: 명령의 출력을 터미널에 연결하는 대신 파일로 저장할 때 사용한다.
     b. 출력재지정기호 : ">"
     c. 사용법
       command > file
     d. 사용예
       [posein@www posein]$ ls > red2
       [posein@www posein]$ cat red2
       Desktop/
       aaa*
       aaa.sh*
    ㅁ. 출력재지정 추가
     a. 설명: 출력을 파일의 끝에 추가하고자 할 때 사용한다.
     b. 출력재지정기호 : ">>"
     c. 사용법
       command >> file
     d. 사용예
       [posein@www posein]$ ls -l >> red2
    ㅁ. 표준에러 재지정
     a. 설명: 에러메시지를 터미널에 출력하지 않고 파일로 저장할 때 사용한다.
     b. bashd인 경우
       command 2 > errfile
        => 표준에러를 errfile에 저장한다.
       (command > file) 2 > errfile
        => 표준출력은 file에, 에러는 errfile에 저장한다.
     c. C shell인 경우
       command >& errfile
        => 표준에러를 errfile에 저장한다.
       (command > file) >& errfile
        => 표준출력은 file에, 에러는 errfile에 저장한다.
     d. 사용예
       1. [posein@www posein]$ ls -z
          ls: invalid option -- z
          Try `ls --help' for more information.
          [posein@www posein]$ ls -z 2>errfile
          [posein@www posein]$ cat errfile
          ls: invalid option -- z
          Try `ls --help' for more information.
       2. [posein@www posein]$ (ls -z > file) 2>errfile2
          [posein@www posein]$ cat file
          [posein@www posein]$ cat errfile2
          ls: invalid option -- z
          Try `ls --help' for more information.
       3. C Shell에서의 표준에러지정
          [posein@www ~]$ ls -z >& errfile
          [posein@www ~]$ cat errfile
          ls: 부적절한 옵션 -- z
          더 많은 정보를 얻으러면 `ls --help'명령을 하십시오.
       4. C Shell에서 표준출력과 표준에러지정
          [posein@www ~]$ ( ls -z > file2) > & errfile3
   3) 파이프
    ㄱ. 파이프를 사용하면 여러 프로세스를 함께 사용할 수 있다.
    ㄴ. 파이프로 연결된 프로세스는 동시에 수행될 수 있으며, 이 프로세스들 사이의 데이터 흐름은
       자동적으로 다시 계획된다.
    ㄷ. 사용법
       program1 | program2 | .....
    ㄹ. 사용예
       1. [posein@www posein]$ ps | sort | more
            PID TTY          TIME CMD
          25289 pts/1    00:00:00 bash
          25649 pts/1    00:00:00 ps
          25650 pts/1    00:00:00 bash
          25651 pts/1    00:00:00 bash
       2. [posein@www posein]$ ps | sort | more > ps.txt
            => 리다이렉션과 함께 사용하여 파일로 저장할 수도 있다.

3. Shell 프로그래밍 문법

(1) 주석
   1) 설명: 주석은 '#'을 이용하며 해당라인 끝까지 처리된다. 이 부분은 쉘실행시 무시되며, 보통
           프로그램에 대한 이해를 돕기위해 사용된다.
   2) 사용예
     #!/bin/sh
     # Auth: posein
     # Work : hello world 를 출력한다.

     echo "hello world"   # 문자열을 출력한다
(2) 변수
   1) 설명: 변수는 모든 프로그래밍언어의 가장 기본이 되는 요소로 어떠한 데이터를 저장하는 공간
           이다. 쉘에서 변수의 타입은 문자열(string)만을 가지면 C언어처럼 변수타입선언이 필요
           없다. 참고로 perl, python, php등도 변수타입선언이 불필요하다.
   2) 사용법
     var=value
      => 변수를 사용할 때는 변수명앞에 $을 붙인다. 또한 변수에 데이터를 저장할 때는 대입연산자인
        '='를 사용하며 대입연산자, 연산자/피연산자 사이에는 공백이 존재해서는 안된다. 또한 변수
        명은 -를 제외한 특수문자와 숫자로 시작해서는 안된다.
   3) 기타변수 대응법
     ㄱ. ${name} : name이라는 변수에 들어있는 값으로 치환한다.(변수명 다음에 다른 문자가 연이
                  어 나올때 유용)
     ㄴ. ${name:=value} : name이 null이면 value로 할당하여 저장하고, 아니면 그냥 기존의 값으로
                         치환한다.(기본값을 지정할 때 유용)
     ㄷ. ${name:+value} : 기존의 name이 null이 아니라면 value를 사용하지만 name에 저장하지는
                         않는다.
     ㄹ. ${name:-value} : 기존에 name값이 있다면 value를 기본값으로 하고  없다면 value반환.
                         name에 value값을 저장하지는 않는다.
     ㅁ. ${name:?value} : 기존에 name값이 있다면 기본값으로 하고 없으면 error를 내면서 value
                         값을 보여준다.
     ㅂ. ${#name} : name의 문자열 길이를 반환
     ㅅ. ${name:offset} : name값에서 offset만큼 삭제한 후에 값을 돌려준다.
     ㅇ. ${name:offset:length} : name값에서 offset만큼 삭제한 후에 length만큼 센 뒤 돌려준다.
   4) 환경변수
    ㄱ. $HOME: 사용자의 홈디렉토리
    ㄴ. $PATH: 명령어 찾기에 사용되는 콜론(:)으로 구분되는 디렉토리 목록
    ㄷ. $LOGNAME: 사용자의 로그인명($USER)
    ㄹ. $MAIL or $MAILPATH: 메일도착을 알고자 할때 사용되는데 둘 중 하나만 지정, $MAIL이 지정
                           되면 메일이 도착할 파일명이 지정되어야 하고 $MAILPATH가 지정되면
                           콜론(:)으로 분리된 메일 파일의 리스트이여야 한다. 메일프로그램이
                           메일을 어디에 놓아야 하는지를 지정하지는 않지만 새로운 메일이 도착
                           하면 Shell이 어디를 찾아야 하는지를 지정한다.
    ㅁ. $MAILCHECK: 메일 파일을 검사하는 초단위 설정
    ㅂ. $SHELL: 로그인 Shell명
    ㅅ. $PS1: Shell이 사용할 첫번째 프롬프트 스트링, 보통은 $
    ㅇ. $PS2: 두번째 프롬프트 스트링, 명령이 완전히 끝나지 않고 Shell이 또 다른 입력행을 요구
             할 경우 사용, 보통 >
    ㅈ. $TERM: 사용자의 터미널형을 포함, vi같은 어떤 명령은 정확한 결과를 나타내기 위해 사용
              중인 터미널의 종류를 나타냄.
    ㅊ. $IFS: 입력필드 구분자, Shell상에서 입력을 읽어들일 때 글자를 구분하기 위한 목적으로
             사용되는 문자 목록, 보통은 스페이스, 탭, 개행문자임.
   5) 아규먼트 변수: 특별한 내장변수로 '위치 매개변수(positional parameter)'라고도 한다. 이
                    변수는 매개변수를 불러올 때 스크립트의 명령행 인자를 담당한다. 위치 매개
                    변수는 그 이름이 1, 2, 3등으로 되어 있고 그 값을 각각 $1, $2, $3등으로
                    표시하고 0은 스크립트 파일명을 뜻한다.
    ㄱ. $0 : 실행된 쉘 스크립트이름
    ㄴ. $1 : 스크립트에 넘겨진 첫번째 아규먼트
    ㄷ. $2 : 스크립트에 넘겨진 두번째 아규먼트
    ㄹ. $# : 스크립트에 넘겨진 아규먼트의 개수
    ㅁ. $$ : 쉘스크립트의 프로세스ID
    ㅂ. $* : 스크립트에 전달된 인자 전체를 하나의 변수에 저장하며 IFS환경변수의 첫번째 문자로
            구분
    ㅅ. $@ : $*와 동일(다른점은 IFS환경변수를 사용하지 않음)
    ㅇ. $? : 실행한 뒤의 반환(return)값, 즉 참이면 0, 거짓이면 1이 반환됨
    ㅈ. $- : 현재 Shell이 호출될 때 사용한 옵션들
   6) 사용예
    ㄱ. test.sh
       #!/bin/sh
       # 변수에 값을 할당한다.
       a="hello world"
       # 이제 a라는 변수에 등록된 값을 화면에 출력한다.
       echo "a is : $a"
        => 실행파일로 만들어서 실행시키면 'a is : hello world'가 출력된다.
    ㄴ. test2.sh
       num=2
       echo "this is the $numnd"
         => 원하는 값이 "this is the 2nd" 이다. 그러나 위의 예제를 실행시키면 "this is the "
           라는 문자열이 출력된다. 왜냐면 쉘은 "numnd"를 하나의 변수명으로 생각하기 때문이다
           만약 원하는 값을 출력하려면 아래와 같이 바꿔야 한다.
    ㄷ. test3.sh
       num=2
       echo "this is the ${num}nd"
        => 'this is the 2nd' 라고 출력된다.
    ㄹ. [posein@www posein]$ cat var
        var=
        ${var:=ls}
        echo $var
         => var가 null이므로 값에 ls가 들어가면서 해당 명령이 실행된다.
    ㅁ. [posein@www posein]$ echo $DIR

        [posein@www posein]$ echo ${DIR:-temp}
        temp
        [posein@www posein]$ echo $DIR

    ㅂ. [posein@www posein]$ DIR=tmp
        [posein@www posein]$ echo ${DIR:+temp}
        temp
        [posein@www posein]$ echo $DIR
        tmp
    ㅅ. [posein@linux67 posein]$ string1=linux
        [posein@linux67 posein]$ string2=window
        [posein@linux67 posein]$ test $string1 = $string2
        [posein@linux67 posein]$ echo $?
        1
         => $?은 값이 참이면 0, 거짓이면 1을 출력한다.
    ㅇ. [posein@www posein]$ cat test4.sh
         #!/bin/bash
         echo "This script file $0"
         echo "Argument Count is $#"
         echo "Process ID is $$"
         echo "Argument List \$* : $*"
         echo "Argument List \$@ : $@"
         echo "Argument 1: $1"
         echo "Argument 2: $2"
         echo "Argument 3: $3"
         [posein@www posein]$ ./test4.sh a b c
         This script file ./test4.sh
         Argument Count is 3
         Process ID is 31779
         Argument List $* : a b c
         Argument List $@ : a b c
         Argument 1: a
         Argument 2: b
         Argument 3: c
    ㅈ. $@와 $*의 차이점
       [posein@www posein]$ cat ii1
       #!/bin/bash
       IFS=,
       echo "$@"
       [posein@www posein]$ cat ii2
       #!/bin/bash
       IFS=,
       echo "$*"
       [posein@www posein]$ ./ii1 a b c
       a b c
       [posein@www posein]$ ./ii2 a b c
       a,b,c
        => $*는 IFS를 사용하고 $@는 IFS를 사용하지 않는다.
    ㅊ. [posein@www posein]$ count=Ilovebash
        [posein@www posein]$ echo ${count:5}
        bash
        [posein@www posein]$ echo ${count:5:2}
        ba
   7) Shell변수의 출력
    ㄱ. set: 현재 정의되어 있는 모든 변수와 그 값을 출력
    ㄴ. env: export된 변수의 값만 출력
    ㄷ. exoprt:
      a. 설명: 특정변수의 범위를 환경 데이터 공간으로 전송하여 자식프로세스에서도 그 특정변수
              를 사용 가능하게 함.
      b. 특징
        - Shell프로그램이 호출될 때 export를 사용한 모든 변수에 대한 복사가 만들어져 호출된
          프로그램으로 전달되게 하여 변수의 범위를 확대시킨다.
        - 인자가 없는 export명령은 export된 변수의 리스트를 얻을 수 있다.
        - 서브 Shell에서 수정된 환경변수값은 부모 Shell에 영향을 주지 못한다.
        - 서브 Shell에서 변수를 export하면 export된 변수는 그 다음 서브 Shell에 영향을 준다.
    ㄹ. 예제
          [posein@www posein]$ cat main
          echo shell programming
          name=test
          city=seoul
          echo name is $name
          echo city is $city
          export name
          ./sub
          echo stop main
          [posein@www posein]$ cat sub
          echo start sub
          echo name is $name
          echo city is $city
          echo stop sub
          [posein@www posein]$ ./main
          shell programming
          name is test
          city is seoul
          start sub
          name is test
          city is
          stop sub
          stop main
   8) 정의된 변수의 제거
    ㄱ. unset 변수명
       => 변수의 값을 널(Null)로 만드는 것이 아니라, 존재하지 않게 한다.
    ㄴ. readonly 변수명
       => 읽기전용 변수로 되어 삭제할 수가 없다.(로그아웃할 때까지 적용된다.)
    ㄷ. 예
       1. [posein@www posein]$ str1=test1
          [posein@www posein]$ echo $str1
          test1
          [posein@www posein]$ unset str1
          [posein@www posein]$ echo $str1
       2. [posein@www posein]$ str2=test2
          [posein@www posein]$ readonly str2
          [posein@www posein]$ echo $str2
          test2
          [posein@www posein]$ str2=test3
          bash: str2: readonly variable
          [posein@www posein]$ echo $str2
          test2
   9) echo문과 escape문자
    ㄱ. 설명: echo문은 라인을 제어하는 명령해석기이며 -e옵션과 같이 \으로 시작하는 escape
             특수문자를 사용할 수 있다.
    ㄴ. 종류
       \b : Backspace
       \c : 새로운 라인의 생성을 억제(bash에서는 안됨)
       \f : Formfeed
       \n : 새로운 라인을 생성
       \r : Carrage Return
       \t : Tab문자
       \\ : Backslash
    ㄷ. 사용예
       [posein@www posein]$ echo "Hi\nHello"
       Hi\nHello
       [posein@www posein]$ echo -e "Hi\nHello"
       Hi
       Hello
   10) 특별구문: expr
    ㄱ. expr은 명령라인에 있는 표현식을 평가한다.
    ㄴ. 수학적인 표현식(+, -, *, /)을 계산하고 표준출력에 결과값을 출력한다.
    ㄷ. 결과값은 역인용부호(`)에 의해 다른 변수에 저장가능하다.
    ㄹ. expr명령은 수식의 연산자 앞 뒤에 반드시 공백이 필요하다.
    ㅁ. 정확한 정수 연산시 사용되고 소수점 계산은 불가능
    ㅂ. 예제
      a. [posein@www posein]$ expr 1 + 2
         3
      b. [posein@www posein]$ int=100
         [posein@www posein]$ expr 100 + $int + 10
         210
      c. [posein@www posein]$ int=0
         [posein@www posein]$ result='expr $int + 5'
         [posein@www posein]$ echo $result
         expr $int + 5
         [posein@www posein]$ result=`expr $int + 5`
         [posein@www posein]$ echo $result
         5
          => 단일 인용부호(' ')를 사용하면 둘러싸인 전체가 변수에 저장되며 역인용부호(` `)를
            사용하면 연산결과가 변수에 저장된다.
      d. [posein@www posein]$ expr 3 * 5
         expr: syntax error
         [posein@www posein]$ expr 3 \* 5
         15
           => *만 사용하면 특수문자로 인식하여 에러가 발생한다. 따라서 *앞에 \를 사용하여 특수
             문자의 의미를 제거하거나 인용부호인 " "나 ' '를 사용해야 한다.
      e. [posein@www posein]$ expr 10 / 3
         3
          => /는 나누어서 몫을 구한다.
      f. [posein@www posein]$ expr 10 % 3
         1
          => %는 나누어서 나머지를 구한다.
   11) 변수타입지정: decalre 와 typeset
    ㄱ. 설명: 이 두 명령은 내장명령으로 동의어이다. 역할은 변수의 특성을 제한한다. declare
             명령어는 bash 버전 2이후부터 가능하고 typeset명령은 ksh스크립트에서도 가능하다.
             declare명령을 아무 옵션없이 실행하면 모든 변수값을 출력한다.
    ㄴ. 사용법
       declare [option] [변수=변수값]
    ㄷ. option
       -r : 읽기전용으로 취급한다. readonly로 선언하는 것과 같다.
       -i : 정수로 취급한다.
       -a : 배열로 취급한다.
       -f : 정의된 함수의 목록을 출력한다.
       -F : 정의된 함수의 이름만을 출력한다.
       -x : export시켜서 외부환경에서도 이 변수를 사용할 수 있게 해준다.
    ㄹ. 사용예
     a. [posein@www posein]$ declare
          => 정의된 변수와 함수 등을 보여준다.
     b. [posein@www posein]$ declare -f
        declare -f popd ()
        {
          DIR_STACK=${DIR_STACK#* };
          cd ${DIR_STACK%% *};
          echo "$PWD"
        }
        declare -f pushd ()
        {
          dirname=$1;
          DIR_STACK="$dirname ${DIR_STACK:-$PWD''}";
          cd ${dirname:?"missing directory name."};
          echo "$DIR_STACK"
        }
          => 정의된 함수명과 함수를 출력한다. -f옵션뒤에 함수명을 명기하면 해당 함수에 대한
            정보만을 출력한다.
     c. [posein@www posein]$ declare -F
        declare -f popd
        declare -f pushd
     d. [posein@www posein]$ val1=3 val2=5
        [posein@www posein]$ result1=val1*val2
        [posein@www posein]$ echo $result1
        val1*val2
        [posein@www posein]$ declare -i val3=3 val4=5
        [posein@www posein]$ declare -i result2
        [posein@www posein]$ result2=val3*val4
        [posein@www posein]$ echo $result2
        15
(3) 인용부호
   1) 설명: 쉘에는 특별한 의미를 가지고 있는 특수문자들이 있는데, 이를 메타문자(meta character
           )라고도 한다. 이러한 특수문자를 문자그대로 사용하고자 할 때 즉, 문자나 단어의 특별
           한 의미를 없앨 때 인용부호를 사용할 수 있다.
   2) 종류
     ㄱ. single quotes(' '): 문자열로 표기(변수명 자체를 문자열로 표기)
     ㄴ. double qutoes(" "): 문자열로 표기(변수값을 하나의 인자로 인식, 즉 $, `, \는 문자열에서
                            제외됨)
     ㄷ. backslash(\) : 문자의 특수한 기능을 제거
     ㄹ. back quotes(` `) : 명령어로 인식
   3) 사용예
     ㄱ. [posein@www posein]$ echo 'My Home Directory is $HOME'
         My Home Directory is $HOME
          => $HOME을 그냥 문자열로 취급한다.
     ㄴ. [posein@www posein]$ echo "My Home Directory is $HOME"
         My Home Directory is /home/posein
          => $HOME의 값을 출력한다. (" "는 $, `, \의 특수한 기능을 인정)
     ㄷ. [posein@www posein]$ echo "My Home Directory is \$HOME"
         My Home Directory is $HOME
          => \의 특수한 기능을 제거하여 $를 문자열화 하여 $HOME가 출력된다.
     ㄹ. [posein@www posein]$ echo 'My Home Directory is \$HOME'
         My Home Directory is \$HOME
          => ' '는 모든 특수문자를 무조건 문자열처리하므로 그대로 출력된다.
     ㅁ. [posein@www posein]$ echo "Current Directory is `pwd`"
         Current Directory is /home/posein
          => ` `는 명령어가지고 있는 기능을 인정한다. 역시 " "입장에서 봤을 때 ` `의 특수한
            기능을 인정한다.
     ㅅ. [posein@www posein]$ name=posein
         [posein@www posein]$ echo $name
         posein
          => name의 값인 posein을 출력한다.
         [posein@www posein]$ echo \$name
         $name
          => \는 바로 다음 문자의 특수한 기능을 문자열로 전환시킨다.
         [posein@www posein]$ echo \\$name
         \posein
          => 역시 \는 바로 다음에 나오는 \의 특수한기능을 없앤다.
(4) 간단한 조건문
   1) 설명: test명령을 기본으로 보통 if문과 같이 사용된다. 보통 test라고 입력하지만 보통 쉘
           스크립트상에서는 test라는 명령어를 생략하고 [ ] 로 한다. 이러한 테스트 조건들은
           '['와 ']'사이에 쓰면되고, '['과 ']'사이에는 반드시 공백문자가 들어가야 한다.
   2) 사용법
     test 표현식
     [ 표현식 ]
   3) 표현식
     ㄱ. 문자열비교
        a. [ string ] : string이 빈 문자열이 아니라면 참
        b. [ string1 = string2 ] : 두 문자열이 같다면 참
        c. [ string1 != string2 ] : 두 문자열이 다르면 참
        d. [ -n string ] : 문자열이 null(빈문자열)이 아니라면 참
        e. [ -z string ] : 문자열이 null(빈문자열)이면 참
     ㄴ. 산술비교
        a. [ expr1 -eq expr2 ] : 두 표현식 값이 같다면 참(Equal)
        b. [ expr1 -ne expr2 ] : 두 표현식 값이 같지 않다면 참(Not Equal)
        c. [ expr1 -gt expr2 ] : expr1 > expr2 이면 참(Greater Then)
        d. [ expr1 -ge expr2 ] : expr1 >= expr2 이면 참(Greater Equal)
        e. [ expr1 -lt expr2 ] : expr1 < expr2 이면 참(Less Then)
        f. [ expr1 -le expr2 ] : expr1 <= expr2이면 참(Less Equal)
        h. [ ! expr ] : expr이 참이면 거짓, 거짓이면 참
        i. [ expr1 -a expr2 ] : expr1 AND expr2의 결과, 즉 둘 다 참이면 참
        j. [ expr1 -o expr2 ] : expr1 OR expr2의 결과, 즉 둘 중 하나만 참이면 참
     ㄷ. 파일조건
        a. [ -b FILE ] : FILE이 블럭디바이스이면 참
        b. [ -c FILE ] : FILE이 문자디바이스이면 참
        c. [ -d FILE ] : FILE이 디렉토리이면 참
        d. [ -e FILE ] : FILE이 존재하면 참
        e. [ -f FILE ] : FILE이 존재하고 정규파일이면 참(호환성 문제로 -e보다 -f가 주로 사용)
        f. [ -g FILE ] : FILE에 SGID가 있으며 참
        g. [ -k FILE ] : FILE에 Sticky bit가 있으면 참
        h. [ -L FILE ] : FILE이 심볼릭링크이면 참
        i. [ -p FILE ] : Named pipe이면 참
        j. [ -r FILE ] : 현재 사용자가 읽을 수 있는 파일이면 참
        k. [ -s FILE ] : 파일이 비어있지 않으면 참
        l. [ -S FILE ] : 소켓디바이스이면 참
        m. [ -t FD ] : FD(File Descriptor)가 열려진 터미널이면 참
        n. [ -u FILE ] : FILE에 SUID가 있으면 참
        o. [ -w FILE ] : 현재사용자가 쓸 수 있는 파일(writable file)이면 참
        p. [ -x FILE ] : 현재사용자가 실행할 수 있는 파일(Excute file)이면 참
        q. [ -O FILE ] : FILE의 소유자가 현재 사용자이면 참
        r. [ -G FILE ] : FILE의 그룹이 현재 사용자의 그룹과 같으면 참
        s. [ FILE1 -nt FILE2 ] : FILE1이 FILE2보다 새로운 파일(최근의 파일)이면 참
        t. [ FILE1 -ot FILE2 ] : FILE1이 FILE2보다 오래된 파일이면 참
        u. [ FILE1 -ef FILE2 ] : FILE1이 FILE2의 하드링크, 즉 I-node값이 같으면 참
   4) 사용예
    ㄱ. [posein@www posein]$ cat test5.sh
        if [ -d data ]
        then
        cd data
        echo "data's File List"
        ls
        fi
         => 현재 디렉토리에 data라는 디렉토리가 존재할 경우 data's File LIst라는 문자열과
            함께 파일의 리스트를 보여준다.
    ㄴ. [posein@www posein]$ cat test6.sh
        [ "$LOGNAME" = "root" ]
        echo $?
        [posein@www posein]$ ./test6.sh
        1
         => 로그인한 사용자가 root가 아니므로 반환값이 1, 즉 거짓이다.
    ㄷ. [posein@www posein]$ cat test7.sh
        [ "$LOGNAME" = "posein" ]
        echo $?
        [posein@www posein]$ ./test7.sh
        0
         => 로그인한 사용자와 일치하므로 반환값이 0, 즉 참이다.
    ㄹ. [posein@linux67 posein]$ test 20 -gt 30
        [posein@linux67 posein]$ echo $?
        1
        [posein@linux67 posein]$ test 20 -lt 30
        [posein@linux67 posein]$ echo $?
        0
(5) 목록
   1) 설명: 여러 명령을 실행할 때 앞의 명령의 결과에 의해서 다음행도 결정되어야 할 경우가 있
           다. 이런 경우에 AND나 OR조건을 사용해서 한번에 처리할 수 있다. 이것은 쉘스크립트
           뿐만아니라 명령행에서도 사용가능하다. if문을 사용하는 것보다 간결하다.
   2) 종류
    ㄱ. &&
      a. 설명: AND를 의미한다. &&는 왼쪽 문장이 참이면 오른문장을 실행한다. 수행도중에 결과
              가 거짓이 되면 그 이후의 명령은 수행되지 않는다.
      b. 사용법
        문장1 && 문장2 && 문장3 && .....
      c. 사용예
        [ -f "/etc/shadow" ] && echo "This computer uses shadow passwords"
          => 왼쪽문장이 참이면 오른쪽 문장을 실행시킨다. 즉 /etc/shadow가 존재하면
            "This computer uses shadow passwords"라는 문자열을 출력한다.
    ㄴ. ||
      a. 설명: OR를 의미한다. 각 문장들이 거짓이 나오는 동안에 계속 실행된다. 즉 참이 나오면
              실행을 멈춘다.
      b. 사용법
        문장1 || 문장2 || 문장3 || ...
      c. 사용예
        [posein@icf04 posein]$ cat mail.sh
        #!/bin/sh
        mailfolder=/var/spool/mail/posein
        [ -r "$mailfolder" ] || { echo "Can not read $mailfolder"; exit 1;}
        echo "$mailfolder has mail from : "
        grep "^From " $mailfolder
         => posein이라는 사용자의 메일파일을 검사하여 파일을 읽을 수 없으면 에러메시지와
           함께 종료하고 그렇지 않으면 grep명령을 이용하여 누구한테 메일이 왔는지를 보여
           주는 스크립트이다.
        [posein@icf04 posein]$ ./mail.sh
        /var/spool/mail/posein has mail from :
        From posein  Wed Jun 26 21:50:15 2002
    ㄷ. &&과 ||의 혼용
      a. 설명: &&와 ||는 혼용이 가능하다.
      b. 사용법
        1. && 문장1 || 문장2
         => 조건이 참이면 문장1을 수행하고 조건이 거짓이면 문장2를 수행한다.
        2. && {
               문장1
               문장2
               문장3
              }
           ||
              {
               문장4
               문장5
               문장6
             }
          => 참이냐 거짓이냐에 따라 여러개의 문장을 수행하고 싶을 때는 { }을 사용한다.
      c. 사용예
       [posein@www posein]$ cat test8.sh
       #!/bin/bash
       [ -f /etc/shadow ] && echo "/etc/shadow is existed" || echo "/etc/shadow is not
        existed"
       [posein@www posein]$ ./test8.sh
       /etc/shadow is existed
        => /etc/shadow파일이 존재하면 "/etc/shadow is existed"라는 문자열이 출력되고 존재
         하지 않으면 "/etc/shadow is not existed"가 출력된다. 참고로 root권한자에서 pwunconv
         명령을 내린뒤에 다시 수행시켜보도록 한다.
(6) 조건문
   1) if
    ㄱ. 설명: 참인지 거짓인지를 판단할 때 사용된다. 참이라면 then부분을 실행하고 그렇지 않으
             면 else부분을 실행한다.
    ㄴ. 사용법
      - 형식1(단일 if문)
       
        if [ 조건 ]
        then
         실행문장
        fi

      - 형식2(if ~ else)

        if [ 조건 ]
        then
          실행문장1
        else
          실행문장2
        fi

      - 형식3(if ~ elif) : elif는 else if의 약자로 이 구문은 여러 개 사용해도 무방하다.

        if [ 조건1 ]
        then
           실행문장1
        elif [ 조건2 ]
           실행문장2
        else
           실행문장3
        fi
    ㄷ. 사용예
      a. [posein@icf04 posein]$ cat test.sh
         #!/bin/sh
         if [ "$SHELL" = "/bin/bash" ]
         then
              echo "your login shell is the bash (bourne again shell)"
         else
              echo "your login shell is not bash but $SHELL"
         fi
         [posein@icf04 posein]$ ./test.sh
         your login shell is the bash (bourne again shell)
      b. [posein@linux67 posein]$ cat tt
         if [ "$1" = "rose" ]
         then
          echo ROSE
         else echo FLOWER
         fi
         [posein@linux67 posein]$ ./tt rose
         ROSE
         [posein@linux67 posein]$ ./tt lily
         FLOWER
          => 첫번째 아규먼트값으로 rose가 오면 ROSE가 출력되고 그 외의 경우에는 FLOWER가
            출력된다.
     c. [posein@linux67 posein]$ cat tt2
        if [ "$1" = "rose" ]
        then
          echo ROSE
        elif [ "$1" = "lily" ]
        then
          echo LILY
        else
          echo FLOWER
        fi
        [posein@linux67 posein]$ ./tt2 rose
        ROSE
        [posein@linux67 posein]$ ./tt2 lily
        LILY
        [posein@linux67 posein]$ ./tt2 tulip
        FLOWER
         => 아규먼트에 rose가 오면 ROSE, lily가 오면 LILY, 그 외의 값이 오면 FLOWER가 출력
           된다.
     d. [posein@linux67 posein]$ cat i1
        #!/bin/bash
        echo "읽어들인 파일의 이름은?";read var
        if [ -f $var ]
         then
          echo file
        else
           if [ -d $var ]
             then
               echo directory
           else
               echo "not found"
           fi
        fi
        [posein@linux67 posein]$ ./i1
        읽어들인 파일의 이름은?
        /etc/shadow
        file
     e. [posein@www posein]$ cat i2
        #!/bin/bash
        if test -z "$1"
        then
            echo usage:i2 filename
            exit 1
        fi
        file_size=`wc -c < $1`
        echo the file size $file_size characters
        if test $file_size -le 5120
        then
            echo the file $1 is a small file
        else
            echo the file $1 is a large file
        fi
        [posein@www posein]$ ./i2 /etc/passwd
        the file size 3875 characters
        the file /etc/passwd is a small file
     f. [posein@www posein]$ cat el1
        #!/bin/bash
        echo "Are you man? (y/n)";read var
        if [ "$var" = "y" ]
        then
            echo "You are man"
        elif [ "$var" = "n" ]
        then
            echo "You are woman"
        else
            echo "enter y or n"
        fi
        [posein@www posein]$ ./el1
        Are you man? (y/n)
        y
        You are man
   2) case문
    ㄱ. 설명: 문자열과 일치하는 정규식부분을 찾아 해당하는 정규식 다음에 있는 명령어를 실행시
             킨다. 아래로 계속 내려가면서 문자열에 해당하는 부분을 찾고 보통 맨 마지막에
             나열한 정규식에 해당하지 않는 모든 경우에 해당하는 부분은 *)로 표기한다.
    ㄴ. 사용법
       case 문자열
       in
         정규식1) 명령어1;;
         정규식2) 명령어2;;
       ...
       esac
        => 오른쪽 괄호와 세미콜론은 반드시 사용해야 한다.
    ㄷ. 사용예
     a. [posein@linux67 posein]$ cat tt3
        case $1
        in
          0) echo zero;;
          1) echo one;;
          2) echo two;;
          3) echo three;;
          *) echo greater than four
        esac
        [posein@linux67 posein]$ ./tt3 2
        two
          => 아규먼트와 동일한 정규식을 찾아 해당 명령어를 수행한다.
     b. [posein@www posein]$ cat ca1
        #!/bin/bash
        echo "*********************************************"
        echo "*              보         기                *"
        echo "*********************************************"
        echo "1. who    2. date    3. pwd    4. ls -l     *"
        echo "*********************************************"
        echo "수행하고자 하는 명령어는?(번호를 입력하시오) "
        read number;
        case $number in
          1) who;;
          2) date;;
          3) pwd;;
          4) ls -l;;
          *) echo "없는 번호입니다."
        esac
        [posein@www posein]$ ./ca1
        *********************************************
        *              보         기                *
        *********************************************
        1. who    2. date    3. pwd    4. ls -l     *
        *********************************************
        수행하고자 하는 명령어는?(번호를 입력하시오)
        3
        /home/posein
     c. [posein@www posein]$ cat ca2
        #!/bin/bash
        echo "is it morning? (yes/no)"
        read ans;
        case "$ans" in
             yes | y | Yes | YES)           echo "good morning";;
             no  | n | No | NO)             echo "good afternoon";;
             *) echo "answer not recognize";;
        esac
        [posein@www posein]$ ./ca2
        is it morning? (yes/no)
        n
        good afternoon
   3) select문
    ㄱ. 설명: 이 구문은 다른 쉘에는 없고 콘쉘과 배시쉘에만 존재하는 구문으로 문법이 간결하다.
             구조는 for문과 유사하다.
    ㄴ. 사용법
       select 변수 in 값1, 값2,...
       do
          실행문장
       done
        => in 다음에 나오는 값들이 항목으로 된 메뉴로 생성된다. 이 값들이 생략되면 기본값은
          "$@"가 된다. 형식은 번호를 선택하게 되어 있으며, 사용자에게 번호를 표시해준다.
          "변수"에 선택된 내용을 저장하고 선택된 번호는 내장변수인 REPLY에 저장하고 "실행문장"
           이 실행된다.
    ㄷ.사용예
       [posein@www posein]$ cat sele1
       #!/bin/bash
       echo "What is your favourite OS ?"
       select var in "Linux" "Free BSD" "Windows" "Solaris" "Other"
          do
                break
          done
       echo "You have selected $var"
       [posein@www posein]$ ./sele1
       What is your favourite OS ?
       1) Linux
       2) Free BSD
       3) Windows
       4) Solaris
       5) Other
       #? 1
       You have selected Linux

(7) 반복문: 루프는 지정된 숫자나 몇가지 조건을 만날 때까지 일련의 명령들을 반복적으로 수행할
            수 있게 한다.
   1) for
    ㄱ. 설명: for문은 지정된 범위 안에서 루프를 수행한다. 범위는 어떤 집합도 가능하다. in뒤의
             값1, 값2, ...가 순서대로 지정된 변수에 배정되면서 do이하의 문장을 수행한다. 즉 매
             루프를 돌 때마다 변수의 값은 in이후의 값으로 대체된다.
    ㄴ. 사용법
      for 변수 in 값1, 값2
      do
         실행문장
      done
    ㄷ. 사용예
     a. [posein@linux67 posein]$ cat tt4
        for flower in Rose Tulip Lily
        do
          echo $flower
        done
        [posein@linux67 posein]$ ./tt4
        Rose
        Tulip
        Lily
         => flower라는 변수에 Rose, Tulip, Lily라는 값이 루프를 돌면서 들어가 출력된다.
     b. [posein@linux67 posein]$ cat tt6
        for file in $(ls chap[345].txt)
        do
          echo "-----$file-----" >> book.txt
        cat $file >>book.txt
        done
        [posein@linux67 posein]$ ./tt6
        [posein@linux67 posein]$ cat book.txt
        -----chap3.txt-----
        chap3 Page
        -----chap4.txt-----
        chap4 Page
        -----chap5.txt-----
        chap5 Page
         => chap3.txt, chap4.txt, chap5.txt파일을 book.txt라는 파일에 붙여넣는다.
     c. [posein@www posein]$ cat for1
        #!/bin/bash
        for var in *
        do
          file_size=`wc -c<$var`
          echo $var contains $file_size characters
          if test $file_size -le 5120
          then
               echo the file $var is a small file
          else
               echo the file $var is a large file
          fi
        done
         => for문에서 *는 현재디렉토리에 있는 모든 파일들을 값으로 받아들여 출력한다.
   2) while
    ㄱ. 설명: while뒤의 조건문 동안 do이하의 문장을 실행한다. for구문과 같이 실행 횟수를 지정
              하지 않아도 된다.
    ㄴ. 사용법
       while 조건문
       do
         실행문장
       done
    ㄷ. 사용예
     a. [posein@linux67 posein]$ cat tt7
        var=1
        while [ "$var" -le 5 ]
        do
           echo $var
           var=`expr $var + 1`
       done
       [posein@linux67 posein]$ ./tt7
       1
       2
       3
       4
       5
         => var이 5보다 작거나 같으면 var에 1씩 더한다. 결과는 1,2,3,4,5가 차례로 출력된다.
           참고로 expr은 연산할 때 사용한다.
     b. [posein@linux67 posein]$ cat tt8
        echo "Enter Password: "
        read password1
        echo "Retype Password: "
        read password2
        while [ "$password1" != "$password2" ]
        do
           echo "Password miss match Try again"
           echo "Retype Password: "
        read password
        done
        echo "OK Password Match complete"
          => 패스워드를 두 번 입력하여 두 값이 일치하지 않을 경우, 다시 입력을 요구한다. (물
            론 패스워드로 입력한 문자는 화면에 그대로 출력된다.)
   3) until
    ㄱ. 설명: until은 while문과 동일한 효과를 내지만 조건이 반대이다. 즉, while문은 조건이 참
             일 동안 루프를 수행하지만, until은 거짓일 동안 루프를 수행한다.
    ㄴ. 사용법
       until 조건문
       do
         실행문장
       done
    ㄷ. 사용예
       [posein@linux67 posein]$ cat tt9
       COUNTER=20
       until [ $COUNTER -lt 10 ]
       do
          echo COUNTER is $COUNTER
          COUNTER=`expr $COUNTER - 1`
       done
       [posein@linux67 posein]$ ./tt9
       COUNTER is 20
       COUNTER is 19
       COUNTER is 18
       COUNTER is 17
       COUNTER is 16
       COUNTER is 15
       COUNTER is 14
       COUNTER is 13
       COUNTER is 12
       COUNTER is 11
       COUNTER is 10
         => 20에서 부터 10까지 차례로 출력된다.
(8) 함수
   1) 설명
    ㄱ. 함수란 일종의 '스크립트안의 스크립트'라고 할 수 있다.
    ㄴ. 명령어 그룹을 메모리내에 정의하여 약어의 기능으로 사용할 수 있다. 메모리에 함수가 존재
       함으로서 수행속도를 향상시킨다.
    ㄷ. Shell 스크립트의 크기를 적절히 조절할 경우에 사용하고 코드를 구조화하는데 유리하다.
   2) 사용법
    ㄱ. 함수이름()
        {
           command
        }
    ㄴ. function 함수이름
        {
           command
        }
   3) 사용예
     [posein@www posein]$ cat fun
     #!/bin/bash
     user_print()
     {
       echo "shell programming"
     }
     echo "start user_print"
     user_print
     echo "end user_print"
     [posein@www posein]$ ./fun
     start user_print
     shell programming
     end user_print
   4) 참고할만 명령어
    ㄱ. type
     a. 설명: 주어진 인자가 쉘 스크립트, 함수, 앨리어스인지를 검사하여 출력한다. 기본적으로
             함수이면 정의된 내용까지 모두 출력한다.
     b. 사용법
       type [option] 인자
     c. option
       -all : 해당 인자이름으로 정의된 모든 사항을 출력한다.
       -path : 실행파일이나 쉘 스크립트에 국한되어 결과를 출력한다.
       -type : 여러결과는 인자이름과 일치하는 키워드 하나만을 출력한다.
     d. 사용예
       1. [posein@www shell]$ type pushd
          pushd is a function
          pushd ()
          {
              dirname=$1;
              DIR_STACK="$dirname ${DIR_STACK:-$PWD''}";
              cd ${dirname:?"missing directory name."};
              echo "$DIR_STACK"
          }
       2. [posein@www shell]$ type -all pushd
          pushd is a function
          pushd ()
          {
              dirname=$1;
              DIR_STACK="$dirname ${DIR_STACK:-$PWD''}";
              cd ${dirname:?"missing directory name."};
              echo "$DIR_STACK"
          }
          pushd is a shell builtin
       3. [posein@www shell]$ type -type pushd
          function
       4. [posein@www shell]$ type -all -type pushd
          function
          builtin
(9) 명령실행
   1) 산술확장
    ㄱ. 설명: 산술연산을 하는 expr명령은 실행이 매우 느리기 때문에 사용한다.
    ㄴ. 사용법
       $((...))
    ㄷ. 사용예
       [posein@www posein]$ cat ex1
       #!/bin/bash
       var=0
       while [ "$var" -ne 10 ]
       do
           echo $var
           var=$((var+1))
       done
       exit 0
      [posein@www posein]$ ./ex1
      0
      1
      2
      3
      4
      5
      6
      7
      8
      9
   2) 패턴과 패턴비교
    ㄱ. 설명: 일종의 문자열을 연산하는 것으로 특정한 패턴(pattern)을 놓고 변수의 문자열 값이
             일부분이라도 이 패턴과 일치하는지 검사할 때 쓰인다. 이 패턴에는 와일드카드문자
             (*, ?, [ ]를 포함한 문자세트)를 포함해도 된다.
    ㄴ. 종류
       ${variable#pattern} : 처음부터 pattern과 맞는 variable의 부분을 찾아 이 중 가장 작은
                            부분을 제거하고 나머지를 반환
       ${variable##wpattern} : 처음부터 pattern과 맞는 variable의 부분을 찾아 가장 큰 부분을
                              제거하고 나머지 부분을 반환
       ${variable%pattern} : 끝에서부터 pattern과 일치하는 variable의 최소부분을 제거하고
                            나머지를 반환
       ${variable%%pattern} : 끝에서부터 pattern과 일치하는 variable의 최대부분을 제거하고
                             나머지를 반환
    ㄷ. 사용예
      [posein@www posein]$ cat ex3
      #!/bin/bash
      unset var1
      echo ${var1:-string2}
      var1=string1
      echo ${var1:-string2}
      var1=/etc/sysconfig/network
      echo ${var1#*/}
      echo ${var1##*/}
      var2=/etc/sysconfig/network-script/ifcfg-lo
      echo ${var2%sysconfig*}
      echo ${var2%%sysconfig*}
      exit 0
      [posein@www posein]$ ./ex3
      string2
      string1
      etc/sysconfig/network
      network
      /etc/
      /etc/
(10) 기타관련명령어
   1) read
    ㄱ. 설명: 임의의 자료를 키보드로부터 입력받는 명령어로 read를 사용하며, 연속으로 여러 자료
             를 받을 수도 있다. 아규먼트는 차례대로 1,2,3,...순으로 매겨지고, 실행시킨 스크립
             트 파일 이름의 자체 아규먼트는 0이다.
    ㄴ. 사용법
       read 변수1 [변수2, ....]
    ㄷ. 사용예
       a. [posein@linux67 posein]$ read flower
          rose
           => read flower라고 입력하면 입력받을 수 있는 대기상태가 된다. 그 상태에서 값을 입력
             한다.
          [posein@linux67 posein]$ echo $flower
          rose
           => echo문으로 값을 확인한다.
       b. [posein@linux67 posein]$ read var1 var2
          aaa bbb
          [posein@linux67 posein]$ echo $var2 $var1
          bbb aaa
           => read문을 이용하여 연속적으로 입력받을 수 있다.
       c. [posein@www posein]$ cat read1
          #!/bin/bash
          echo "두 자연수를 입력받아 뺄셈을 하는 프로그램"
          echo "첫번째 자연수는?"
          read int1
          echo "두번째 자연수는?"
          read int2
          if [ $int1 -ge $int2 ]
          then
              expr $int1 - $int2
          else
              expr $int2 - $int1
          fi
          [posein@www posein]$ ./read1
          두 자연수를 입력받아 뺄셈을 하는 프로그램
          첫번째 자연수는?
          6
          두번째 자연수는?
          2
          4
       d. [posein@linux67 posein]$ cat read2
          #!/bin/bash
          echo "당신의 이름을 입력하세요?"
          read str
          echo $str
          [posein@linux67 posein]$ ./read2
          당신의 이름을 입력하세요?
          posein
          posein
   2) echo
    ㄱ. 설명: 해당문자열을 표준 출력에 표시하고 행바꿈을 한다. 만일 문자열이 없으면 행바꿈만
             한다.
    ㄴ. 사용법
       echo [option] [문자열]
    ㄷ. option
      -n : 출력결과에서 행바꿈을 하지 않는다.
      -e : escape문자를 사용할 수 있게 해준다.
    ㄹ. 사용예
     a. [posein@linux67 posein]$ echo HI!
        HI!
     b. [posein@www posein]$ echo -e "Yes\nNo"
        Yes
        No
     c. [posein@www shell]$ cat file6
        #!/bin/bash
        echo -n "ENTER A : "
        read A
        echo -n "ENTER B : "
        read B

        result1=`expr $A + $B`
        result2=`expr $A - $B`
        result3=`expr $A \* $B`
        result4=`expr $A / $B`
        result5=`expr $A % $B`

        echo "A + B = $result1"
        echo "A - B = $result2"
        echo "A * B = $result3"
        echo "A / B = $result4"
        echo "A % B = $result5"
        [posein@www shell]$ ./file6
        ENTER A : 6
        ENTER B : 2
        A + B = 8
        A - B = 4
        A * B = 12
        A / B = 3
        A % B = 0
   3) break
    ㄱ. 설명: for, while, until등의 순환문에서 빠져 나온다.
    ㄴ. 사용법
       break [n]
        => 순환문의 n번째루프에서 빠져나온다.
    ㄷ. 사용예
       [posein@www posein]$ cat br1
       #!/bin/bash
       rm -rf file*
       echo > file1
       echo > file2
       mkdir file3
       echo > file4
       for var in file*
       do
         if [ -d "$var" ]
         then
           break;
         fi
       done
       echo "directory name : $var"
       exit 0
       [posein@www posein]$ ./br1
       directory name : file3
   4) continue
    ㄱ. 설명: for, while, until등의 순환문을 계속해서 실행한다.
    ㄴ. 사용법
       continue [n]
         => n번째 루프를 나타내는 부분은 생략할 수 있다.
    ㄷ. 사용예
       [posein@www posein]$ cat co1
       #!/bin/bash
       rm -rf file*
       echo > file1
       echo > file2
       mkdir file3
       echo > file4
       for var in file*
       do
           if [ -d "$var" ]
           then
               continue
           fi
           echo "file name : $var"
       done
       exit 0
       [posein@www posein]$ ./co1
       file name : file1
       file name : file2
       file name : file4
   5) exit
    ㄱ. 설명: 상태 코드 n가 함께 스크립트를 종료한다. n은 0(성공)이나 0이 아닌 숫자(실패)가
             될 수 있다. 만일 n이 주어지지 않으면 가장 최근에 사용된 명령의 상태코드를 사용
             한다.
    ㄴ. 사용법
       exit [n]
   6) function
    ㄱ. 설명: 함수를 정의한다. 위치 매개변수($1, $2, -)가 명령어부분에서 사용가능하다.
    ㄴ. 사용법
       function 함수명
       {
         명령어
       }
    ㄷ. 사용예
       [posein@linux67 posein]$ cat myfunc
       # function myfunc
       {
         echo "parameter is $1"
       }
       [posein@linux67 posein]$ ./myfunc love
       parameter is love
   7) getopts
    ㄱ. 설명: 명령행 인자를 처리해 올바른지 점검한다. getopts명령은 주로 쉘스크립트 순환문에서
             사용되며 명령행 옵션이 표준 형식에 맞는지를 확인한다. 문자열에는 옵션을 나타내는
             문자들이 포함되며 스크립트가 실행될 때 getopts에 의해 처리한다. 적합한 옵션들은
             하나씩 처리되어 지정된 변수명에 저장된다.
    ㄴ. 사용법
      getopts 문자열 변수명
   8) return
    ㄱ. 설명: 함수정의에서 사용되며 함수가 종료될 때 상태코드 n을 반환한다. 만일 n이 생략되면
             직전에 실행된 명령 상태코드를 반환한다.
    ㄴ. 사용법
       return [n]
   9) set
    ㄱ. 설명: Shell에서 매개인자를 설정한다. 문자열을 공백으로 나누어진 필드로 출력할 때 유용
             하다.
    ㄴ. 사용법
       set 문자열
    ㄷ. 사용예
      a. [posein@www posein]$ set a b c
         [posein@www posein]$ echo $1 $2
         a b
      b. [posein@www posein]$ cat da1
         #!/bin/bash
         echo Date: $(date)
         set $(date)
         echo Date: $6년 $2 $3$1 $4
         exit 0
         [posein@www posein]$ ./da1
         Date: Thu Jul 4 23:36:22 KST 2002
         Date: 2002년 Jul 4Thu 23:36:22
   10) shift
    ㄱ. 설명
     a. 위치 매개변수를 n자리만큼 당긴다.
     b. 만일 n이 생략되면 기본적으로 1이 적용된다. 즉, $2는 $1으로 $3은 $2로 이동한다.
     c. 보통 매개 변수를 처음부터 끝까지 검색하는데 자주 사용한다.
    ㄴ. 사용법
       shift [n]
    ㄷ. 사용예
     a. [posein@www shiftdir]$ cat sh1
        #!/bin/bash

        while [ $# -gt 0 ]
        do
             echo "$# : $*"
             shift
        done
        [posein@www shiftdir]$ ./sh1 a b c
        3 : a b c
        2 : b c
        1 : c
     b. [posein@www shiftdir]$ cat sh2
        #!/bin/bash
        echo $#
        echo $1
        echo $2
        echo $3
        echo $4

        echo "____________________________"
        shift 2

        echo $#
        echo $1
        echo $2
        echo $3
        echo $4
        [posein@www shiftdir]$ ./sh2 a b c d
        4
        a
        b
        c
        d
        ____________________________
        2
        c
        d
     c. [posein@www posein]$ cat sh3
        #!/bin/bash
        echo Date: $(date)
        set $(date)
        while [ "$1" != "" ]
        do
          echo $1
        shift
        done
        exit 0
        [posein@www posein]$ ./sh3
        Date: Thu Jul 4 23:25:24 KST 2002
        Thu
        Jul
        4
        23:25:24
        KST
        2002
   11) source
    ㄱ. 설명: 파일을 읽고 실행한다. 파일이 반드시 실행가능할 필요는 없지만 PATH에 등록되어
             있어야 한다. 점(.)이 source와 같은 기능을 한다.
    ㄴ. 사용법
      source 파일 [인수]
      . 파일 [인수]
   12) eval!
    ㄱ. 설명: 인자의 값을 구하는데 사용
    ㄴ. 사용예
       [posein@www posein]$ cat ev1
       #!/bin/bash
       var1=10
       var2=var1
       eval! result='$'$var2
       echo $result
       [posein@www posein]$ ./ev1
       10
   13) expr
    ㄱ. 설명: 인자로 사용되는 표현식의 값을 구함
    ㄴ. 사용예
       var2=`expr $var +1`
   14) prinft
    ㄱ. 설명: 가장 최근의 shell에서만 사용가능한 명령어로 형식화된 출력을 할 때 사용한다.
    ㄴ. 사용법
       printf "format string" parameter1 parameter2
    ㄷ. format string의 변환식별자
       d : 십진수 출력
       c : 한문자 출력
       s : 문장 출력
       % : %문자 출력
    ㄹ. 사용예
     a. [posein@www posein]$ printf "%s\n" shell
        shell
     b. [posein@www posein]$ printf "%s %d\t%s\n" "shell programming" 100 gogo
        shell programming 100   gogo
   15) true
    ㄱ. 설명: 쉘 상에서 참의 의미를 가지는 0을 반환한다.
    ㄴ. 사용법
       true
    ㄷ. 특징
     a. 쉘 스크립트상에서 무한 루프를 만들 때 등의 경우 사용될 수 있다.
     b. Bourne 쉘 상에서 콜론문자(:)로 같은 효과를 얻을 수 있다. 보통 의미없는 널(Null).명령
    ㄹ. 사용예
     a. [posein@www posein]$ cat tr1
        #!/bin/bash
        while true
        do
          echo "over and over"
        done
     b. [posein@www posein]$ cat tr2
        #!/bin/bash
        rm -f file
        if [ -f file ]
        then
            :
        else
            echo "file did not exist"
        fi
        exit 0
        [posein@www posein]$ ./tr2
        file did not exist
(11) 쉘프로그래밍 기타사항
   1) 종료코드
     0          : 성공
     1 ~ 125    : 에러
     126        : 파일이 실행가능하지 않음
     128 ~ 255  : 시그널이 발생
      => Shell프로그래밍에서는 전역에러코드 변수없이 125개의 사용자 정의 에러코드를 사용할 수
        있다.
   2) 우선순위
    ㄱ. 앨리어스
    ㄴ. function, if, for같은 키워드
    ㄷ. 함수
    ㄹ. cd나 type과 같은 내장 명령
    ㅁ. 스크립트와 프로그램. PATH환경 변수에 들어있는 디렉토리를 쉘이 확인하여 실행한다.

출처 : 대전국제IT교육센터 정성재 강사

 

1. gpg 사용하기
(1) 사용법
   gpg [options] command
(2) command
   --gen-key : 새로운 공개키와 비밀키를 생성한다.
   --list-keys : 설치된 공개키의 리스트를 보여준다.
   --export : 공개키를 다른 사람에게 전달하기 위해서 파일의 형태로 만들어 준다. 기본적으로
              바이너리형태로 만든다. 이 다음에 오는 키의 이름은 위에 생성된 키생성시 입력한
              문자열의 일부나 전체를 사용하도록 한다.
   --import! : 다른 사람의 공개키를 가지고 자신의 gpg에 설치한다.
   --edit-key : 키에 대하여 사인(sign)등의 편집을 한다.
   --encrypt, -e : 자료를 암호화한다.
(3) options
   --outfile 파일명 : '파일명'으로 공개키가 들어있는 파일을 생성한다. 보통 --export와 같이 사용
                    되며 이 옵션을 사용하지 않으면 화면으로 출력으로 출력한다.
   --armor , -a    : 공개키를 ASCII형으로 만든다.
   --encrypt : 암호화하는 옵션이다.
   --recipient : 암호화하는 옵션인 --encrypt과 같이 쓰이며 받는 사람의 공개키를 적는다.
   --decrypt : 해독화하는 옵션이다.
(4) 사용예
   1) [posein@www posein]$ gpg --output sungjae.gpg --armor --export sungjae
       => 공개키를 sungjae라고 생성하고 sungjae.gpg라는 파일로 저장한다.
   2) [prehee@www prehee]$ gpg --armor --import! sungjae.gpg
       => sungjae.gpg라는 공개키를 자신의 gpg에 설치한다. --armor옵션은 텍스트형태의 파일을
         import!할 경우를 뜻한다.
   3) [prehee@www prehee]$ gpg --edit-key sungjae


2. gpg의 설정
(1) 공개키와 비밀키를 생성한다.
   [posein@www posein]$ gpg --gen-key
   gpg (GnuPG) 1.0.6; Copyright (C) 2001 Free Software Foundation, Inc.
   This program comes with ABSOLUTELY NO WARRANTY.
   This is free software, and you are welcome to redistribute it
   under certain conditions. See the file COPYING for details.

   gpg: Warning: using insecure memory!
   Please select what kind of key you want:
      (1) DSA and ElGamal (default)
      (2) DSA (sign only)
      (4) ElGamal (sign and encrypt)
   Your selection?
    => (설명) gpg에서는 위와 같은 키방식을 제공하는데 DSA는 서명만 할 수 있는 방식이고 EIGamal
            은 암호화를 할 수 있는 방식이다. 일반적으로 디폴트값을 사용하면 되므로 엔터키를
            치고 다음으로 넘어간다.

   DSA keypair will have 1024 bits.
   About to generate a new ELG-E keypair.
                 minimum keysize is  768 bits
                 default keysize is 1024 bits
       highest suggested keysize is 2048 bits
   What keysize do you want? (1024)
    => (설명) 키의 길이를 정하는 것이다. 물론 크기가 클수록 안전하지만, 암호화하고 해독하는데
             많은 시간이 걸린다. 이 부분도 디폴트값으로 한다.
   Requested keysize is 1024 bits
    => (설명) 1024bit로 키의 크기가 설정되었다.
   Please specify how long the key should be valid.
            0 = key does not expire
         <n>  = key expires in n days
         <n>w = key expires in n weeks
         <n>m = key expires in n months
         <n>y = key expires in n years
   Key is valid for? (0)
    => (설명) 키의 유효기간을 지정하는 것이다. 중요한 것일 경우에는 유효기간을 짧게 잡아서 키를
            자주 변경하는 것이 좋다. 이 부분도 디폴트값으로 한다. 즉 유효기간이 없다.
   Key does not expire at all
    => (설명) 유효기간이 설정되지 않음을 나타낸다.
   Is this correct (y/n)? y
    => (설명) 정확히 맞는지 여부를 묻는 부분이다.
   You need a User-ID to identify your key; the software constructs the user id
   from Real Name, Comment and Email Address in this form:
       "Heinrich Heine (Der Dichter) <
heinrichh@duesseldorf.de>"

   Real name: Jung Sung-jae
    => (설명) 키의 이름을 정하는 부분이다. 보통 자신의 이름을 적는다.
   Email address:
posein@korea.com
    => (설명) 자신의 전자우편 주소를 쓴다.

   Comment: system manager
    => (설명) 설명한 것이 있으면 적도록 한다.
   You selected this USER-ID:
       "Jung Sungjae (system manager) <
posein@korea.com>"
   Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? o
    => (설명) 위와같이 생성이 되며 변경할 사항이 없으면 o를 누른다.
   You need a Passphrase to protect your secret key.
    => 비밀키 보호용 암호를 설정한다.
  
   We need to generate a lot of random bytes. It is a good idea to perform
   some other action (type on the keyboard, move the mouse, utilize the
   disks) during the prime generation; this gives the random number
   generator a better chance to gain enough entropy.
   .++++++++++++++++++++.+++++++++++++++++++++++++.+++++...+++++.++++++++++.++++++++++.+++++
   We need to generate a lot of random bytes. It is a good idea to perform
   some other action (type on the keyboard, move the mouse, utilize the
   disks) during the prime generation; this gives the random number
   generator a better chance to gain enough entropy.
   .+++++++++++++++++++++++++++++++++++.++++++++++++++++++++.++++++++++++++++++++++++++++++++
   public and secret key created and signed.
    => (설명) 공개키와 비밀키를 생성하였다.
(2) 생성된 키의 확인
   1) 설치된 디렉토리의 확인
     [posein@www posein]$ ls -a
     ./   .bash_history  .bash_profile  .emacs   .kde/      .mysql_history  .viminfo 
     ../   bash_logout   .bashrc        .gnupg/  .mplayer/  .screenrc       .wl      
       => .gnupg라는 디렉토리가 생성되었음을 알 수 있다.
   2) 설치된 디렉토리내의 파일
     [posein@www posein]$ cd .gnupg
     [posein@www .gnupg]$ ls
     options  pubring.gpg  pubring.gpg~  random_seed  secring.gpg
   3) 설치된 공개키의 리스트 확인
     posein@www posein]$ gpg --list-keys
     gpg: Warning: using insecure memory!
     /home/posein/.gnupg/pubring.gpg
     -------------------------------
     pub  1024D/7F1400E1 2002-04-11 Jung sungjae (system manager) <
posein@korea.com>

     sub  1024g/C4E2C936 2002-04-11

3. 공개키 파일의 생성과 설치

(1) 공개키 파일 만들기
   1) [posein@www posein]$ gpg --armor --export sungjae
      gpg: Warning: using insecure memory!
      -----BEGIN PGP PUBLIC KEY BLOCK-----
      Version: GnuPG v1.0.6 (GNU/Linux)
      Comment: For info see http://www.gnupg.org

      mQGiBDy1VWIRBACyHe0EnIe7payoWcNRSDwc/SLSL8pZ7kIrkPlnv6P3tARJN0xU
      s/C+kBLhB3JCN0N/7HO8QL82tcZFGQX0RStEzjp4DxIDFRZCcxq6AQdmoCW+FYxV
      p4mBpSheoNzw3sOumviHSiuo8qCUFY1/NSInvTJJzcgcBhHeoNbSEEKrFwCgzCrq
      1J8kvQG10j51mKu9iRFbq3UD/2icBWGRnQ+oWSUZAEvodjn560uobpxe2Py6jwlJ
      NCwv+dLFJV2MX1e4faRU5yfDF0O43IlgO8gjiA4whi8GuDzgVbVJsTWcrlZjusmw
      fj4wlelNXm/KahYfuTsWCusAQDBpUCDKjmUY9ocxf5aaSscQMXVexs5Q7TZNSsG5
      yFtZA/9Qcng02Auizqz5aOysmU2UuGEanbK+TR0dGe2FHw4hV7fCWVqsj5Q7h/sj
      +pCDWQp9oCZUA6WoFUWXAeHRXZ9Cl9bOMmiBAtcqxdo1Sy02d0RgC+esrubEPXrR
      cMkJSpIfHEZrHInZQjUw8qOB9o1N3itGFCpCWoHLhug7Ol3N3bQic3VuZ2phZSAo
      bGludXgpIDxwb3NlaW5Aa29yZWEuY29tPohXBBMRAgAXBQI8tVViBQsHCgMEAxUD
      AgMWAgECF4AACgkQbR8Td38UAOFL/wCfUxSvPnjrh6MPJA9q18qIsrR3wVQAniCM
      vftp1iqSWnFkRtC2yMK3FSaOuQENBDy1VWMQBACL+zeYup7TTWiaV4wooqRVXAdd
      8BvxoA6hfyTFXCvpqsbXAoy/3dbBY/bqhf9sJdE7ksVTjHd1o2aD7eDzkr2hzLC8
      x/NkBh+PcgiaqJR9APBSroW5ySr0PF6XfWHIgvgF00+Luu4GpqrXEdIh6SxImXm3
      2EF6xBukjCjxCDG3LwADBQP/QPOzqGmSrlNClp4aWrh7Q9xdQLLx9hW62hmsApT4
      /CG2wp7gDDshts+nwltw3+4LLp6j2MOP2bPoakbXcIBnW457gpZmsbyyFRwmmYqW
      WjFR3DDLmxeeX0Pqb8kNgUTCf31cgRDdUjQM0JdcE8kfM1pzFLjsk8umND6oqaB4
      waSIRgQYEQIABgUCPLVVYwAKCRBtHxN3fxQA4XABAJ0cSqKUNMWehupuoItg+qZd
      GYxFmACfRfHzc+aZ2jDdYZdBKZ8AczR1OwY=
      =c2ma
      -----END PGP PUBLIC KEY BLOCK-----
       => (설명) --output옵션을 붙여 주지 않았다면 결과가 표준출력인 화면으로 나타나다. 이
                텍스트 결과를 전자 메일로 전송해 준다거나 홈페이지에 올리게 되면 다른 사람들이
                이 공개키를 가지고 지정된 사람들만이 볼 수 있는 비밀 문서를 보낼 수 있게 된다.
   2) [posein@www posein]$ gpg --output sungjae.gpg --armor --export sungjae
       => sungjae.gpg라는 공개키를 생성한다.
(2) 다른 사람의 공개키 설치하기
   1) 다른 사람의 공개키를 설치
     [prehee@www prehee]$ gpg --armor --import! sungjae.gpg
     gpg: Warning: using insecure memory!
     gpg: key 21BCE5C8: public key import!ed
     gpg: /home/prehee/.gnupg/trustdb.gpg: trustdb created
     gpg: Total number processed: 1
     gpg:               import!ed: 1
      => (설명) sungjae.gpg는 sungjae라는 사람의 공개키가 들어있는 파일이고, 텍스트 파일형태이
              므로 --armor옵션을 사용하였다. 참고로 처음으로 gpg를 실행시키면 디렉토리와 관련
              파일을 먼저 생성하므로 다시 한번 명령을 내려야 한다.
   2) 설치된 공개키의 확인
     [prehee@www prehee]$ gpg --list-keys
     gpg: Warning: using insecure memory!
     /home/prehee/.gnupg/pubring.gpg
     -------------------------------
     pub  1024D/67667253 2002-04-11 prehee (system tester) <
prehee@mybestone.com>
     sub  1024g/F1FB95A8 2002-04-11

     pub  1024D/21BCE5C8 2002-04-11 Jung sungjae (system) <
posein@korea.com>
     sub  1024g/F5F740F4 2002-04-11
      => 다른 사람의 공개키를 잘 이용하려면 자신의 비밀키를 위와 같이 미리 생성해야 한다.

   3) 다른 사람 공개키가 서명달기
      [prehee@www prehee]$ gpg --edit-key sungjae
      gpg (GnuPG) 1.0.6; Copyright (C) 2001 Free Software Foundation, Inc.
      This program comes with ABSOLUTELY NO WARRANTY.
      This is free software, and you are welcome to redistribute it
      under certain conditions. See the file COPYING for details.

      gpg: Warning: using insecure memory!

      pub  1024D/21BCE5C8  created: 2002-04-11 expires: never      trust: -/q
      sub  1024g/F5F740F4  created: 2002-04-11 expires: never
      (1). Jung sungjae (system manager) <
posein@korea.com>
      Command>
        => (설명) 공개키의 편집을 위한 상태로 진입한다.

      Command> fpr
      pub  1024D/21BCE5C8 2002-04-11 sungjae (linux) <
posein@korea.com>

                   Fingerprint: A20D 6C76 1919 4FCF 5A57  2BE2 BBE2 67FC 21BC E5C8
       => (설명) 공개키의 지문(fingerprint)을 확인할 수 있다. Fingerprint라는 말 뒤에 나오는
                16진수의 숫자들이 이 공개키의 지문이다. 이 지문을 공개키 주인과 연락하면서
                (전화등으로 연락하면 서로 지문을 비교) 확인할 수 있다. 이렇게 확인을 거치면
                sign명령으로 sungjae의 공개키에 나의 서명을 할 수 있다.
      Command> sign

      pub  1024D/21BCE5C8  created: 2002-04-11 expires: never      trust: -/q
                   Fingerprint: A20D 6C76 1919 4FCF 5A57  2BE2 BBE2 67FC 21BC E5C8

           Jung sungjae (system manager) <
posein@korea.com>

      Are you really sure that you want to sign this key
      with your key: "prehee (system tester) <
prehee@mybestone.com>"

      Really sign? y

      You need a passphrase to unlock the secret key for
      user: "prehee (system tester) <
prehee@mybestone.com>"
      1024-bit DSA key, ID 67667253, created 2002-04-11

      Enter passphrase:
       => 패스워드를 입력하면 서명이 된다.
     
      Command> check
      uid  Jung sungjae (system manager) <
posein@korea.com>
      sig!       21BCE5C8 2002-04-11   [self-signature]
      sig!       67667253 2002-04-11   prehee (system tester) <prehee@mybestone
       => (설명) 결과를 보면 다른 사람의 공개키에 서명을 했어도 자신의 공개키에도 서명이 된다.
               자신의 공개키를 export할 때에는 자동적으로 gpg가 자신의 서명을 해준다.

4. 문서를 암호화하고 해독하기

(1) 개요 : 문서를 특정인에게 보내고 싶을 경우에 문서를 그 사람의 공개키를 이용해서 암호화한
          뒤 그 암호화된 문서를 그 사람이 받게 되면 그 사람은 자신의 공개키로 암호화 된 문서를
          자신의 비밀키로 해독할 수 있다.
(2) 사용예 : prehee라는 사용자가 posein(Jung sungjae)이라는 사용자에게 보내기 위해 암호화함
   1) 암호화
     a. [prehee@www prehee]$ cat a.txt
        I love linux
        I love windows.
         => (설명) 다음과 같은 문서가 있다.
     b. [prehee@www prehee]$ gpg --output en_a.txt --encrypt --recipient sungjae a.txt
        gpg: Warning: using insecure memory!
        => a.txt라는 문서를 암호화하여 en_a.txt라는 파일을 생성한다. --recipient 다음에는
          받는 사람의 공개키 이름을 적는다.
     c. [prehee@www prehee]$ ls
        Desktop/  a.txt  en_a.txt  sungjae.gpg
         => 암호화된 파일이 생성되었다. 일반적인 텍스트확인명령인 cat을 이용해서 살펴보면 깨진
           문자로 표시됨을 알 수 있다.
   2) 해독 : 이 메일등으로 전송됨 파일을 확인해보도록 하자. 암호화된 문서는 본인의 비밀키만을
            이용해서 풀 수 있다.
     a. [posein@www posein]$ ls
        Desktop/  en_a.txt  sungjae.gpg 
         => 암호화된 문서를 전송받았다. cat명령을 이용해서 확인해봐도 알 수가 없다.
     b. [posein@www posein]$ gpg --output a.txt --decrypt en_a.txt
        gpg: Warning: using insecure memory!

        You need a passphrase to unlock the secret key for
        user: "Jung sungjae (system manager) <
posein@korea.com>"
        1024-bit ELG-E key, ID F5F740F4, created 2002-04-11 (main key ID 21BCE5C8)

        gpg: /home/posein/.gnupg/trustdb.gpg: trustdb created
        gpg: encrypted with 1024-bit ELG-E key, ID F5F740F4, created 2002-04-11
        "Jung sungjae (system manager) <
posein@korea.com>"
          => 자신의 비밀키를 이용하여 암호를 입력하면 암호화된 문서 en_a.txt를 a.txt로 해독
            한다.
     c. [posein@www posein]$ ls
        Desktop/  a.txt  en_a.txt  sungjae.gpg 
         => a.txt라는 파일이 생성되었음을 알 수 있다.
     d. [posein@www posein]$ cat a.txt
        I love linux
        I love windows.
         => 정상적인 내용확인이 가능하다.

출처 : 대전국제IT교육센터 정성재 강사

 

1. Snort에 대하여
Snort란 일종의 침입탐지시스템(IDS:Intrusion Detection System)으로 실시간 트래픽 분석, 프로토
콜 분석, 내용검색/매칭, 침입탐지 Rule에 의거하여 오버플로우, 포트스캔, CGI공격, OS확인 시도
등의 다양한 공격과 스캔을 탐지할 수 있다. 침입탐지 Rule은 보안 커뮤니티를 통해 지속적으로 업데
이트되고 또한 사용자가 직접 Rule을 작성하여 추가할 수 있도록 설계되어 최신공격에 대한 적응에
빨리 대처할 수 있다.


2. Snort 설치하기
(1) 설명: Snort는 공개용으로 http://www.snort.org에서 다운받을 수 있다.
(2) 방법
   1) /usr/local/src 에 snort-2.0.0.tar.gz 를 다운받는다.
   2) 압축을 푼다.
     [root@www src]# tar zxvf snort-2.0.0.tar.gz
   3) 압축을 풀면 snort-2.0.0 라는 디렉토리가 생성되는 데 이 디렉토리로 이동한다.
     [root@www src]# cd snort-2.0.0
   4) 환경설정을 한다.
     [root@www snort-2.0.0]# ./configure
   5) 컴파일한다.
     [root@www snort-2.0.0]# make
   6) 설치한다.
     [root@www snort-2.0.0]# make install

3. Snort 환경설정하기
(1) Rule 추가하기
   1) 설명: snort는 특정한 침입탐지 Rule과 비교하여 침입을 탐지하는 프로그램이므로 항상 최신의
           Rule을 설치하는 것이 좋다.
   2) 방법
    ㄱ. http://www.snort.org에 가서 snortrules-stable.tar.gz 을 다운 받는다.
    ㄴ. snort가 설치되어 있는 디렉토리에 압축을 푼다.
(2) snort.conf파일 설정하기
   1) 설명: 기본적인 몇가지만 설정하도록 한다.
   2) 설정
    ㄱ. var HOME_NET any
         => 현재 네트워크를 명시한다. 192.168.0.1/24 등의 서브넷 표기법으로 표기할 수 있다.
           정의하기가 어려우면 기본값인 any 라고 설정한다.
    ㄴ. var EXTERNAL_NET any
         => 외부 네트워크 대역을 지정한다. 기본값인 any 라고 설정한다.
(3) 탐지된 결과가 기록될 디렉토리 생성하기
   1) 설명: snort에 의해 탐지된 결과를 위한 디렉토리를 생성해야 하고 해당 디렉토리의 접근권한
           도 root만이 가능하도록 해야 한다.
   2) 방법
     ㄱ. 디렉토리 생성
        [root@www root]# mkdir /var/log/snort
     ㄴ. 권한 설정
        [root@www root]# chmod 700 /var/log/snort

4. Snort 사용하기
(1) 사용법
   snort [-options] <filter options >
(2) options
   -A : 얼럿 모드(Alert! Mode)를 지정한다. fast, full, none, unsock 중 하나로 지정한다. unsock
       은 UNIX 소켓을 사용할 때 지정한다.
   -b : tcpdump 파일 포맷으로 저장한다.
   -c 환경설정파일 : 지정된 파일을 Rule 파일로 사용한다.
   -C : 데이터부분의 문자만 출력한다.
   -D : snort를 데몬으로 동작시킨다. 백그라운드로 동작하면 터미널의 종료후에도 계속 동작하도록
       할 때 사용한다.
   -F bpf파일 : 필터링식을 'bpf파일'에서 읽어온다. 이 식은 tcpdump에서 원하는 패킷만을 덤프하
               기 위해 사용한다.
   -g 그룹명 : snort의 그룹 또는 GID를 변경한다.
   -h home-net : 홈 네트워크 변수인 HOME_NET의 값을 설정한다.
   -i interface : 지정된 네트워크 인터페이스를 모니터링 한다. 보통 eth0, eth1 등이 온다.
   -l 디렉토리명 : 지정한 디렉토리에 로그데이터를 저장한다.
   -n 패킷갯수 : 지정한 패킷갯수만 모니터링한다.
   -N : 패킷을 기록은 하지않고 alert!만 저장한다.
   -o : 룰셋 순서를 Alert!->Pass->Log 에서 Pass->Alert!->Log 로 바꾼다.
   -O :IP주소를 알 수 없도록 한다.
   -p : promiscuous 모드를 사용하지 않는다.
   -P 스냅길이 : 패킷의 스냅렌(snaplen)을 지정한다. 스냅렌이란 캡쳐할 수 있는 패킷의 최대크기
                를 말한다. 기본값은 1514으로 스냅렌보다 큰 패킷을 캡쳐할 경우 스냅렌만큼만
                기록된다.
   -q : 메지지를 보이지 않게 한다.
   -r tcpdump_file : tcpdump파일의 패킷들에 대해서 검색한다.
   -s : alert! 메시지를 syslog 로 보낸다. 즉 로그들이 /var/log/secure나 /var/log/messages에
       저장된다.
   -S 변수=변수값: Rule에 있는 변수와 값을 지정할 수 있다. 예를 들면 HOME_NET 같은 값은 재지정
                  한다.
   -t 디렉토리: 지정한 디렉토리를 chroot로 한다.
   -u 사용자 : snort의 UID또는 사용자명을 변경한다.
   -v : 메시지를 자세히 보여준다.
   -V : snort의 버전을 보여준다.
(3) 사용예
    snort -d -l /var/log/snort -c etc/snort.conf -A full -D

5. Snort 결과 분석

(1) 설명: snort를 실행하면 지정한 로그디렉토리(/var/log/snort)에 탐지결과가 남는다. 이 디렉토
          리에 경고메시지가 저장되는 alert! 파일, 각 IP주소별 디렉토리가 생성된다.
(2) 기본 로그 형태
   1) alert! 파일의 예
    ㄱ. Web 공격 시도에 의한 탐지 예
       [**] [1:1002:5] WEB-IIS cmd.exe access [**]
       [Classification: Web Application Attack] [Priority: 1]
       04/27-17:46:24.479073 203.247.xxx.xx:1941 -> 203.247.xx.xxx:80
       TCP TTL:114 TOS:0x0 ID:29029 IpLen:20 DgmLen:1500 DF
       ***A**** Seq: 0x49CC3667  Ack: 0x3B68E670  Win: 0x4470  TcpLen: 20
    ㄴ. 포트스캔(Prot Scan)에 의한 탐지 예
       [**] [1:628:1] SCAN nmap TCP [**]
       [Classification: Attempted Information Leak] [Priority: 2]
       04/27-18:47:44.042908 203.247.xx.xxx:57970 -> 203.247.xx.xxx:21
       TCP TTL:52 TOS:0x0 ID:43643 IpLen:20 DgmLen:60
       ***A**** Seq: 0x965ADFEC  Ack: 0x0  Win: 0x400  TcpLen: 40
       TCP Options (4) => WS: 10 NOP MSS: 265 TS: 1061109567 0
       [Xref => http://www.whitehats.com/info/IDS28]
   2) 각 주소별 디렉토리
    ㄱ. 설명: snort가 공격 메시지나 비정상적인 시도를 탐지하게 되면 로그디렉토리에 해당 공격을
             시도한 IP주소로 디렉토리를 만들고 관련 정보를 파일로 생성한다.
    ㄴ. 예
       [root@www 203.247.xx.xxx]# cat TCP:1941-80
       [**] WEB-IIS ISAPI .ida attempt [**]
       04/27-17:46:24.476608 203.247.xx.xxx:1941 -> 203.247.xxx.xxx:80
       TCP TTL:114 TOS:0x0 ID:29028 IpLen:20 DgmLen:1500 DF
       ***A**** Seq: 0x49CC30B3  Ack: 0x3B68E670  Win: 0x4470  TcpLen: 20
       47 45 54 20 2F 64 65 66 61 75 6C 74 2E 69 64 61  GET /default.ida
       3F 58 58 58 58 58 58 58 58 58 58 58 58 58 58 58  ?XXXXXXXXXXXXXXX
       58 58 58 58 58 58 58 58 58 58 58 58 58 58 58 58  XXXXXXXXXXXXXXXX
                ------------ 이 하 생 략 ------------------
         => 만약 공격을 시도한 IP주소가 203.247.xx.xxx이면 /var/log/snort/203.247.xx.xxx형태로
           디렉토리가 생성되고 그 안에 로그파일이 생성된다.
(3) 참고 : 잘못된 탐지에 대하여
   snort가 탐지하는 로그를 보면 몇몇 Rule들이 잘못된 탐지를 하는 경우가 있다. 이 경우에는 관리
  자가 판단하여 snort.conf파일의 해당 Rule에 주석처리하거나 수정할 필요가 있다.

6. Snort관련 응용프로그램 - SnortSnarf
(1) 설명: SnortSnarf는 Snort관련 보조 응용프로그램으로 로그를 관리해주고, 결과를 웹페이지형태
          로 바꾸어 빠르고 편리하게 찾아볼 수 있도록 도와준다.
          관련사이트는 http://www.silicondefense.com 이다.
(2) 설치
   1) 최신버전인 SnortSnarf-021111.1.tar.gz 를 /usr/local/src 디렉토리에 다운받는다.
   2) 압축을 푼다.
     [root@www src]# tar zxvf SnortSnarf-021111.1.tar.gz
   3) 압축을 풀면 디렉토리가 생성되는데 그 디렉토리로 이동한다.
     [root@www src]# cd SnortSnarf-021111.1
   4) include 디렉토리에 안에 있는 내용을 /usr/lib/perl5/site_perl/5.8.0에 모두 복사한다.
     [root@www SnortSnarf-021111.1]# cp -r ./include/* /usr/lib/perl5/site_perl/5.8.0/
   5) cgi 디렉토리안에 있는 내용을 /usr/local/apache/cgi-bin 디렉토리로 이동한다.
     [root@www SnortSnarf-021111.1]# cp ./cgi/* /usr/local/apache/cgi-bin/
   6) 웹페이지가 저장될 디렉토리를 만든다.
     [root@www SnortSnarf-021111.1]# mkdir /usr/local/apache/htdocs/snort
(3) 실행
   1) 설명: 실행파일은 snortsnarf.pl이고 기존의 snort랑 연결해서 실행해야 하므로 관련 디렉토리
           와 관련파일의 위치를 잘 알고 있어야 한다. 아울러 실행파일이 너무 길게 되므로 스크립
           트로 만들어서 사용하면 재실행시에 쉽게 snortsnarf라고 입력하면 실행되도록 할 수
           있다.
   2) snortsnarf.pl 사용하기
    ㄱ. 사용법
       snortsnarf.pl options file1 file2
    ㄴ. options
       -rulesdir : snort rule파일들의 위치를 지정한다.
       -rulesfile : snort 환경설정파일 즉 snort.conf파일의 위치를 지정한다.
       -d : 웹페이지가 생성될 디렉토리를 지정한다.
    ㄷ. 사용예
       [root@www SnortSnarf-021111.1]# ./snortsnarf.pl -rulesdir /usr/local/snort \
       -rulesfile /etc/snort.conf -d /usr/local/apache/htdocs/snort /var/log/snort/alert!
   3) 스크립트로 만들기
     [root@www SnortSnarf-021111.1]# vi snortsnarf
     /usr/local/src/SnortSnarf-021111.1/snortsnarf.pl -rulesdir /usr/local/src/snort-2.0.0 \
     -rulesfile /usr/local/src/snort-2.0.0/etc/snort.conf -d /usr/local/apache/htdocs/snort \
     /var/log/snort/alert!
   4) 실행하기
     [root@www SnortSnarf-021111.1]# ./snortsnarf
(4) 확인
    웹브라우저에서 http://localhost/snort 라고 입력해서 확인한다.
(5) 참고 : snortsnarf의  error 발생
   1) 설명: 실행시에 다음과 같은 error가 발생할 수 있다.
     [root@www SnortSnarf-021111.1]# ./snortsnarf
     Can't locate Time/Timezone.pm in @INC (@INC contains: ./include /usr/lib/perl5/5.8.0/i386
     BEGIN failed--compilation aborted at /usr/lib/perl5/5.8.0/Time/ParseDate.pm line 8.
     Compilation failed in require at include/SnortSnarf/TimeFilters.pm line 18.
     BEGIN failed--compilation aborted at include/SnortSnarf/TimeFilters.pm line 18.
     Compilation failed in require at include/SnortSnarf/Filter.pm line 19.
     BEGIN failed--compilation aborted at include/SnortSnarf/Filter.pm line 19.
     Compilation failed in require at /usr/local/src/SnortSnarf-021111.1/snortsnarf.pl line 87.
     BEGIN failed--compilation aborted at /usr/local/src/SnortSnarf-021111.1/snortsnarf.pl line 87
   2) 원인: Perl 실행시 Time 관련 모듈에 없기 때문이다. 관련 모듈을 다운받아 설치한다.
   3) 해결책
    ㄱ. http://search.cpan.org/author/MUIR/Time-modules-2003.0211 로 이동한다.
    ㄴ. /usr/local/src에 Time-modules-2003.0211.tar.gz 파일을 다운받는다.
    ㄷ. 압축을 푼다.
       [root@www src]# tar zxvf Time-modules-2003.0211.tar.gz
    ㄹ. Perl관련 디렉토리에 복사한다.
       [root@www src]# cp -r ./Time-modules-2003.0211/lib/* /usr/lib/perl5/site_perl/5.8.0/
(6) 주기적으로 실행하기
   1) 설명: snortsnarf를 실행하면 웹페이지에 단 한번의 실행결과만 남게된다. 주기적으로 하려면
           cron데몬과 연계해서 실행하면 된다.
   2) 방법
    ㄱ. 설명: 30분마다 실행하도록 하려면 /etc/crontab 파일에 아래와 같이 추가한다.
    ㄴ. 예
       */30 * * * * root /usr/local/src/SnortSnarf-021111.1/snortsnarf

출처 : 대전국제IT교육센터 정성재 강사

 

1. Tcpdump란?
tcpdump는 Lawrence Berkley Nation Lab의 Network Rearch Gruop에서 만든 것으로 네트워크의 패킷
을 출력해주는 프로그램이다. 주어진 조건식을 만족하는 네트워크 인터페이스를 거치는 패킷들의
헤더들을 출력해 주는 프로그램이다. 주로 쓰임은 지정된 상대방 호스트로부터 들어오는 패킷을 체크
하는 데 있다.


2. tcpdump의 사용법
(1) 사용법
   tcpdump [options] [host]

(2) tcpdump의 결과보기 [root@www root]# tcpdump 01:37:09.744959 203.xxx.xxx.10.4847 > linux.co.kr.ftp: S 2082495566:2082495566(0) win 16384 (DF) => (결과설명) 01:37:09.744959 : Timestamp로 보통 '시간.특정한숫자값'형태로 부여된다. 203.xxx.xxx.10.4847 : Source_address.source_port로 소스의 IP주소와 Port번호를 나타낸 다. > : Traffic direction으로 방향을 나타낸다. linux.co.kr.ftp : destination_address.destination_port로 도착지 IP주소와 Port번호를 나타낸다. S : TCP flag로 특정한 표시문자를 일컫는다. 2082495566:2082495566(0) : sequence number이다. win 16384 : window size이다. : various options 이다. (DF) : Don't fragment

 

3. tcpdump 플래그(flags)

TCP 플래그  TCPDUMP 플래그 플래그의 의미
SYN S  SYN패킷, 접속요청을 할 때 보내는 패킷을 말한다.
TCP접속시에 가장먼저 보내는 패킷이다.
ACK ack  ACK패킷, 상대방으로부터 패킷을 받은 뒤에 알려주는
패킷을 말한다. 다른 플래그와 같이 출력되는 경우도
있다.
FIN F  접속종료를 위한 플래그로 이 패킷을 보내는 곳이
현재 접속하고 있는 곳과 접속을 끊고자 할 때 사용한다.
RESET R  이 패킷을 보내는 곳이 현재 접속하고 있는 곳과 즉시
연결을끊고자 할 때 사용한다.
PUSH P  데이터를 즉시 목적지로 보내라는 의미이다. 텔넷과
같이 상호작용이 중요한 프로그램의 경우 빠른 응답
이 중요한다. 이때 사용하는 플래그이다.
UGENT URG  긴급한 데이터는 다른 데이터에 비해 우선순위가
높아야 한다. 예를 들어 ftp로 자료를 받고 있는 도중
[CTRL]+[C] 를 받으면 즉시 자료받기를 중단해야 하는
것처럼 이 때 사용하는 플래그이다.
Placeholder .  패킷이 SYN, FINISH, RESET, PUSH등의 플래그가 없는
경우이 플래그가 세팅된다. 이 플래그는 ACK플래그와

함께 사용되는 경우도 있다.


4. tcpdump의 옵션
-h: 버전 및 기본 사용법을 보여준다.
-a : Network & Broadcast 주소들을 이름들로 바꾼다.
-c Number : 제시된 수의 패킷을 받은 후 종료한다.
-d : compile된 packet-matching code를 사람이 읽을 수 있도록 바꾸어 표준 출력으로 출력하고,
     종료한다.
-dd : packet-matching code를 C program의 일부로 출력한다.
-ddd : packet-matching code를 숫자로 출력한다.
-e : 출력되는 각각의 행에 대해서 link-level 헤더를 출력한다.
-f : 외부의 internet address를 가급적 심볼이 아닌 숫자로 출력한다.(Sun의 yp server와의 사용은
     가급적 피한다.)
-F file : filter 표현의 입력으로 파일을 받아들인다. 커맨드라인에 주어진 추가의 표현들은 모두
          무시된다.
-i device : 어느 인터페이스를 경유하는 패킷들을 잡을지 지정한다. 지저되지 않으면 시스템의
            인터페이스 리스트를 검색하여 가장 낮은 번호를 가진 인터페이스를 선택한다.(이 때
            loopback은 제외된다.) 예) tcpdump -i eth0
-l : 표준 출력으로 나가는 데이터들을 line buffering한다. 다른 프로그램에서 tcpdump로부터 데이
     터를 받고자 할 때 유용하다. 보통 'tcpdump -l | tee dat' 나 'tcpdump -l < dat & tail -f
     dat' 명령으로 연계해서 사용하면 편리하다.
-n : 모든 주소들을 번역하지 않는다(port,host address 등등)
-N : 호스트 이름을 출력할 때, 도메인을 찍지 않는다.
-O : packet-matching code optimizer를 실행하지 않는다. 이 옵션은 optimizer에 있는 버그를 찾을
     때나 쓰인다.
-p : 인터페이스를 promiscuous mode로 두지 않는다.
-q : 프로토콜에 대한 정보를 덜 출력한다. 따라서 출력되는 라인이 좀 더 짧아진다.
-r file : 패킷들을 '-w'옵션으로 만들어진 파일로 부터 읽어 들인다. 파일에 "-" 가 사용되면 표준
          입력을 통해서 받아들인다.
-s length: 패킷들로부터 추출하는 샘플을 default값인 68Byte외의 값으로 설정할 때 사용한다.(Sun
           OS의 NIT에서는 최소가 96Byte이다). 68Byte는 IP,ICMP, TCP, UDP등에 적절한 값이지만
           Name Server나 NFS 패킷들의 경우에는 프로토콜의 정보들을 Truncation할 우려가 있다.
           이 옵션을 수정할 때는 신중해야만 한다. 이유는 샘플 사이즈를 크게 잡으면 곧 패킷 하
           나하나를 처리하는데 시간이 더 걸릴 뿐만아니라 패킷 버퍼의 사이즈도 자연히 작아지게
           되어 손실되는 패킷들이 발생할 수 있기 때문이다. 또, 작게 잡으면 그만큼의 정보를 잃
           게되는 것이다. 따라서 가급적 캡춰하고자 하는 프로토콜의 헤더 사이즈에 가깝게 잡아
           주어야 한다.
-T type : 조건식에 의해 선택된 패킷들을 명시된 형식으로 표시한다. type에는 다음과 같은 것들이
          올 수 있다. rpc(Remote Procedure Call), rtp(Real-Time Applications protocol), rtcp
          (Real-Time Application control protocal), vat(Visual Audio Tool), wb(distributed
           White Board)
-S : TCP sequence번호를 상대적인 번호가 아닌 절대적인 번호로 출력한다.
-t : 출력되는 각각의 라인에 시간을 출력하지 않는다.
-tt : 출력되는 각각의 라인에 형식이 없는 시간들을 출력한다.
-v : 좀 더 많은 정보들을 출력한다.
-vv : '-v'보다 좀 더 많은 정보들을 출력한다.
-vvv : 16진수값 형태로 정보를 보여준다. 보통 -X옵션과 사용되어
-w : 캡춰한 패킷들을 분석해서 출력하는 대신에 그대로 파일에 저장한다.
-x : 각각의 패킷을 헥사코드로 출력한다.
-X : 헥사코드와 ascii형태 모두 출력해준다. 보통 -x 옵션과 같이 사용된다.
-조건식(expression!)
  옵션의 제일 마지막인 조건식은 어떤 패킷들을 출력할 지를 선택하는 데 쓰인다. 조건식이 주어지지
않는다면 모든 패킷들이 대상이 된다. 조건식들은 하나 또는 여러 개의 primitive들로 구성되어 있고
primitive들은 다시 하나 또는 여러 개의 qualifier들 다음에 오는 하나의 값으로 이루어진다.
  *qualifier
   type : 주어진 값의 종류가 무엇인지를 나타낸다. 가능한 type들은 'host', 'net', 'port'가 있다.
         type이 없는 값들은 type을 host라 가정한다.
   dir : id로 부터의 어떤 특정한 전송 방향을 나타낸다. 가능한 방향은 'src', 'dst', 'src or
        dst', 'src and dst'이다. 만약 방향이 정해지지 않았다면, src or dst라 가정한다. "For
        `null' link layers (i.e. point to point protocols such as slip) the inb ound and out
        bound qualifiers can be used to specify a desired direction."
   proto : 매칭을 특정 프로토콜에 한해서 수행한다. 가능한 프로토콜들은 ether, fddi, ip, arp,
          rarp, decnet, lat, sca, moprc, mopdl, tcp, udp이다. 만약 프로토콜이 명시되지 않았다
          면, 해당하는 값의 type에 관련된 모든 프로토콜들이 그 대상이 된다.
  *위의 패턴을 따르지 않는 primitive : gateway, broadcast, less, greater, 산술식이 있으며 참고
                                   로 더 정교한 조건식을 사용하려면 'and(&&)','or(||)','not(!)'
                                   을 사용할 수 있다.
  *사용가능한 primitive들
   dst host HOST
    => packet의 IP destination 항목이 HOST일때 참이 된다.
   src host HOST
    => packet의 IP source 항목이 HOST일때 참이 된다.
   host HOST
    => IP source, IP destination 항목 중 어느 하나라도 HOST이면 참이다.
   ether dst ehost
    => ethernet destination 주소가 ehost일 때 참이다.
   ether src ehost
    => ethernet source 주소가 ehost일 때 참이다.
   ether host ehost
    => ethernet source, destination 항목들 중 어느 하나라도 ehost이면 참이다.
   gateway host
    => 패킷이 host를 게이트웨이로 사용하면 참이다. 이 말의 의미는 ethernet sour ce나 destina
      tion 항목은 host이지만, IP source와 destination은 host가 아닐 때를 말한다.
   dst net NET
    => 패킷의 IP destination 주소가 NET의 network number를 가지고 있을 때 참이다.
   src net NET
    => 패킷의 IP source 주소가 NET의 network number를 가지고 있을 때 참이다.
   net NET
    => 패킷의 IP source 주소 혹은 destination 주소가 NET의 network number를 가 지고 있을 때
      참이다.
   net netmask mask
    => IP 어드레스가 지정된 netmask를 통해서 net과 매칭되면 참이다.
   net net/len
    => IP 어드레스가 netmask와 len 비트만큼 매치되면 참이다.
   dst port PORT
    => 패킷이 ip/tcp, ip/udp 프로토콜의 패킷이고 destination port의 값이 PORT일 때 참이다.
      port는 /etc/services에 명시된 이름일 수도 있고 그냥 숫자일 수도 있다. 만약 이름이 사용
      됐다면 port 번호와 프로토콜이 같이 체크될 것이다. 만약 숫자나 불 확실한 이름이 사용됐을
      경우에는 port 번호만이 체크될 것이다.
   src port PORT
    => 패킷의 source port의 값으로 PORT를 가지면 참이다.
   port PORT
    => 패킷의 source, destination port 중에 하나라도 PORT이면 참이다.
less length => 패킷이 length보다 짧거나 같으면 참이다.(len <= length) greater length => 패킷이 length보다 짧거나 같으면 참이다.(len >= length) ip proto protocol => 패킷이 지정된 종류의 프로토콜의 ip패킷이면 참이다. Protocol은 icmp, igrp, udp, nd, tcp 중의 하나 혹은 몇 개가 될 수 있다. 주의할 점은 tcp, udp, icmp들은 '\'로 escape되어야 한다. ehter broadcast => 패킷이 ethernet broadcast 패킷이라면 참이다. ehter는 생략 가능하다. ip broadcast => 패킷이 IP broadcast 패킷이라면 참이다. ether multicast => 패킷이 IP multicast 패킷이라면 참이다. ether proto protocol => 패킷이 ether type의 protocol이라면 참이다. protocol은 ip, arp, rarp 중에 하나 혹은 몇 개가 될 수 있다. ip proto protocol에서와 마찬가지로 ip, arp, rarp는 escape 되어야 한다. decnet src host => 만약 DECNET의 source address가 host이면 참이다. 이 어드레스는 '10.123'이 나 DECNET의 host name일 수 있다. DECNET host name은 DECNET에서 돌아가도록 설정된 Ultrix 시스템에서 만 사용 가능하다. decnet dst host => DECNET destination address가 host이면 참이다. decnet host HOST => DECNET source, destination address중의 하나라도 HOST이면 참이다. ip, arp, rarp, decnet => ether proto [ip|arp|rarp|decnet]의 약어 lat, moprc, mopdl => ether proto [lat|moprc|mopdl]의 약어 tcp, udp, icmp => ip proto [tcp|udp|icmp]의 약어 expr relop expr => EXPR proto [expr:size]의 형식을 띤다. proto, expr, size에 올 수 있는 것들은 다음과 같다. proto : ether, fddi, ip, arp, rarp, tcp, udp, icmp expr : indicate Byte offset of packet of proto size : optional. indicate the size of bytes in field of interest default is one, and can be two or four => RELOP !=, =, <=, >=, etc. 이 조건식을 사용하기 위해서는 먼저 해당하는 Protocol(proto)의 헤더에 관련된 것들을 자세 히 알아야만 한다. proto에는 대상이 될 프로토콜을 지정한다. expr에는 프로토콜 헤더의 처음 부터의 Byte Offset을 지정하는 식이 들어가게 된다. Size는 Option이며 지정이 안 되어 있을 경우에는 자동으로 1byte를 지칭한다. 따라서 이 조건식을 사용하게 되면 헤더에 포함된 정보 를 Bitmask를 사용하여 직 접 원하는 패킷인지를 가려낼 수 있기 때문에, 보다 정밀한 사용이 가능하게 된다.
5. tcpdump 기본사용예
(1) [root@www root]# tcpdump => 현재 서버의 모든 패킷을 보여준다. (2) [root@www root]# tcpdump port 21 tcpdump: listening on eth0 01:25:43.833276 203.xxx.xxx.100.4828 > xxx.com.ftp: S 1910472596:1910472596(0) win 16384 203.247.40.244.4828: S 4108025962:4108025962(0) ack 1910472597 ) => 21번 포트로 들어온 패킷만 보여준다. (3) [root@nanajjang /root]# tcpdump -c 2 host neuro.hannam.ac.kr Kernel filter, protocol ALL, datagram packet socket tcpdump: listening on all devices 11:09:44.576419 eth0 B arp who-has 203.247.40.247 tell neuro.hannam.ac.kr 11:09:44.576507 eth0 > arp reply 203.247.40.247 (0:c0:26:1:11:77) is-at 0:c0:26) => neuro.hannam.ac.kr의 패킷 2개만 보여준다. (4) tcpdump -v -e broadcast => broadcast 의 정보를 자세히 출력하고 출력되는 각각의 행에 대해서 link-level헤더를 출력 한다.
6. tcpdump로 패스워드 알아내기

(1) 설명: telnet을 이용하여 서버에 접속을 하면 패킷전송시에 암호화하지 않기 때문에 쉽게 내용 을 볼 수 있다. tcpdump를 이용하여 패스워드를 알아낼 수 있다.

(2) 사용예

 1) 실행명령 [root@www root]# tcpdump port telnet -l -vvv -x -X >dumpdata & tail -f dumpdata

 2) 패킷분석: 패킷의 양이 많으므로 잘 찾아야 한다. 먼저 연결된 포트를 확인한다. 20:38:22.395281 xxx.com.telnet > 210.xxx.xxx.100.35383: P [tcp sum ok] 175:182(7) ack 81 win 5792 (DF) [tos 0x10] (ttl 64, id 59193, len 59) 0x0000 4510 003b e739 4000 4006 ca41 cbf7 28fc E..;.9@.@..A..(. 0x0010 d27b c1c2 0017 8a37 2992 16d8 2041 b972 .{.....7)....A.r 0x0020 8018 16a0 5fec 0000 0101 080a 04d1 f156 ...._..........V 0x0030 0223 7825 6c6f 6769 6e3a 20 .#x%login:. => 서버(xxx.com)에서 클라이언트(210.xxx.xxx.100에게 'login'이라는 것을 보여줌을 알 수 있다. 또한 연결된 클라이언트의 포트번호가 35383임을 알 수 있다. 이 포트번호를 확인해 야 패킷을 찾아갈 수 있다. ---중략--- 20:38:23.979306 210.xxx.xxx.100.35383 > xxx.com.telnet: P [tcp sum ok] 81:82(1) ack 182 win 5840 (DF) [tos 0x10] (ttl 56, id 49475, len 53) 0x0000 4510 0035 c143 4000 3806 f83d d27b c1c2 E..5.C@.8..=.{.. 0x0010 cbf7 28fc 8a37 0017 2041 b972 2992 16df ..(..7...A.r)... 0x0020 8018 16d0 5130 0000 0101 080a 0223 78c3 ....Q0.......#x. 0x0030 04d1 f156 70 ...Vp => 클라이언트에서 서버로 전송하는 부분만을 확인하면 된다. P 다음에 존재하는 81:82와 ack 다음에 182라는 번호를 꼭 확인한다. 다음 패킷번호는 82:83이 되고 ack 183번이 되므로 ack 183이라는 부분을 찾아가면 된다. 여기서 클라이언트에서 서버로 전송한 글자는 맨 마지막에 표시된다. 즉 'p'이다. ---중략--- 20:38:24.162490 210.xxx.xxx.100.35383 > xxx.com.telnet: P [tcp sum ok] 82:83(1) ack 183 win 5840 (DF) [tos 0x10] (ttl 56, id 49477, len 53) 0x0000 4510 0035 c145 4000 3806 f83b d27b c1c2 E..5.E@.8..;.{.. 0x0010 cbf7 28fc 8a37 0017 2041 b973 2992 16e0 ..(..7...A.s)... 0x0020 8018 16d0 4ef0 0000 0101 080a 0223 78d6 ....N........#x. 0x0030 04d1 f481 6f ....o ---중략--- 20:38:24.322785 210.xxx.xxx.100.35383 > xxx.com.telnet: P [tcp sum ok] 83:84(1) ack 184 win 5840 (DF) [tos 0x10] (ttl 56, id 49479, len 53) 0x0000 4510 0035 c147 4000 3806 f839 d27b c1c2 E..5.G@.8..9.{.. 0x0010 cbf7 28fc 8a37 0017 2041 b974 2992 16e1 ..(..7...A.t)... 0x0020 8018 16d0 4a80 0000 0101 080a 0223 78e6 ....J........#x. 0x0030 04d1 f4df 73 ....s ---중략--- 20:38:24.445142 210.xxx.xxx.100.35383 > xxx.com.telnet: P [tcp sum ok] 84:85(1) ack 185 win 5840 (DF) [tos 0x10] (ttl 56, id 49481, len 53) 0x0000 4510 0035 c149 4000 3806 f837 d27b c1c2 E..5.I@.8..7.{.. 0x0010 cbf7 28fc 8a37 0017 2041 b975 2992 16e2 ..(..7...A.u)... 0x0020 8018 16d0 5820 0000 0101 080a 0223 78f2 ....X........#x. 0x0030 04d1 f531 65 ...1e ---중략--- 20:38:24.532360 210.xxx.xxx.100.35383 > xxx.com.telnet: P [tcp sum ok] 85:86(1) ack 186 win 5840 (DF) [tos 0x10] (ttl 56, id 49483, len 53) 0x0000 4510 0035 c14b 4000 3806 f835 d27b c1c2 E..5.K@.8..5.{.. 0x0010 cbf7 28fc 8a37 0017 2041 b976 2992 16e3 ..(..7...A.v)... 0x0020 8018 16d0 53d6 0000 0101 080a 0223 78fb ....S........#x. 0x0030 04d1 f570 69 ...pi ---중략--- 20:38:24.624350 210.xxx.xxx.100.35383 > xxx.com.telnet: P [tcp sum ok] 86:87(1) ack 187 win 5840 (DF) [tos 0x10] (ttl 56, id 49485, len 53) 0x0000 4510 0035 c14d 4000 3806 f833 d27b c1c2 E..5.M@.8..3.{.. 0x0010 cbf7 28fc 8a37 0017 2041 b977 2992 16e4 ..(..7...A.w)... 0x0020 8018 16d0 4e9f 0000 0101 080a 0223 7904 ....N........#y. 0x0030 04d1 f59c 6e ....n ---중략--- => posein이라는 글자를 알 수 있다. 즉 사용자 ID가 posein이다. 20:38:24.932380 xxx.com.telnet > 210.xxx.xxx.100.35383: P [tcp sum ok] 190:200(10) ack 89 win 5792 (DF) [tos 0x10] (ttl 64, id 59201, len 62) 0x0000 4510 003e e741 4000 4006 ca36 cbf7 28fc E..>.A@.@..6..(. 0x0010 d27b c1c2 0017 8a37 2992 16e7 2041 b97a .{.....7)....A.z 0x0020 8018 16a0 d40b 0000 0101 080a 04d1 f669 ...............i 0x0030 0223 7923 5061 7373 776f 7264 3a20 .#y#Password:. => 서버에서 클라이언트에서 Password라는 글을 보내어 출력시킨다. ---중략--- 20:38:25.300524 210.xxx.xxx.100.35383 > xxx.com.telnet: P [tcp sum ok] 89:90(1) ack 200 win 5840 (DF) [tos 0x10] (ttl 56, id 49490, len 53) 0x0000 4510 0035 c152 4000 3806 f82e d27b c1c2 E..5.R@.8....{.. 0x0010 cbf7 28fc 8a37 0017 2041 b97a 2992 16f1 ..(..7...A.z)... 0x0020 8018 16d0 557f 0000 0101 080a 0223 7947 ....U........#yG 0x0030 04d1 f669 66 ...ip ---중략--- 20:38:25.454778 210.xxx.xxx.100.35383 > xxx.com.telnet: P [tcp sum ok] 90:91(1) ack 200 win 5840 (DF) [tos 0x10] (ttl 56, id 49491, len 53) 0x0000 4510 0035 c153 4000 3806 f82d d27b c1c2 E..5.S@.8..-.{.. 0x0010 cbf7 28fc 8a37 0017 2041 b97b 2992 16f1 ..(..7...A.{)... 0x0020 8018 16d0 489e 0000 0101 080a 0223 7957 ....H........#yW 0x0030 04d1 f739 72 ...9a ---중략--- 20:38:25.659340 210.xxx.xxx.100.35383 > xxx.com.telnet: P [tcp sum ok] 91:92(1) ack 200 win 5840 (DF) [tos 0x10] (ttl 56, id 49492, len 53) 0x0000 4510 0035 c154 4000 3806 f82c d27b c1c2 E..5.T@.8..,.{.. 0x0010 cbf7 28fc 8a37 0017 2041 b97c 2992 16f1 ..(..7...A.|)... 0x0020 8018 16d0 554e 0000 0101 080a 0223 796b ....UN.......#yk 0x0030 04d1 f774 65 ...ts ---중략--- 20:38:25.777475 210.xxx.xxx.100.35383 > xxx.com.telnet: P [tcp sum ok] 92:93(1) ack 200 win 5840 (DF) [tos 0x10] (ttl 56, id 49493, len 53) 0x0000 4510 0035 c155 4000 3806 f82b d27b c1c2 E..5.U@.8..+.{.. 0x0010 cbf7 28fc 8a37 0017 2041 b97d 2992 16f1 ..(..7...A.})... 0x0020 8018 16d0 54d8 0000 0101 080a 0223 7977 ....T........#yw 0x0030 04d1 f7dd 65 ....s ---중략--- 20:38:26.049208 210.xxx.xxx.100.35383 > xxx.com.telnet: P [tcp sum ok] 93:94(1) ack 200 win 5840 (DF) [tos 0x10] (ttl 56, id 49494, len 53) 0x0000 4510 0035 c156 4000 3806 f82a d27b c1c2 E..5.V@.8..*.{.. 0x0010 cbf7 28fc 8a37 0017 2041 b97e 2992 16f1 ..(..7...A.~)... 0x0020 8018 16d0 887f 0000 0101 080a 0223 7992 .............#y. 0x0030 04d1 f81a 31 ....w ---중략--- 20:38:26.243634 210.xxx.xxx.100.35383 > xxx.com.telnet: P [tcp sum ok] 94:95(1) ack 200 win 5840 (DF) [tos 0x10] (ttl 56, id 49495, len 53) 0x0000 4510 0035 c157 4000 3806 f829 d27b c1c2 E..5.W@.8..).{.. 0x0010 cbf7 28fc 8a37 0017 2041 b97f 2992 16f1 ..(..7...A..)... 0x0020 8018 16d0 86df 0000 0101 080a 0223 79a6 .............#y. 0x0030 04d1 f8a5 32 ....o ---중략--- 20:38:26.442302 210.xxx.xxx.100.35383 > xxx.com.telnet: P [tcp sum ok] 95:96(1) ack 200 win 5840 (DF) [tos 0x10] (ttl 56, id 49496, len 53) 0x0000 4510 0035 c158 4000 3806 f828 d27b c1c2 E..5.X@.8..(.{.. 0x0010 cbf7 28fc 8a37 0017 2041 b980 2992 16f1 ..(..7...A..)... 0x0020 8018 16d0 8768 0000 0101 080a 0223 79b9 .....h.......#y. 0x0030 04d1 f908 31 ....r ---중략--- 20:38:26.540930 210.xxx.xxx.100.35383 > xxx.com.telnet: P [tcp sum ok] 96:97(1) ack 200 win 5840 (DF) [tos 0x10] (ttl 56, id 49497, len 53) 0x0000 4510 0035 c159 4000 3806 f827 d27b c1c2 E..5.Y@.8..'.{.. 0x0010 cbf7 28fc 8a37 0017 2041 b981 2992 16f1 ..(..7...A..)... 0x0020 8018 16d0 80f7 0000 0101 080a 0223 79c3 .............#y. 0x0030 04d1 f96e 37 ...nd ---이하생략--- => 패스워드가 password라는 것을 알 수 있다.


우주곰:지구곰이 아닙니다.
지구곰이 아닙니다.
Categories (190)
Information (5)
About uzoogom (5)
My Advanced Linux (73)
Learning Linux (96)
OperatingSystem (5)
Databases (4)
Tips! (1)
OpenSource (1)
«   2018/09   »
            1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30            
  1. 2012/12 (2)
  2. 2012/04 (3)
  3. 2012/03 (6)
  4. 2012/02 (6)
  5. 2012/01 (2)