RSS구독하기:SUBSCRIBE TO RSS FEED
즐겨찾기추가:ADD FAVORITE
글쓰기:POST
관리자:ADMINISTRATOR
'2006/09/08'에 해당되는 글 143

fdisk 와 cfdisk 사용하기

루트 디스크를 사용한 다음 첫번째 설치 단계는 하드디스크에 대한 파티션 테이블을 작성하는 것이다. 앞에서 파티션을 나누기 위해 FDISK를 사용했다 하더라도 이제 다시 파티션 테이블 작성으로 되돌아와 리눅스가 알아듣는 정보를 넣어주어야 한다.

리눅스 파티션을 만들기 위해서 리눅스 버전의 fdisk 프로그램 또는 화면 중심의 cfdisk 프로그램을 이용해야 한다.

일반적으로 설치 프로그램은 이미 존재하는 파티션 테이블을 찾아서 그걸 바탕으로 fdisk 또는 cfdisk를 실행시키도록 해준다. 둘 중에 cfdisk의 사용이 더 쉽다. 그러나 현재 버전은 파티션 테이블이 존재하지 않거나 잘못된 것이면 사용하기가 어렵다.

(특히 어떤 오퍼레이팅 시스템도 설치되어 있지않은 처녀 시스템의 경우) cfdisk를 사용할 수 있는 상태로 만들기 위해 먼저 fdisk를 실행시킬 필요가 있는 경우가 있다. 먼저 cfdisk를 실행시켜보고 안되면 fdisk를 사용하기 바란다. (여러분의 컴퓨터에 리눅스만을 설치할 계획인데 cfdisk를 사용할 수 없다면, 먼저 fdisk를 실행시켜 존재하는 파티션을 모두 지워버린 후에 cfdisk를 실행시켜 파티션 테이블을 작성하는 것도 좋은 방법이다.)

fdisk 와 cfdisk 모두에 적용되는 몇가지 주의사항. 둘다 리눅스 파티션을 만들 드라이브의 이름을 지정해줄 변수를 필요로한다. 하드 드라이브의 장치 이름은:

/dev/hda First IDE drive

/dev/hdb Second IDE drive

/dev/sda First SCSI drive

/dev/sdb Second SCSI drive

예를 들어, 첫번째 SCSI 드라이브에 리눅스 파티션을 만들려고 한다면 아래의 명령을 사용해야 할 것이다 (어떤 설치 프로그램은 메뉴를 선택하는 것일 수도 있다) :

cfdisk /dev/sda

fdisk 또는 cfdisk에 아무런 변수 지정 없이 사용한다면 /dev/hda 에 리눅스 파티션을 만드는 것으로 여길 것이다.

시스템의 두 번째 드라이브에 리눅스 파티션을 만들고자 하면 /dev/hdb (IDE 드라이브의 경우) 또는 /dev/sdb (SCSI 드라이브의 경우) 라고 입력한다.

리눅스 파티션이 모두 하나의 드라이브에 있을 필요는 없다. 예를 들어, 루트 파일시스템을 위한 파티션은 /dev/hda 에, 스왑 파티션은 /dev/hdb 에 만들 수 있다. 그렇게 하려면 각각의 드라이브에 대하여 fdisk 또는 cfdisk를 한번씩 실행시키면 된다.

리눅스에서 파티션들은 그들이 속해 있는 드라이브를 바탕으로 한 이름이 주어진다. 예를 들어 드라이브 /dev/hda의 첫 번째 파티션은 /dev/hda1, 두 번째는 /dev/hda2 ... 등으로 이름이 주어진다. 만약 어떠한 로지컬 파티션을 가진다면 그것들은 /dev/hda5에서 시작하여 /dev/hda6 등의 순서로 이름이 붙여진다.

NOTE: 리눅스 fdisk 또는 cfdisk로는 리눅스외의 오퍼레이팅 시스템을 위한 파티션을 만들거나 지우면 안된다. 즉, 리눅스 버전의 fdisk를 사용하여 MS-DOS 파티션을 만들거나 지우지 말라. 대신에 MS-DOS 버전의 FDISK를 사용하기 바란다. 리눅스 fdisk 로 MS-DOS 파티션을 만들려고 한다면 아마 MS-DOS는 그 파티션을 인식하지 못할 것이고 부팅이 올바로 되지 않을 것이다.

여기에 fdisk 사용의 예가 있다. 드라이브에 61693 블록을 사용하는 하나의 MS-DOS 파티션을 가지고 있고 드라이브의 그 나머지는 리눅스를 위하여 남겨둔 것이다. (리눅스하에서 1블럭은 1024바이트, 그러므로 61693블럭은 대략 61메가 바이트) 두 개의 리눅스 파티션을 만들려 한다고 하자. 하나는 스왑, 다른 하나는 루트 파일시스템을 위한 것이다. 이 예를 응용하면 저 위에서 추천한 네개의 파티션 만들기를 할 수 있을 것이다: 하나는 스왑, 하나는 루트 파일시스템, 하나는 시스템 소프트웨어 (/usr), 나머지 하나는 홈 디렉토리.

먼저, 현재 파티션 테이블을 표시하기 위해 명령어 "p"를 사용한다. 보다시피, /dev/hda1은 (/dev/hda의 첫 번째 파티션) 61693블럭의 도스 파티션이다.

Command (m for help): p

Disk /dev/hda: 16heads, 38 secrors, 683 cylinders

Units = cylinders of 608 * 512 bytes

Device Boot Begin Start End Blocks Id System

/dev/hda1 * 1 1 203 61693 6 DOS 16-bit >=32M

Command (m for help):

그 다음에 명령어 "n"을 사용하면 새로운 파티션을 생성시킬 수 있다. 리눅스 루트 파티션의 크기를 80 메가로 할 것이다.

Command (m for help): n

Command action

e extended

p primary partition (1-4)

p

extended 혹은 primary 파티션을 생성할 것인지 물어볼 것이다. 대부분의 경우. 한 개의 드라이브에 네 개이상의 파티션을 팔요로 하지 않는다면 primary 파티션을 사용하려 할 것이다. 더 자세한 것은 저 위의 "Repartitioning" 절을 참고하기 바란다.

Partition number (1-4): 2

First cylinder (204-683): 204

Last cylinder or +size or +sizeM or +sizeK (204-683): +80M

첫 번째 실린더는 마지막 파티션이 끝난 뒤의 실린더가 되어야 한다. 이 경우에 /dev/hda1은 실린더 203에서 끝났다. 그래서 실린더 204에서 새로운 파티션이 시작된다.

보다시피, "+80M" 이라고 표기를 한다면 그것은 크기가 80메가인 파티션을 규정하는 것이다. 유사하게, "+80K" 라는 표기는 80킬로바이트 파티션을 규정한다. 그리고 "+80"은 단지 80바이트 파티션을 규정한다.

Warning: Linux cannot currently use 33090 sectors of this partition

여러분이 위와 같은 경고문을 보게 된다면 무시해도 좋다. 리눅스 파일시스템의 크기가 64 메가 이상일 수 없었던 오래전의 한계에서부터 연유된것일 뿐이다. 오늘날의 파일시스템 타입에 적용되는 것이 아니다. 오늘날 파티션들의 크기는 4테라바이트까지 가능하다.

다음엔 10메가 스왑 파티션, /dev/hda3 을 생성한다.

Command (m for help): n

Command action

e extended

p primary partition (1-4)

p

partition number (1-4): 3

First cylinder (474-683): 474

Last cylinder or +size or +sizeM or +sizeK (474-683): +10M

다시 한번, 파티션 테이블의 내용을 표시한다. 여기에 있는 정보를 기록하여 확인하기 바란다. 특히 각 파티션의 크기가 몇 block 인지를 확인한다. 나중에 이 정보가 필요하다.

Command (m for help): p

Disk /dev/hda: 16 heads, 38 sectors, 683 cylinders

Units = cylinders of 608 * 512 bytes

Device Boot Begin Start End Blocks Id System

/dev/hda1 * 1 1 203 61693 6 DOS 16-bit >=32M

/dev/hda2 204 204 473 82080 83 Linux native

/dev/hda3 474 474 507 10336 83 Linux native

리눅스 스왑 파티션은 (여기에서는 /dev/hda3) "Linux native" 라는 타입을 갖고 있다는 것에 주의해라. 이를 "Linux swap" 이라는 타입명으로 바꾸어야 하며 그렇게 하므로서 설치 프로그램이 스왑 파티션의 타입을 "Linux swap"으로 인식하도록 해야한다. 그렇게 하기위해 fdisk 에 "t" 라는 명령어를 사용하도록 한다.

Command (m for help): t

Partition number (1-4): 3

Hex code (type L to list codes): 82

"L"을 사용한다면 타입 코드 목록을 보여줄 것이고, 82가 리눅스 스왑과 일치하는 타입이라는 것을 알 수 있을 것이다.

파티션 테이블의 변경 사항을 저장하고 fdisk를 빠져나오려면 명령어 "w", 저장하지않고 그만두려면 "q"를 사용한다.

fdisk를 끝낸후에 바뀐 것이 효력을 발휘하도록 시스템이 여러분에게 재부팅 할건지 확인할지도 모른다. 일반적으로 fdisk를 사용한 후엔 재부팅할 이유가 없다. 요즘의 fdisk 와 cfdisk 버전은 재부팅하지 않고서도 바뀐 파티션 내용을 충분히 갱신할 수 있다



---------------------------------------------------------------------------------------


출처 카페 > 리눅스 웹마스터 키우기 / 리눅서
원본 http://cafe.naver.com/k2linux/39

리눅스 설치시 전문가용으로 fdisk 라는 파티션 프로그램을 볼 수 있다. 이 프로그램은 디스크 드루이드(Disk Druid)보다 더 세밀한 파티션 설정이 가능하다는 면에서 아주 유용하다. 특히 리눅스를 여러개 설치할 때에나 두 번째 이후의 파티션에 설치할 때에 Primary 파티션을 여러개 두고 싶다면 fdisk를 사용해야 한다. 그러면, 이 프로그램에 대한 사용법에 대해서 알아보도록 한다.


1. fdisk의 시작

fdisk를 이용해 새로운 파티션의 생성, 기존 파티션의 삭제, 파티션의 타입 결정 등의 작업을 수행할 수 있다. 그런데, 래드헷 계열의 배포판은 설치시 대부분 Disk Druid 유틸리티를 이용해서 파티션을 분할한다. 그렇지만, 전통적으로 fdisk를 사용하며 이것은 디스크 드루이드보다 유연하기 때문에 아직도 설치시에 이 프로그램을 사용한다.

fdisk 프로그램은 한번에 한 디스크에 대해서만 작업을 수행한다. fdisk는 명령어 프롬프트 중심의 매우 간단한 인터페이스를 가지고 있다. 그러면 fdisk를 실행해 보자.

# fdisk [Hard disk device]


fdisk를 실행하기 위해서는 어떠한 디스크의 파티션을 나눌 것인지 알려 주어야 한다. 즉 하나의 컴퓨터에 여러 개의 하드디스크가 설치될 수 있으므로 어떤 하드디스크의 파티션을 변경할 것인지 알려 주어야 한다.

fdisk /dev/hda를 실행하면 (파티션을 생성/삭제할 하드디스크가 IDE1의 마스터 드라이브일 경우) 다음과 같은 화면을 볼 수 있다.

# fdisk /dev/hda



그러면 다음과 같은 도입 화면이 나올 것이다.


fdisk는 독자적인 명령어를 가지고 있다. 도움말을 원한다면 간단하게 m 명령어를 통해 얻을 수 있다. 그리고, 이 정보만 보고서도 충분히 파티션을 할 수 있을 것이다. 다음은 이 명령을 사용했을 때 나오는 명령에 대한 해설이다.

명 령

기 능

a부트 가능한 플래그로 변경
bbsd 디스크 레이블을 편집
c도스 호환 플래그로 변경
d파티션 삭제
l알려진 파티션 형태의 목록
m이 메뉴를 출력
n새로운 파티션 추가
o새로운 도스 파티션 테이블을 생성
p파티션 테이블을 출력
q변경을 저장하지 않고 종료
s새로운 Sun 디스크 레이블을 생성
t파티션의 시스템 id를 변경
u표시/엔트리 단위를 변경
v파티션 테이블을 점검
w디스크에 테이블을 기록하고 빠져나감


2. fdisk 명령어

다음은 fdisk 명령어에 대한 것들을 알아보자. 일단 많이 사용되는 명령어부터 해서 각각의 명령어들의 사용법에 대해서 알아보도록 한다.

  • m - 도움말

    이 명령어를 입력하면 fdisk는 Command(m for help): 라는 프롬프트를 보여주며 명령을 기다린다. m을 입력하면 다음과 같은 도움말을 볼 수 있다. 명령어를 전체적으로 외우기가 그렇게 쉬운 일만은 아니므로 이 명령어를 자주 사용하게 될 것이다.


  • p - 파티션 현황

    선택한 디스크에 있는 기존의 파티션 현황을 보기 위해서는 p를 입력하면 된다. 만약 기존에 파티션이 있고 파티션을 새로 만들어야 한다거나 만들어야 할 파티션이 많은 경우에 파티션 상태를 확인하는데 사용된다. 만약 기존의 모든 파티션을 하나씩 없애고 싶다면 d 명령어와 함께 제거하고자 하는 파티션의 번호를 입력하면 된다.


  • n - 파티션 생성

    새로운 파티션을 만들려면 n 명령어를 사용한다. 파티션 생성을 위해 우선 다음과 같이 n을 입력한다.

    Command (m for help): n

    다음에 나오는 선택 사항에서 우선 Primary 파티션을 만들어야 하므로 p를 입력한다. 4개 이상의 파티션을 만들고 싶을 경우에만 확장 파티션이 필요하다.

    Command action
      e extended
      p primary partition ( 1-4 )

    그 다음 프롬프트에서는 파티션 번호를 선택한다.

    Partition number ( 1-4 ) : 1

    첫 번째 파티션 이라면 1을, 두 번째는 2를 입력한다. 다음에는 파티션의 시작 블록 번호를 입력해야 한다. 괄호 안에 있는 숫자는 파티션에 사용할 수 있는 블록의 범위이다. 이번 파티션이 첫 번째 파티션이면 1을 시작 블록으로 한다.

    First cylinder ( 1-1024 ) : 1

    크기가 80Mbyte 인 파티션을 만들고 싶으면 바이트, 킬로바이트, 메가바이트로 크기를 지정할 수 있다.

    Last cylinder or +size or +sizeM or + sizeK ([1]-1024): +80M

    파티션이 잘 만들어 졌는지 확인을 해야 한다. 파티션 정보를 보려면 명령어 p를 사용한다.

    앞서 extended 파티션은 도스와는 조금 다르게 FDISK와 같이 4개 이상의 파티션을 만들기 위해 사용된다. 도스에서는 Primary 이외의 파티션을 모두 extended에 두지만 리눅스에서는 4번째 파티션을 extended로 잡고 아래에 다시 4개의 파티션을 만들 수 있다. 파티션 번호는 extended 파티션 번호 다음 번호부터 다시 잡힌다.

  • a - 부트 파티션 지정

    알맞게 파티션을 나눈 후에 부트파티션을 지정해 주어야 한다. 대부분 첫 번째 Primary 파티션을 부트파티션으로 잡는다. 프롬프트에서 다음과 같이 입력한다.

    Command(m for help) : a
    Partition number (1-6) : 1

  • d - 삭제

    삭제해야 할 파티션이 있다면 d 명령을 사용하여 삭제할 수 있다. 다음과 같이

    Command (m for help): d
    Partition number (1-8): [파티션 번호]

  • t 파티션의 시스템 id를 변경

    만들어진 파티션의 시스템 id는 기본적으로 83번으로 Linux 파티션이다. 그렇지만, 경우에 따라서 Dos 파티션을 만들어야 하는 경우도 있고 swap 파티션을 만들어야 하는 경우도 있다. 이 경우에 시스템 id를 변경해 주기 위해서 t 명령어를 사용한다. 다음은 t 명령어를 사용해서 83번으로 되어 있던 시스템 id를 82번으로 바꾼 예제이다.


  • l - 알려진 파티션 형태의 목록

    앞서 t 명령어를 사용할 때 시스템 id의 정보를 알아보기 위해서는 l 명령어를 사용한다.


  • w - 저장 후 종료

    일련의 작업이 끝난 후 실제로 반영시키기 위해서 w명령으로 변경 내용을 저장한 후 종료한다. 만약 새로 파티션을 생성하는 경우라면 재부팅을 해야 새로운 파티션이 인식이 된다. 그러므로, 포맷을 하기 위해서는 컴퓨터를 재부팅한다.


  • q - 저장하지 않고 종료

    실수로 파티션을 삭제하거나 잘못 설정한 경우에는 q 명령으로 변경 내용을 반영하지 않고 종료하거나 Ctrl + C키를 눌러 강제 종료 시켜야 한다.

    다음과 같이 q 명령을 내리면 그대로 fdisk가 종료된다.

    Command (m for help): q

  • b - bsd 디스크 레이블을 편집

    만약 컴퓨터가 알파 시스템이라면 bsd 디스크 레이블로 파티션을 편집해야 할 수도 있다. 이 경우에 b 명령어로 그렇게 할 수 있도록 환경을 변경해 주어야 한다. 이후의 파티션을 잡는 방식은 앞서와 같다.


[파티션 복구]


리눅스의 fdisk는 Windows 시스템의 fdisk와 달리 잘못 사용한 경우에 복구가 가능하다. 우선 이전의 실린더 숫자를 적어 두고 파티션을 나눈다. 그러면, 파티션을 잘못하고 저장한 경우 다른 시스템에 연결하여 실린더를 맞추어 이전의 것을 복구할 수 있다. 이것은 보안을 위해서도 사용될 수 있는데, 하드디스크의 실린더 숫자를 적어 놓고 파티션을 다르게 해버리면 파일시스템을 제대로 사용할 수 없게 된다. 이렇게 실린더 숫자를 적어 두는 것은 불시의 사고에 대비하는 방법이기도 한데, 만약 fdisk를 하면서 실수로 잘못 저장한 경우에 이전의 실린더 번호대로 복구하면 이전 상태 그대로 된다.


3. 파티션 요령과 fdisk 사용

fdisk를 이용해서 서버로 사용될 시스템의 파티션을 나눠 보도록 하자. 하드 디스크를 분할하는 것에는 일정한 공식은 없지만, 각각의 파일시스템에 사용될 파티션은 하드 디스크의 퍼센트보다는 각각의 사용 용량에 따라서 나눠 준다.

다음은 파일시스템에 따른 파티션 용량이다.

  • / - 300메가. 만약 위와 같이 각각을 모두 나눠서 파티션 한다면 /는 큰 용량이 필요 없다. 만약 하나의 세 개의 파티션으로 나눠야 한다면 /home, /, swap으로 나눠 주는 것이 좋다. 그리고, 이 경우라면 이 파티션은 약 3기가 정도의 크기여야 한다. 그리고, 이 경우에 /home 파티션은 크면 클수록 좋다.
  • /boot - 50메가. 50~60메가 정도로 잡는다. 아주 넉넉하게 100메가로 잡아도 상관 없다.
  • /var - 2기가. 서버로 사용하는 경우 메일 서버의 스풀과 메일 박스가 있는 장소로 충분히 크게 잡으면 좋다. 만약 이것이 없다면 300~500메가로 정도로 잡아도 상관 없고 파티션을 나누지 않아도 무관하다. 그렇지만 개인적으로 메일 서버롤 돌려야 하는 상황이라면 메일 박스를 홈디랙토리로 옮겨서 잡아주는 방법도 있다.
  • /usr - 2기가 이상. 이곳에는 온갖 잡다한 것들이 다 들어 간다. 처음 설치시 시스템에서 가장 많은 용량을 차지하는 곳이고 이후에 프로그램 설치시 이곳에 저장이 된다. 말하자면 윈도우즈 시스템의 Program Files 디랙토리와 windows 디랙토리의 일부를 합쳐 둔 것과 비슷하다. 사실 2기가로도 부족한 면이 있지만 많은 프로그램들을 운영할 계획이 없다면 이정도면 괜찮다. 만약 하드 디스크를 다시 분할하기 어렵고 각각의 파티션이 1.6기가 정도라면 /, /usr/share 정도로 나눠주면 된다. 처음 설치시 /usr/share의 용량은 상당히 크기 때문이다. 이후에 이것을 적당히 다시 조정할 수도 있을 것이다.
  • /tmp - 500메가. 이 부분은 X Window 같은 프로그램이 돌아가거나 윈도우즈의 temp와 같은 역할을 위한 작업을 하기 위한 공간으로 사용됩니다. 따라서 이정도는 필요할 것입니다.
  • swap - 물리적 메모리의 두배 정도면 충분하다. 물리적 메모리를 넉넉하게 하는 것이 컴퓨터를 사용하는데 좋다.
  • /home - 나머지 용량의 모두를 잡는다, 홈파티션이 생각보다 많이 필요하다. 특히, 시스템이 데스크탑용이거나 사용자가 많은 서버의 경우에는 절대적으로 많은 용량이 필요할 것이다.

이외에 자신의 필요에 따라 백업용 파티션을 나누거나 일정한 파티션에 백업용 공간을 둘 수 있을 겁니다.

위와 같이 나누면 되지만 일단 /, /usr, /home, swap, /boot 정도로 파티션을 나눠본다.

우선 /boot를 만든다. 이곳에는 시스템 부트에 관계되는 파일들이 있게 된다. 따라서, 이 부분은 가장 앞부분에 위치하도록 하는 것이 좋다. 만약 시스템에 윈도우즈 시스템에 있고 /boot가 1024 실린더 다음에 위치하게 되는 경우라면 이 파티션을 먼저 앞에 잡아 두고 다음에 윈도우즈용 파티션을 잡아 두는 것이 무리가 없다. 물론 lba32 옵션으로 lilo를 MBR에 설치할 수는 있지만 이것보다는 /boot 파티션을 앞에 잡아 두는 것이 더 편하다.

다음은 n 명령어로 파티션을 생성하는 것이다. 먼저 n 명령을 내린 다음, p로 primary 파티션으로 지정하고 파티션 번호를 지정한다. 이후에 시작 실린더 번호를 지정하고 마지막 실린더를 지정하거나 크기를 지정하면 된다.


다음에는 /, /usr, /home. swap를 위한 파티션을 차례로 잡아준다. swap의 경우에는 반드시 t 명령으로 시스템 id를 82번 swap으로 바꿔 주어야 한다.

다음은 /를 위한 두번째 파티션으로 300M를 잡아주는 모습이다.


다음은 /usr을 위한 파티션으로 2500M를 잡아주는 모습이다.


다음은 확장 파티션을 잡는 모습이다.


다음은 확장 파티션 아래에 swap 파티션으로 500M를 잡고 /home 파티션으로 남은 모든 공간을 잡은 모습이다.


다음은 p 명령어로 파티션 현황을 확인한 모습이다.


다음은 마지막으로 swap 파티션의 시스템 id를 82번으로 변경한 모습이다.


만약 윈도우즈 시스템이 있다면 swap 파티션을 윈도우즈 시스템과의 중간에 두거나 윈도우즈 시스템과 약간의 간격을 두고 파티션을 해주는 것이 안전하다. 파티션을 할 때 주의할 점의 하나는 윈도우즈 시스템의 FDISK에서 확장 파티션으로 잡은 도스용 파티션에 리눅스를 설치하지 말라는 것이다. 이 경우에 윈도우즈에서 리눅스 파티션이 보이면서 제대로 읽지 못해 시스템에 문제가 생길 수 있다.

파티션 편집이 모두 끝났다면 w 명령으로 설정을 저장하고 fdisk를 종료한다.


2006/09/08 22:28 2006/09/08 22:28
이 글에는 트랙백을 보낼 수 없습니다
--tcp-flags
'!' 옵션을 사용한다면 이것 뒤에 두개의 단어를 사용한다. 첫번째 것은 검사하고자 하는 지시자 리스트의 마스크이다. 두번째 단어는 지시자에게 어떤것이 설정 될 것인지를 말해준다. 예를들어,

# iptables -A INPUT -s 192.168.1.1 --protocol tcp --tcp-flags SYN,RST,ACK,SYN -j DENY
192.168.1.1로 부터 tcp방식에 의한 접속 차단

--syn
이것은 '--tcp-flags SYN,RST,ACK,SYN'의 약어이다.

# iptables -A INPUT -p TCP -s 192.168.1.1 --syn -j DENY

--source-port or --sport
Source 포트

--destination-port or --dport
도착지 포트

*****UDP 확장
이 확장은 '--protocol udp'가 지정되고 적용이 저정되지 않으면 자동으로 적재된다. 이것은 '--source-port', '--sport', '--destination-port', '-dport'를 지원하고 내용은 TCP 설명에서 자세히 나왔다.

*****새로운 타겟

타겟의 다른 형태는 확장이다. 타겟 확장은 커널 모듈로 구성된다. 그리고 iptables 에 대한 선택적 확장은 새로운 명령행의 옵션을 제공한다. 기본적으로 넷필터 배포에 포함된 몇몇의 확장은 다음과 같다.

LOG
일치하는 패킷의 커널 로그를 제공한다. 이것은 부가의 옵션을 제공한다.

--log-level 레벨 숫자나 이름 지정
'debug' 'info', 'notice', 'warning', 'err', 'crit', 'alert', 'emerg' 이름은 각각 숫자 7 에서 0 에 대응된다.
--log-prefix 14자 까지의 문장을 지정

REJECT
이 모듈은 'DROP'과 같은 효과를 나타낸다. 다만, 'port unreachable' 이라는 에러 메세지를 ICMP 로 보낸다.

RETURN
RETURN은 한 체인의 끝으로 보내지는 것과 같은 효과가 있다. : 미리 만들어진 체 인의 경우 그 체인의 정책은 실행이다. 사용자 정의 체인의 경우 이 체인으로 점프 하는 규칙의 바로 다음인 이전 체인으로 이동한다.

QUEUE
QUEUE은 특별한 타겟으로, 사용자공간의 작업을 위해 패킷을 대기하도록 한다. 패킷 을 위해서 대기하고있는 것이 없다면(즉, 이 패킷을 다룰 프로그램이 아직 씌어져 있지 않다면) 패킷은 DROP 될 것이다.

***3.4 타겟 지정

이제 패킷에서 어떤 검사를 할 수 있는지를 알았다. 이제 우리의 검사에 일치 하는 패킷을 어떻게 할 것인지를 말하는 것을 알아야 한다. 이것을 규칙 타겟 이라고 한다.

두개의 이미 만들어진 단순한 타겟이 있다. : DROP 과 ACCEPT. 이미 이것에 대해서는 이야기를 한 적이 있다. 적용이 되는 패킷과 그것의 타겟이 위의 두 개중 하나라면 더이상의 참고할 규칙은 없다. : 패킷의 운명은 결정 되는 것 이다.

이미 만들어진 두개의 타겟외에 두가지 형태의 타겟이 있다.: 확장과 사용자 지정의 체인들 이다.

****사용자 지정의 체인들

ipchains로 부터 상속되는 iptables의 강력한 기능중의 하나는 능력되는 사용 자가 기존의 세개의 체인(입력, 출력, 포워드)외에 새로운 체인을 생성할 수 있다는 것이다. 모임의 결과 사용자 지정의 체인은 그것을 구분하기 위하여 소문 자로 나타낸다. (아래 전체 체인에 대한 작용 부분에서 어떻게 사용자 지정의 새로운 체인을 만드는지 기술할 것이다.)

타겟이 사용자 지정의 체인인 규칙에 패킷이 맞으면 패킷은 사용자 지정의 체인을 따라 움직이게 된다. 그 체인이 패킷의 운명을 결정하지 못하면 그리고 그 체인에 따른 이송이 끝나면, 패킷은 현제 체인의 다음 규칙으로 돌아온다.

그림을 보자. 두개의 체인이 있고 그것이 입력과 테스트라는 사용자 지정의 체인이 라고 가정하자.

         `INPUT'                         `test'
        ----------------------------    ----------------------------
        | Rule1: -p ICMP -j DROP   |    | Rule1: -s 192.168.1.1    |
        |--------------------------|    |--------------------------|
        | Rule2: -p TCP -j test    |    | Rule2: -d 192.168.1.1    |
        |--------------------------|    ----------------------------
        | Rule3: -p UDP -j DROP    |
        ----------------------------

192.168.1.1 로부터 와서 1.2.3.4 로 향하는 TCP 패킷이 있다고 가정한다. 이것은 입력 체인으로 들어온다. Rule1 을 검사한다. 맞지 않음. Rule2 맞음. 그것의 타겟 은 테스트, 고로 다음 검사할 규칙은 테스트의 시작이다. 테스트의 Rule1 이 맞다. 그러나 이것이 타겟을 지정하지 않는다. 그러므로 다음 규칙이 검사된다. Rule 2. 맞지 않다. 그 체인의 끝에 도달했다. 다시 입력 체인으로 돌아가서 Rule3 을 검사 한다. 그것도 맞지 않다.

여기서 패킷의 이동경로를 그림으로 나타냈다.

                               v    __________________________
        `INPUT'                |   /    `test'                v
       ------------------------|--/    -----------------------|----
       | Rule1                 | /|    | Rule1                |   |
       |-----------------------|/-|    |----------------------|---|
       | Rule2                 /  |    | Rule2                |   |
       |--------------------------|    -----------------------v----
       | Rule3                 /--+___________________________/
       ------------------------|---
                               v

사용자 지정의 체인에서 대를 사용자 지정의 체인으로 갈수 있다. (그러나 루프 를 돌수는 없다. 루프를 발견하게 되면 패킷은 DROP 된다.)

잘못 설정한 예 - 순서를 바꾸어야 정상적으로 작동할 것이다.
iptables -A input -p tcp --dport 0:1023 -j DROP
iptables -A input -p tcp --dport 80 -j ACCEPT

***3.5 전체 체인에 대한 작용.

iptables의 유용한 기능주 하나는 여러 관계가 있는 규칙을 하나의 체인속으로 그룹화 하는 것이다. 체인의 이름은 어떤 것을 사용할 수도 있으나 미리 만들어 진 체인과의 혼동을 막기 위하여 소문자를 사용하기를 권한다. 체인의 이름은 16 자 까지 가능하다.

****새로운 체인 생성

# iptables -N test

****체인 제거
'-X' 나 '--delete-chain' 사용

# iptables -X test
체인을 지우기 위해서는 체인이 비어있어야 하며 다른 규칙의 타겟이 아니어야 한다.

****체인 비우기
'-F' ('--flush') 사용

# iptables -F forward

체인을 지정하지 않으면 모든 체인의 규칙이 지워진다.

****체인 규칙 나열하기
'-L' 사용
예)
iptables -L INPUT
iptables -t nat -L

**4. NAT(Network Address Translation) 활용

***4-1 NAT 이란
SNAT(Source Nat), DNAT(Destination Nat)

[PREROUTING](DNAT) --> Routing ------------> [POSTROUTING](SNAT) -->
                        |                          ^
                        |                          |
+- local Process ----------+  

****NAT의 활용

*****예1)MASQUERADING
   iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

*****예2) 고정IP 하나로 내부호스트들에 대한 서비스하기

   # soribada & dialpad for Sung-ho
   iptables -A PREROUTING -t nat -p udp --dport 9068 -j DNAT --to 192.168.1.7:9068
   iptables -A PREROUTING -t nat -p udp --dport 9067 -j DNAT --to 192.168.1.7:9067
   iptables -A PREROUTING -t nat -p udp --dport 9066 -j DNAT --to 192.168.1.7:9066
   iptables -A PREROUTING -t nat -p udp --dport 9065 -j DNAT --to 192.168.1.7:9065
   iptables -A PREROUTING -t nat -p tcp --dport 51210 -j DNAT --to 192.168.1.7:51210
   iptables -A PREROUTING -t nat -p udp --dport 51200 -j DNAT --to 192.168.1.7:51200
   iptables -A PREROUTING -t nat -p udp --dport 51201 -j DNAT --to 192.168.1.7:51201
   iptables -A PREROUTING -t nat -p tcp --dport 51210 -j DNAT --to 192.168.1.7:51210
   iptables -A PREROUTING -t nat -p udp --dport 51200 -j DNAT --to 192.168.1.7:51200
   iptables -A PREROUTING -t nat -p udp --dport 51201 -j DNAT --to 192.168.1.7:51201

   # nanumi for Sung-ho
   iptables -A PREROUTING -t nat -p udp --dport 9292 -j DNAT --to 192.168.1.7:9292
   iptables -A PREROUTING -t nat -p tcp --dport 9292 -j DNAT --to 192.168.1.7:9292

   # Winamp broadcast for Sung-ho
   iptables -A PREROUTING -t nat -p udp --dport 8000 -j DNAT --to 192.168.1.7:8000
   iptables -A PREROUTING -t nat -p tcp --dport 8000 -j DNAT --to 192.168.1.7:8000

   # ftp for Bokyu
   iptables -A PREROUTING -t nat -p udp --dport 2100 -j DNAT --to 192.168.1.5:2100
   iptables -A PREROUTING -t nat -p tcp --dport 2100 -j DNAT --to 192.168.1.5:2100

   # telnet for Bokyu
   iptables -A PREROUTING -t nat -p udp --dport 2300 -j DNAT --to 192.168.1.5:2300
   iptables -A PREROUTING -t nat -p tcp --dport 2300 -j DNAT --to 192.168.1.5:2300

   # www for Bokyu
   iptables -A PREROUTING -t nat -p udp --dport 8080 -j DNAT --to 192.168.1.5:8080
   iptables -A PREROUTING -t nat -p tcp --dport 8080 -j DNAT --to 192.168.1.5:8080

*****예3) 투명프록시

111.111.111.112   <->   192.168.1.2
111.111.111.113   <->   192.168.1.3
111.111.111.114   <->   192.168.1.4

내부 호스트의 Gateway 192.168.1.1

/etc/network/interfaces
------------------------------------------------------------------------
# /etc/network/interfaces -- configuration file for ifup(8), ifdown(8)

# The loopback interface
# automatically added whe upgrading
auto lo
iface lo inet loopback

# The first network card - this entry was created during the Debian installatio
# (network, broadcast and gateway are optional)
# automatically added whe upgrading

auto eth0
iface eth0 inet static
     address 111.111.111.112
     netmask 255.255.255.0
     broadcast 111.111.111.255
     network 111.111.111.0
     gateway 111.111.111.1

auto eth0:0
iface eth0:0 inet static
     address 111.111.111.113
     netmask 255.255.255.0
     broadcast 111.111.111.255
     network 111.111.111.0

auto eth0:1
iface eth0:1 inet static
     address 111.111.111.114
     netmask 255.255.255.0
     broadcast 111.111.111.255
     network 111.111.111.0

auto eth1
iface eth1 inet static
     address 192.168.1.1
     netmask 255.255.255.0
     broadcast 192.168.1.255
     network 192.168.1.0

auto eth1:0
iface eth1:0 inet static
     address 192.168.1.2
     netmask 255.255.255.0
     broadcast 192.168.1.255
     network 192.168.1.0
------------------------------------------------------------------------
*nat
-A PREROUTING -d 111.111.111.112 -j DNAT --to-destination 192.168.1.2
-A PREROUTING -d 111.111.111.113 -j DNAT --to-destination 192.168.1.3
-A PREROUTING -d 111.111.111.114 -j DNAT --to-destination 192.168.1.4    

-A POSTROUTING -s 192.168.1.2 -j SNAT --to-source 111.111.111.102
-A POSTROUTING -s 192.168.1.3 -j SNAT --to-source 111.111.111.103
-A POSTROUTING -s 192.168.1.4 -j SNAT --to-source 111.111.111.104

*****예4) 부하분산

RoundRobin 방식에 의한 부하분산
목적지 주소를 192.168.1.2 이나 192.168.1.3 또는 192.168.1.4로 바꾸기
iptables -t nat -A PREROUTING -i eth1 -j DNAT --to 192.168.1.2-192.168.1.4


**5. 시스템 부트시 초기화하기

위에서 적용하였던 여러가지 Rule들을 저장하거나 복구하는 도구로서 iptables-save 와 iptables-restore 가 있다.
간단한 예를 살펴보면
# iptables-save > myRule

아래는 생성된 myRule 파일이다.
------------------------------------------------------------------------------------
# Generated by iptables-save v1.2.3 on Sat Oct 27 15:06:49 2001
*nat
:PREROUTING ACCEPT [865:65046]
:POSTROUTING ACCEPT [4:752]
:OUTPUT ACCEPT [162:9841]
-A PREROUTING -p udp -m udp --dport 9068 -j DNAT --to-destination 192.168.1.7:9068
-A PREROUTING -p udp -m udp --dport 9067 -j DNAT --to-destination 192.168.1.7:9067
-A PREROUTING -p udp -m udp --dport 9066 -j DNAT --to-destination 192.168.1.7:9066
-A PREROUTING -p udp -m udp --dport 9065 -j DNAT --to-destination 192.168.1.7:9065
-A PREROUTING -p tcp -m tcp --dport 51210 -j DNAT --to-destination 192.168.1.7:51210
-A PREROUTING -p udp -m udp --dport 51200 -j DNAT --to-destination 192.168.1.7:51200
-A PREROUTING -p udp -m udp --dport 51201 -j DNAT --to-destination 192.168.1.7:51201
-A PREROUTING -p tcp -m tcp --dport 51210 -j DNAT --to-destination 192.168.1.7:51210
-A PREROUTING -p udp -m udp --dport 51200 -j DNAT --to-destination 192.168.1.7:51200
-A PREROUTING -p udp -m udp --dport 51201 -j DNAT --to-destination 192.168.1.7:51201
-A PREROUTING -p udp -m udp --dport 9292 -j DNAT --to-destination 192.168.1.7:9292
-A PREROUTING -p tcp -m tcp --dport 9292 -j DNAT --to-destination 192.168.1.7:9292
-A PREROUTING -p udp -m udp --dport 8000 -j DNAT --to-destination 192.168.1.7:8000
-A PREROUTING -p tcp -m tcp --dport 8000 -j DNAT --to-destination 192.168.1.7:8000
-A PREROUTING -p udp -m udp --dport 2100 -j DNAT --to-destination 192.168.1.5:2100
-A PREROUTING -p tcp -m tcp --dport 2100 -j DNAT --to-destination 192.168.1.5:2100
-A PREROUTING -p udp -m udp --dport 2300 -j DNAT --to-destination 192.168.1.5:2300
-A PREROUTING -p tcp -m tcp --dport 2300 -j DNAT --to-destination 192.168.1.5:2300
-A PREROUTING -p udp -m udp --dport 8080 -j DNAT --to-destination 192.168.1.5:8080
-A PREROUTING -p tcp -m tcp --dport 8080 -j DNAT --to-destination 192.168.1.5:8080
-A POSTROUTING -o eth0 -j MASQUERADE
COMMIT
# Completed on Sat Oct 27 15:06:49 2001
--------------------------------------------------------------------------------------
                                             
# iptables-restore myRule

위의 과정은 현재 설정되어 있는 Rule 을 myRule 파일에 저장하고 다시 저장되었던 Rule 을 복구하는 방법이다.
하지만 이러한 방법보다는 필자의 경우는 다음과 같은 형식의 스크립트를 /etc/init.d/myRule 이라는 스크립트로 만들어서 저장하고 Runlevel 2 에서 이를 적용하여 사용하고 있다.


----------------------------------------------------------------------------
/etc/init.d/myRule
#/bin/sh

case "$1" in
   start)
   echo "iptables myRule start"
   iptables-restore /etc/myRule.conf
stop)
   echo "iptables myRule stop"
   iptables -F
   iptables -t nat -F
   ;;
restart)
   echo "iptables stop"
   iptables -F
   iptables -t nat -F
   echo "iptables start"
   iptables-restore /etc/myRule.conf
esac
exit 0
----------------------------------------------------------------------------

스크립트에서는 myRule.conf 파일을 읽어서 시스템 부트시 설정을 복구하고 있다.
myRule.conf 파일을 만드는 법은 아마도 다 아시리라는 생각을 한다. ^^;
iptables-save 로 해서 만들경우의 단점은 아무래도 주석부분이 아닐까 한다.
즉 iptables-save로서 만든후에 부분부분 주석을 넣어놓는것도 좋은 방법중의 하나일 것이다.

**6. 방화벽 설정의 예

아래의 예는 조대원님(PCHarley)의 설정입니다. 참고로 첨부하였습니다.
----------------------------------------------------------------------
#!/bin/sh

###### TCP 변수 설정 ######

# 외부로 서비스할 데몬의 포트 지정
# 20 : ftp-data port
# 21 : ftp port
# 22 : ssh port
# 25 : smtp port
# 80 : http port
# 113 : auth ident port
TCP_ALLOWPORT="20 21 22 25 80 113"
TCP_DENYPORT=1024

# 특정 호스트에 특정 포트를 개방
# 선별적인 호스트에 대하여 선별적인 서비스 오픈과 DNS Zone Transfer를 위해
# 사용하면 편리 
# <호스트ip주소>:<포트> 형식으로 사용
#TCP_HOSTPERPORT=""

# 출발지 포트로 오픈을 결정
# 클라이언트 프로그램을 사용하기 위하여 1024 이하의 특정 포트를 개방
# 21 : ftp 서버 응답 포트
# 22 : ssh 서버 응답 포트
# 23 : telnet 서버 응답 포트
# 25 : mail 서버 응답 포트
# 43 : whois 응답 포트
# 53 : dns 서버 응답 포트
# 79 : finger 서버 응답 포트
# 80 : httpd 서버 응답 포트
# 110 : pop3 서버 응답 포트
# 113 : AUTH 서버 응답 포트
# 119 : nntp 서버 응답 포트
# 443 : https 서버 응답 포트
TCP_ALLOWSPORT="21 22 23 25 53 80 110 113 119 443"

###### UDP 변수 설정 #######

# UDP의 경우에는 이 프로토콜의 특성상 위험한 서비스가 많다.
# 이 프로토콜을 이용하는 서비스를 허용해야 할 경우에는 주의를 하는것이 좋다

# 외부로 서비스할 데몬의 포트
#UDP_ALLOWPORT=""
UDP_DENYPORT=1024

# 특정 호스트에 특정 포트를 개방
# 선별적인 호스트에 대하여 선별적인 서비스 오픈과 DNS Zone Transfer를 위해
# 사용하면 편리 
# <호스트ip주소>:<포트> 형식으로 사용
#UDP_HOSTPERPORT=""

# 출발지 포트로 오픈을 결정
# 클라이언트 프로그램을 사용하기 위하여 1024 이하의 특정 포트를 개방
# 53 : dns 서버 응답 포트
UDP_ALLOWSPORT="53"

###### 디폴트변수 설정 ######

IPTABLES=/sbin/iptables
IPADD="<ip Address>"

# 루트 권한으로 운영되는 포트들
PRIVPORTS="0:1023"

# 일반 권한으로도 운영될수 있는 포트들
UNPRIVPORTS="1024:65535"


# 리눅스 머신이 GATEWAY나 MASQ로 사용될 경우 spoof 공격이나 잘 알려진
# 위험한 주소로 부터 오는 공격을 막기 위한 변수 설정
LOOPBACK="127.0.0.0/8"
BROADCAST_SRC="0.0.0.0"
BROADCAST_DEST="255.255.255.255"
CLASS_A="10.0.0.0/8"
CLASS_B="172.0.0.0/8"
CLASS_C="192.0.0.0/8"
CLASS_D_MULTICAST="224.0.0.0/4"
CLASS_E_RESERVED_NET="240.0.0.0/5"

###### kernel tunable parameter ######

# 어떤 인터페이스에서도 ping 에 반응하지 못하도록
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all

# 브로드캐스트, 멀티캐스트 주소에 ICMP 메세지 보내는것 막기.
# smuf 공격 방지
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts

# ip 소스 라우팅을 방지(디폴트로 0이 되어 있지만 확실하게 하기 위함)
# ip 소스 라우팅이 허용될 경우 모든 방화벽 설정이 필요없게 된다.
for f in /proc/sys/net/ipv4/conf/*/accept_source_route
do
  echo 0 > $f
done

# DOS(서비스 부인 공격)의 방법인 SYN Attack을 방지하기 위하여 TCP syncookies를 enable
echo 1 > /proc/sys/net/ipv4/tcp_syncookies

# icmp_redirect 메세지를 거부
for f in /proc/sys/net/ipv4/conf/*/accept_redirects
do
   echo 0 > $f
done

# gateway나 Masquerading 머신으로 사용한다면 이 옵션은 반드시 포함 하여야 한다.
# echo 1 > /proc/sys/net/ipv4/ip_always_defrag

# 정의되지 않은 에러 메세지를 막음
echo 1 > /proc/sys/net/ipv4/icmp_ignore_bogus_error_responses

# ip sppof 방지
for pfile in /proc/sys/net/ipv4/conf/*/rp_filter
do
   echo 1 > $pfile
done

# Log Spoofed Packets, Source Routed Packets, Redirect Packets 등을 탐지하면 로그파일에 기록
echo 1 > /proc/sys/net/ipv4/conf/all/log_martians

##### 초기화 #####
# 호스트가 X 윈도도 깔리지 않은 서버용으로 운영될 경우에는 OUTPUT 기본 정책도
# DROP으로 하는것이 안전하다.
${IPTABLES} -F INPUT
${IPTABLES} -P INPUT DROP
${IPTABLES} -F OUTPUT
${IPTABLES} -P OUTPUT ACCEPT
${IPTABLES} -F FORWARD
${IPTABLES} -P FORWARD DROP

###### INPUT ######
###### TCP ######

# local loopback 허용
${IPTABLES} -A INPUT -i lo -j ACCEPT

# 1024 밑에 루트에 의해 서버가 사용할 포트 오픈
for values in ${TCP_ALLOWPORT}
do
   ${IPTABLES} -A INPUT -i eth0 -p tcp --dport ${values} -j ACCEPT
done

# 특정 호스트로의 포트를 개방
#for values in ${TCP_HOSTPERPORT}
#do
#   echo ${values} | {
#   IFS=':' read hosts ports
#        ${IPTABLES} -A INPUT -s ${hosts} -p tcp --dport ${ports} -j ACCEPT
#        }
#done

# 출발 포트가 초기 접속이 아닌 경우 허가된 포트에 대해서만 허가
for values in ${TCP_ALLOWSPORT}
do
   ${IPTABLES} -A INPUT -i eth0 -p tcp ! --syn --sport ${values} ! --dport ${PRIVPORTS} -j ACCEPT
done

# ftp 노말 모드의 경우 클라이언트에서 서버로 접속을 요청할 경우 서버의
# 20포트에서 클라이언트로 초기 접속을 요청하므로 20번 포트에서 초기 접속을
# 허가해줘야함 이는 일종에 보안 구멍을 유발 하므로 passive mode 나 proxy를
# 사용해서 이 hole을 막을는 것이 좋다
# 만약 일반 모드로의 접속을 허용해야 한다면 잘 알려진 위험한 포트를 제외한
# 나머지 포트로만 허용을 해야한다.

# open window 포트로의 서비스 요구 거부
${IPTABLES} -A INPUT -i eth0 -p tcp --sport 20 --dport 2000 -j LOG --log-prefix "To 20 From 2000 DROP"
${IPTABLES} -A INPUT -i eth0 -p tcp --sport 20 --dport 2000 -j DROP
# NFS 포트로의 서비스 요구 거부
${IPTABLES} -A INPUT -i eth0 -p tcp --sport 20 --dport 2049 -j LOG --log-prefix "To 20 From 2049 DROP"
${IPTABLES} -A INPUT -i eth0 -p tcp --sport 20 --dport 2049 -j DROP
# xwindow 포트로의 서비스 요구 거부
${IPTABLES} -A INPUT -i eth0 -p tcp --sport 20 --dport 6000:6010 -j LOG  --log-prefix "To 20 From 6000:6010 DROP"
${IPTABLES} -A INPUT -i eth0 -p tcp --sport 20 --dport 6000:6010 -j DROP

${IPTABLES} -A INPUT -i eth0 -p tcp --sport 20 --dport ${UNPRIVPORTS} -j ACCEPT

# 1024:65535 포트는 초기 접속이 아닌경우 허가 - ftp passive mode와 apt-get
# 에서 필요.
# 1023이하 허용할 출발 포트는 사용하는 클라이언트에 따라 위에서 직접 지정

${IPTABLES} -A INPUT -i eth0 -p tcp ! --syn --sport ${UNPRIVPORTS} --dport ${UNPRIVPORTS} -j ACCEPT

###### UDP ######

# 열어줄 포트 개방 1024 밑에 포트
# for values in ${UDP_ALLOWPORT}
# do
#     ${IPTABLES} -A INPUT -p tcp --dport ${values} -j ACCEPT
# done

# 특정 호스트로의 포트를 개방
# for values in ${UDP_HOSTPERPORT}
# do
#     echo ${values} | {
#     IFS=':' read hosts ports
#         ${IPTABLES} -A INPUT -s ${hosts} -p udp --dport ${ports} -j ACCEPT
#         }
# done

# 상대편 포트를 보고 허가
# UDP는 특성상 -syn같은 옵션으로 초기 접속을 제한할 수가 없다.
# 그렇기때문에 UDP 프로토콜에 대해서는 허가할 서비스에 대해 상당한 주의가
# 요망 된다.
for values in ${UDP_ALLOWSPORT}
do
   ${IPTABLES} -A INPUT -i eth0 -p udp --sport ${values} ! --dport ${PRIVPORTS} -j ACCEPT
done


# ICMP

# 죽음의 핑이라 불리는 DOS(서비스 거부)공격에 사용되는 프로토콜이다.
# 내부 호스트에 이익이 되는것만을 선별해서 허용해야 한다.

# echo-reply (pong) - 0
# destination-unreachable - 3
# source-quench - 4
# redirect - 5
# echo-request (ping) - 8
# time-exceeded (ttl-exceeded) - 11
# parameter-problem - 12

# icmp 패킷 유형중 echo-reply(0)를 허가함
# 이 호스트가 외부 호스트로 ping을 사용하기 위해 pong은 허가
${IPTABLES} -A INPUT -i eth0 -p icmp --icmp-type echo-reply -j ACCEPT

# icmp 패킷 유형중 destination-unreachable(3) 을 허가함
${IPTABLES} -A INPUT -i eth0 -p icmp --icmp-type destination-unreachable -j ACCEPT

# icmp 패킷 유형중 source-quench(4) 를 허가함
${IPTABLES} -A INPUT -i eth0 -p icmp --icmp-type source-quench -j ACCEPT

#  host에서 실행하는 traceroute 를 허용하기 위해 icmp time-exceeded(11)을
# 허용
${IPTABLES} -A INPUT -i eth0 -p icmp --icmp-type time-exceeded -j ACCEPT

# icmp 패킷 유형중 parameter-problem(12)을 허가함
${IPTABLES} -A INPUT -i eth0 -p icmp --icmp-type parameter-problem -j ACCEPT



###### deny 정책 #######
# deny 정책을 하기전에 먼저 허가할 것을 명시해야만 한다.

# ping을 이용한 DOS 공격에 대비하여 echo-request를 거부
${IPTABLES} -A INPUT -i eth0 -p icmp --icmp-type echo-request -j LOG --log-prefix "PING REJECT"
${IPTABLES} -A INPUT -i eth0 -p icmp --icmp-type echo-request -j REJECT

# icmp-type redirect(5) 거부
# 이것이 허용되면 외부에서 이 호스트의 라우팅 테이블을 임의로 조작할 수가 있게 된다.
${IPTABLES} -A INPUT -i eth0 -p icmp --icmp-type redirect -j LOG --log-prefix "icmp-type 5 DROP"
${IPTABLES} -A INPUT -i eth0 -p icmp --icmp-type redirect -j DROP

# 그외 허가 되지 않은 1023이하의 포트 모두를 막음
${IPTABLES} -A INPUT -i eth0 -p tcp --dport 1:${TCP_DENYPORT} -j LOG --log-prefix "Under 1024 Tcp DROP"
${IPTABLES} -A INPUT -i eth0 -p udp --dport 1:${TCP_DENYPORT} -j LOG --log-prefix "Under 1024 Udp DROP"
${IPTABLES} -A INPUT -i eth0 -p tcp --dport 1:${TCP_DENYPORT} -j DROP
${IPTABLES} -A INPUT -i eth0 -p udp --dport 1:${TCP_DENYPORT} -j DROP

# 외부에서 허가된 tcp 접속 요청 제외한 모든 tcp접속 요청을 거부함
${IPTABLES} -A INPUT -i eth0 -p tcp --syn -j LOG --log-prefix "TCP SYN REJECT"
${IPTABLES} -A INPUT -i eth0 -p tcp --syn -j REJECT


# 그밖의 확인할수 없는 패킷을 모두 DROP
${IPTABLES} -A INPUT -i eth0 -m state --state INVALID -j LOG --log-prefix "INVALID DROP"
${IPTABLES} -A INPUT -i eth0 -m state --state INVALID -j DROP


###### OUTPUT ######


# local loopback 은 모든 패킷을 허용
${IPTABLES} -A OUTPUT -o lo -j ACCEPT

#ICMP OUTPUT DROP
${IPTABLES} -A OUTPUT -o eth0 -p icmp --icmp-type echo-reply -j LOG --log-prefix "ICMP output DROP"
${IPTABLES} -A OUTPUT -o eth0 -p icmp --icmp-type destination-unreachable -j LOG --log-prefix "ICMP output DROP"
${IPTABLES} -A OUTPUT -o eth0 -p icmp --icmp-type time-exceeded -j LOG --log-prefix "ICMP output DROP"
${IPTABLES} -A OUTPUT -o eth0 -p icmp --icmp-type echo-reply -j DROP
${IPTABLES} -A OUTPUT -o eth0 -p icmp --icmp-type destination-unreachable -j DROP
${IPTABLES} -A OUTPUT -o eth0 -p icmp --icmp-type time-exceeded -j DROP


###### 사설 ip 및 기타 거부 ######
${IPTABLES} -A INPUT -i eth0 -s ${CLASS_A} -j LOG --log-prefix "CLASS_A DROP"
${IPTABLES} -A INPUT -i eth0 -s ${CLASS_A} -j LOG --log-prefix "CLASS_A DROP"
${IPTABLES} -A OUTPUT -o eth0 -s ${CLASS_A} -j LOG --log-prefix "CLASS_A DROP"
${IPTABLES} -A OUTPUT -o eth0 -d ${CLASS_A} -j LOG --log-prefix "CLASS_A DROP"
${IPTABLES} -A INPUT -i eth0 -s ${CLASS_A} -j DROP
${IPTABLES} -A INPUT -i eth0 -d ${CLASS_A} -j DROP
${IPTABLES} -A OUTPUT -o eth0 -s ${CLASS_A} -j DROP
${IPTABLES} -A OUTPUT -o eth0 -d ${CLASS_A} -j DROP

${IPTABLES} -A INPUT -i eth0 -s ${CLASS_B} -j LOG --log-prefix "CLASS_B DROP"
${IPTABLES} -A INPUT -i eth0 -s ${CLASS_B} -j LOG --log-prefix "CLASS_B DROP"
${IPTABLES} -A OUTPUT -o eth0 -s ${CLASS_B} -j LOG --log-prefix "CLASS_B DROP"
${IPTABLES} -A OUTPUT -o eth0 -d ${CLASS_B} -j LOG --log-prefix "CLASS_B DROP"
${IPTABLES} -A INPUT -i eth0 -s ${CLASS_B} -j DROP
${IPTABLES} -A INPUT -i eth0 -d ${CLASS_B} -j DROP
${IPTABLES} -A OUTPUT -o eth0 -s ${CLASS_B} -j DROP
${IPTABLES} -A OUTPUT -o eth0 -d ${CLASS_B} -j DROP

${IPTABLES} -A INPUT -i eth0 -s ${CLASS_C} -j LOG --log-prefix "CLASS_C DROP"
${IPTABLES} -A INPUT -i eth0 -s ${CLASS_C} -j LOG --log-prefix "CLASS_C DROP"
${IPTABLES} -A OUTPUT -o eth0 -s ${CLASS_C} -j LOG --log-prefix "CLASS_C DROP"
${IPTABLES} -A OUTPUT -o eth0 -d ${CLASS_C} -j LOG --log-prefix "CLASS_C DROP"
${IPTABLES} -A INPUT -i eth0 -s ${CLASS_C} -j DROP
${IPTABLES} -A INPUT -i eth0 -d ${CLASS_C} -j DROP
${IPTABLES} -A OUTPUT -o eth0 -s ${CLASS_C} -j DROP
${IPTABLES} -A OUTPUT -o eth0 -d ${CLASS_C} -j DROP
${IPTABLES} -A OUTPUT -o eth0 -d ${CLASS_C} -j DROP
${IPTABLES} -A INPUT -i eth0 -s ${LOOPBACK} -j LOG --log-prefix "INPUT loopback DROP"
${IPTABLES} -A OUTPUT -o eth0 -s ${LOOPBACK} -j LOG --log-prefix "INPUT loopback REJECT"
${IPTABLES} -A INPUT -i eth0 -s ${LOOPBACK} -j DROP
${IPTABLES} -A OUTPUT -o eth0 -s ${LOOPBACK} -j REJECT

${IPTABLES} -A INPUT -i eth0 -s ${BROADCAST_DEST} -j LOG --log-prefix "Broadcast_dest DROP"
${IPTABLES} -A INPUT -i eth0 -d ${BROADCAST_DEST} -j LOG --log-prefix "Broadcast_src DROP"
${IPTABLES} -A INPUT -i eth0 -s ${BROADCAST_DEST} -j DROP
${IPTABLES} -A INPUT -i eth0 -d ${BROADCAST_DEST} -j DROP

# class D multicast address 거부
# multicast 는 소스 주소로는 불법
${IPTABLES} -A INPUT -i eth0 -s ${CLASS_D_MULTICAST} -j LOG --log-prefix "class D Multicast DROP"
${IPTABLES} -A INPUT -i eth0 -s ${CLASS_D_MULTICAST} -j DROP

${IPTABLES} -A INPUT -i eth0 -s ${CLASS_E_RESERVED_NET} -j LOG --log-prefix "class E reserved net DROP"
${IPTABLES} -A INPUT -i eth0 -s ${CLASS_E_RESERVED_NET} -j DROP

# refuse addresses defined as reserved by the IANA
# 0.*.*.*, 1.*.*.*, 2.*.*.*, 5.*.*.*, 7.*.*.*, 23.*.*.*, 27.*.*.*
# 31.*.*.*, 37.*.*.*, 39.*.*.*, 41.*.*.*, 42.*.*.*, 58-60.*.*.*
# 65-95.*.*.*, 96-126.*.*.*, 197.*.*.*, 201.*.*.* (?), 217-223.*.*.*
${IPTABLES} -A INPUT -i eth0 -s 1.0.0.0/8 -j LOG --log-prefix "IANA reserved DROP"
${IPTABLES} -A INPUT -i eth0 -s 2.0.0.0/8 -j LOG --log-prefix "IANA reserved DROP"
${IPTABLES} -A INPUT -i eth0 -s 5.0.0.0/8 -j LOG --log-prefix "IANA reserved DROP"
${IPTABLES} -A INPUT -i eth0 -s 7.0.0.0/8 -j LOG --log-prefix "IANA reserved DROP"
${IPTABLES} -A INPUT -i eth0 -s 23.0.0.0/8 -j LOG --log-prefix "IANA reserved DROP"
${IPTABLES} -A INPUT -i eth0 -s 27.0.0.0/8 -j LOG --log-prefix "IANA reserved DROP"
${IPTABLES} -A INPUT -i eth0 -s 31.0.0.0/8 -j LOG --log-prefix "IANA reserved DROP"
${IPTABLES} -A INPUT -i eth0 -s 37.0.0.0/8 -j LOG --log-prefix "IANA reserved DROP"
${IPTABLES} -A INPUT -i eth0 -s 39.0.0.0/8 -j LOG --log-prefix "IANA reserved DROP"
${IPTABLES} -A INPUT -i eth0 -s 41.0.0.0/8 -j LOG --log-prefix "IANA reserved DROP"
${IPTABLES} -A INPUT -i eth0 -s 42.0.0.0/8 -j LOG --log-prefix "IANA reserved DROP"
${IPTABLES} -A INPUT -i eth0 -s 58.0.0.0/7 -j LOG --log-prefix "IANA reserved DROP"
${IPTABLES} -A INPUT -i eth0 -s 60.0.0.0/8 -j LOG --log-prefix "IANA reserved DROP"
${IPTABLES} -A INPUT -i eth0 -s 1.0.0.0/8 -j DROP
${IPTABLES} -A INPUT -i eth0 -s 2.0.0.0/8 -j DROP
${IPTABLES} -A INPUT -i eth0 -s 5.0.0.0/8 -j DROP
${IPTABLES} -A INPUT -i eth0 -s 7.0.0.0/8 -j DROP
${IPTABLES} -A INPUT -i eth0 -s 23.0.0.0/8 -j DROP
${IPTABLES} -A INPUT -i eth0 -s 27.0.0.0/8 -j DROP
${IPTABLES} -A INPUT -i eth0 -s 31.0.0.0/8 -j DROP
${IPTABLES} -A INPUT -i eth0 -s 37.0.0.0/8 -j DROP
${IPTABLES} -A INPUT -i eth0 -s 39.0.0.0/8 -j DROP
${IPTABLES} -A INPUT -i eth0 -s 41.0.0.0/8 -j DROP
${IPTABLES} -A INPUT -i eth0 -s 42.0.0.0/8 -j DROP
${IPTABLES} -A INPUT -i eth0 -s 58.0.0.0/7 -j DROP
${IPTABLES} -A INPUT -i eth0 -s 60.0.0.0/8 -j DROP

#65: 01000001    - /3 includes 64 - need 65-79 spelled out
${IPTABLES} -A INPUT -i eth0 -s 65.0.0.0/8 -j LOG --log-prefix "65-79 DROP"
${IPTABLES} -A INPUT -i eth0 -s 66.0.0.0/8 -j LOG --log-prefix "65-79 DROP"
${IPTABLES} -A INPUT -i eth0 -s 67.0.0.0/8 -j LOG --log-prefix "65-79 DROP"
${IPTABLES} -A INPUT -i eth0 -s 68.0.0.0/8 -j LOG --log-prefix "65-79 DROP"
${IPTABLES} -A INPUT -i eth0 -s 69.0.0.0/8 -j LOG --log-prefix "65-79 DROP"
${IPTABLES} -A INPUT -i eth0 -s 70.0.0.0/8 -j LOG --log-prefix "65-79 DROP"
${IPTABLES} -A INPUT -i eth0 -s 71.0.0.0/8 -j LOG --log-prefix "65-79 DROP"
${IPTABLES} -A INPUT -i eth0 -s 72.0.0.0/8 -j LOG --log-prefix "65-79 DROP"
${IPTABLES} -A INPUT -i eth0 -s 73.0.0.0/8 -j LOG --log-prefix "65-79 DROP"
${IPTABLES} -A INPUT -i eth0 -s 74.0.0.0/8 -j LOG --log-prefix "65-79 DROP"
${IPTABLES} -A INPUT -i eth0 -s 75.0.0.0/8 -j LOG --log-prefix "65-79 DROP"
${IPTABLES} -A INPUT -i eth0 -s 76.0.0.0/8 -j LOG --log-prefix "65-79 DROP"
${IPTABLES} -A INPUT -i eth0 -s 77.0.0.0/8 -j LOG --log-prefix "65-79 DROP"
${IPTABLES} -A INPUT -i eth0 -s 78.0.0.0/8 -j LOG --log-prefix "65-79 DROP"
${IPTABLES} -A INPUT -i eth0 -s 79.0.0.0/8 -j LOG --log-prefix "65-79 DROP"
${IPTABLES} -A INPUT -i eth0 -s 65.0.0.0/8 -j DROP
${IPTABLES} -A INPUT -i eth0 -s 66.0.0.0/8 -j DROP
${IPTABLES} -A INPUT -i eth0 -s 67.0.0.0/8 -j DROP
${IPTABLES} -A INPUT -i eth0 -s 68.0.0.0/8 -j DROP
${IPTABLES} -A INPUT -i eth0 -s 69.0.0.0/8 -j DROP
${IPTABLES} -A INPUT -i eth0 -s 70.0.0.0/8 -j DROP
${IPTABLES} -A INPUT -i eth0 -s 71.0.0.0/8 -j DROP
${IPTABLES} -A INPUT -i eth0 -s 72.0.0.0/8 -j DROP
${IPTABLES} -A INPUT -i eth0 -s 73.0.0.0/8 -j DROP
${IPTABLES} -A INPUT -i eth0 -s 74.0.0.0/8 -j DROP
${IPTABLES} -A INPUT -i eth0 -s 75.0.0.0/8 -j DROP
${IPTABLES} -A INPUT -i eth0 -s 76.0.0.0/8 -j DROP
${IPTABLES} -A INPUT -i eth0 -s 77.0.0.0/8 -j DROP
${IPTABLES} -A INPUT -i eth0 -s 78.0.0.0/8 -j DROP
${IPTABLES} -A INPUT -i eth0 -s 79.0.0.0/8 -j DROP

#80: 01010000   - /4 masks 80-95
${IPTABLES} -A INPUT -i eth0 -s 80.0.0.0/4 -j LOG --log-prefix "80-95 DROP"
${IPTABLES} -A INPUT -i eth0 -s 80.0.0.0/4 -j DROP

# 96: 01100000    - /4 makses 96-111
${IPTABLES} -A INPUT -i eth0 -s 96.0.0.0/4 -j LOG --log-prefix "96-111 DROP"
${IPTABLES} -A INPUT -i eth0 -s 96.0.0.0/4 -j DROP

#126: 01111110    - /3 includes 127 - need 112-126 spelled out
${IPTABLES} -A INPUT -i eth0 -s 112.0.0.0/8 -j LOG --log-prefix "112-126 DROP"
${IPTABLES} -A INPUT -i eth0 -s 113.0.0.0/8 -j LOG --log-prefix "112-126 DROP"
${IPTABLES} -A INPUT -i eth0 -s 114.0.0.0/8 -j LOG --log-prefix "112-126 DROP"
${IPTABLES} -A INPUT -i eth0 -s 115.0.0.0/8 -j LOG --log-prefix "112-126 DROP"
${IPTABLES} -A INPUT -i eth0 -s 116.0.0.0/8 -j LOG --log-prefix "112-126 DROP"
${IPTABLES} -A INPUT -i eth0 -s 117.0.0.0/8 -j LOG --log-prefix "112-126 DROP"
${IPTABLES} -A INPUT -i eth0 -s 118.0.0.0/8 -j LOG --log-prefix "112-126 DROP"
${IPTABLES} -A INPUT -i eth0 -s 119.0.0.0/8 -j LOG --log-prefix "112-126 DROP"
${IPTABLES} -A INPUT -i eth0 -s 120.0.0.0/8 -j LOG --log-prefix "112-126 DROP"
${IPTABLES} -A INPUT -i eth0 -s 121.0.0.0/8 -j LOG --log-prefix "112-126 DROP"
${IPTABLES} -A INPUT -i eth0 -s 122.0.0.0/8 -j LOG --log-prefix "112-126 DROP"
${IPTABLES} -A INPUT -i eth0 -s 123.0.0.0/8 -j LOG --log-prefix "112-126 DROP"
${IPTABLES} -A INPUT -i eth0 -s 124.0.0.0/8 -j LOG --log-prefix "112-126 DROP"
${IPTABLES} -A INPUT -i eth0 -s 125.0.0.0/8 -j LOG --log-prefix "112-126 DROP"
${IPTABLES} -A INPUT -i eth0 -s 126.0.0.0/8 -j LOG --log-prefix "112-126 DROP"
${IPTABLES} -A INPUT -i eth0 -s 112.0.0.0/8 -j DROP
${IPTABLES} -A INPUT -i eth0 -s 113.0.0.0/8 -j DROP
${IPTABLES} -A INPUT -i eth0 -s 114.0.0.0/8 -j DROP
${IPTABLES} -A INPUT -i eth0 -s 115.0.0.0/8 -j DROP
${IPTABLES} -A INPUT -i eth0 -s 116.0.0.0/8 -j DROP
${IPTABLES} -A INPUT -i eth0 -s 117.0.0.0/8 -j DROP
${IPTABLES} -A INPUT -i eth0 -s 118.0.0.0/8 -j DROP
${IPTABLES} -A INPUT -i eth0 -s 119.0.0.0/8 -j DROP
${IPTABLES} -A INPUT -i eth0 -s 120.0.0.0/8 -j DROP
${IPTABLES} -A INPUT -i eth0 -s 121.0.0.0/8 -j DROP
${IPTABLES} -A INPUT -i eth0 -s 122.0.0.0/8 -j DROP
${IPTABLES} -A INPUT -i eth0 -s 123.0.0.0/8 -j DROP
${IPTABLES} -A INPUT -i eth0 -s 124.0.0.0/8 -j DROP
${IPTABLES} -A INPUT -i eth0 -s 125.0.0.0/8 -j DROP
${IPTABLES} -A INPUT -i eth0 -s 126.0.0.0/8 -j DROP

#217: 11011001    - /5 includes 216 - need 217-219 spelled out
${IPTABLES} -A INPUT -i eth0 -s 217.0.0.0/8 -j LOG --log-prefix "217-219 DROP"
${IPTABLES} -A INPUT -i eth0 -s 218.0.0.0/8 -j LOG --log-prefix "217-219 DROP"
${IPTABLES} -A INPUT -i eth0 -s 219.0.0.0/8 -j LOG --log-prefix "217-219 DROP"
${IPTABLES} -A INPUT -i eth0 -s 217.0.0.0/8 -j DROP
${IPTABLES} -A INPUT -i eth0 -s 218.0.0.0/8 -j DROP
${IPTABLES} -A INPUT -i eth0 -s 219.0.0.0/8 -j DROP

#223: 11011111    - /6 masks 220-223
${IPTABLES} -A INPUT -i eth0 -s 220.0.0.0/6 -j LOG --log-prefix "220-223 DROP"
${IPTABLES} -A INPUT -i eth0 -s 220.0.0.0/6 -j DROP

----------------------------------------------------------------------

**참고자료:
패킷필터링, 조대원
리눅스 2.4 패킷필터링 하우투, Rusty Russel
리눅스 2.4 NAT 하우투, Rusty Russel

2006/09/08 22:20 2006/09/08 22:20
이 글에는 트랙백을 보낼 수 없습니다
출처 블로그 > 세상이 끝나는날 까지 도전하자
원본 http://blog.naver.com/ksemmen/140012802343

로컬 호스트 시스템을 백업하는 방법으로는 tar 아카이브를 이용하여 묶거나 압축하는 방법이 있고, cpio, dump, dd 유틸리티를 이용하여 하드 디스크를 백업하는 방법이 있다.

이번호에서는 이러한 유틸리티를 사용하지 않고, 미러링(Mirroring) 기능을 이용하여 로컬시스템 또는 원격서버의 데이터를 그대로 복사하여 백업하는 방법에 대해서 알아봅니다......


# 1. 미러링(Mirroring)


     레드햇 리눅스 사이트의 다운로드 페이지에 보면 FTP 미러 사이트들이 많이 링크되어 있

     음을 발견할 수 있다. 미러 사이트는 주 사이트의 데이터를 그대로 옮겨와 주 사이트와 똑

     같은 서비스를 제공하는 것이다.  원격 서버의 데이터를 원본 그대로 복사해 와서 원격 서

     버와 똑같은 데이터 상태를 유지시키는 것을 미러링(Mirroring) 이라 하는데 다른 표현으로

     는 서버 동기화(server  syncronization)라고도 한다.

     미러링에 의해서 원격 서버의 데이터가 변하면 미러링 서버도 그에 따라서 변하게 되며

     항상 미러링 서버는 원격 서버의 동일한 데이터 상태를 유지하게 된다. 미러링은 로컬 시스

     템의 데이터를 백업할 때도 적용할 수 있으며 서버마다 동일한 데이터 구조를 유지하고자

     할 때 이 방법이 사용된다.


# 2. 미러링 도구(rsync)


     여러대의 서버를 분산하여 서버를 동기화하는데 rsync 유틸리티가 많이 사용된다.

     rsync는 루트의 권한없이 서버로부터 데이터로 빠르게 전송받을 수 있으며, 원격 서버와

     미러 서버와 전송 데이터를 비교하여 변화된 데이터를 저장할 수 있다.

     또한 SSH를 이용하면 rsync 서버가 구축되어 있지 않아도 미러링을 할 수 있는 이점이 있 

     다.     


# 3. rsync 설치


     레드햇 리눅스 9에서는 최신 버전의 rsync RPM 패키지를 지원하므로 간단히 RPM 패키지

     를 설치하여 사용한다. 그러면 우선, rsync 패키지가 설치되어 있는지를 확인해 본다...

     [root@localhost  root]#  rpm  -qa  |  grep  rsync

     rsync-2.5.5-4

     [root@localhost  root]#  _ ----->대기중인 커서를 의미함.

    

     상기 화면과는 달리 아무런 rsync 버전 정보가 표시되지 않는다면 rsync가 시스템에 설치 

     되어 있지 않는 것이므로, rsync-2.5.5-4.i386.rpm 패키지를 구해 다음과 같이 설치한다.

     설치전에 반드시 미리 구한 패키지가 있는 디렉토리로 들어간후 설치하는것을 잊지 말자.

     [root@localhost  RPMS]#  rpm  -ivh  rsync-2.5.5-4.i386.rpm

      준비  중...                           ############################ [100%]

           1 : rsync                        ############################ [100%]

     [root@localhost  RPMS]#  _

     @ [참고사항] - rsync RPM 패키지 설치시 의존성 오류가 나올때

                           rsync RPM 패키지는 redhat-lsb 패키지와 의존성을 가지므로, 설치시

                           의존성 오류가 나올 때는 redhat-lsb-1.3-1.i386.rpm을 먼저 설치한 후

                           에  rsync 패키지를 설치한다.


# 4. SSH를 이용한 원격 서버 데이터 미러링


      rsync 서버를 구축하지 않은 상태에서 rsync로 SSH를 이용하여 데이터를 백업하는 방법

      은 다음과 같다. rsync 사용법에 관한 자세한 것은 잠시 후에 살펴보기로 하자...


      rsync  -avzr  --delete  -e  ssh  원격서버:데이터경로  백업경로

      그러면  192.168.1.13 클라이언트에서 192.168.1.1 원격 서버의 FTP 데이터를 SSH를 이용

      하여 미러링하는 방법은 다음과 같다...

      [root@localhost  root]#  rsync  -avz  --delete  -e  ssh  192.168.1.1:/ftp/pub/redhat9/

       /mirror/redhat9

      root's  password:

      receiving  file  list  ...  done

      ./

      shrike-i386-disc1.iso

      shrike-i386-disc2.iso

      shrike-i386-disc3.iso

      wrote  64 bytes  read  1855717755 bytes  2449792.50 bytes/sec

      total  size  is  1855094784  speedup  is  1.00

      [root@localhost  root]#  _


      원격 서버의 주소와 미러링하고자 하는 데이터의 경로를 지정한 후에 -e  ssh 옵션을

      사용하여 원격 서버에 접속을 하게 되면 패스워드를 묻게 되는데, 원격 서버의 루트 패스

      워드를 입력한다. 만일 일반 사용자 계정으로 이 명령을 수행한다면 원격 서버에도 동일한

      계정이 존재하여야 하며, 원격 서버의 계정 패스워드를 입력한다.

      SSH로 원격 서버에 접속이 이뤄지면 rsync에 의해서 원격 서버의 데이터를 미러링 서버

      의 지정된 경로로 다운로드됨을 볼 수 있다.

      @ [ 참고사항 ] - SSH를 이용한 rsync 데이터 동기화를 위한 원격 서버의 환경

                              클라이언트에서 rsync로 SSH를 이용하여 원격 서버에 접속하기 전에

                              원격 서버는 반드시 SSH 서버가 작동하고 있어야 접속이 가능하다.

                              즉,  /etc/init.d/sshd  restart를 실행하여 클라이언트가 SSH 서버에 접

                              속할 수 있도록 미리 준비해 놓고 있어야 한다는 예기다....


# 5. rsync  서버 설정(/etc/rsyncd.conf)

     앞서 SSH를 이용하여 미러링을 하는 방법에 대해 알아보았다. SSH 서버가 구축되지 않은

     원격 서버에서는 클라이언트가 미러링할 수 있도록 rsync 서버를 구축해야 한다. rsync 서

     버의 설정 파일은 /etc/rsyncd.conf 파일인데, 이 파일은 자동으로 생성되지 않으므로 사

     용자가 직접 만들어 사용해야 한다.  이 파일의 설정 형식은 다음과 같다.


         [rsync 서비스명]

                       comment  =  rsync서버에 대한 설명

                       path  =  미러링될 데이터의 경로

                       uid  =  사용자 ID

                       gid  =  그룹 ID

                       use  chroot  =  yes  /  no

                       read  only  =  yes  /no

                       host  allow  =  아이피주소

                       max  connections  =  최대접속횟수

                       timeout  =  초단위의 시간


  ① [rsync 서비스명] : rsync 서비스의 이름(모듈명)이다. 사용자가 원하는 형태로 서비스명

                                 을 지정할 수 있다. 예) rh90

  ② comment : rsync 서비스에 대한 설명이다. 예) Red Hat Linux 9.0 Mirror

  ③ path : 미러링 서비스 될 데이터의 경로를 지정한다. 예) /data/linux90

  ④ uid, gid : 각각 파일 전송하는 사용자와 그룹의 아이디로, 익명 접속이 가능하도록 기본값

                   은 nobody로 설정되어 있으므로 이 값을 그대로 사용한다.

  ⑤ use chroot : path로 지정된 경로를  root 상위 디렉토리로 사용한다. 사용자가 다른 상위

                        디렉토리로 접근하지 못하도록 하기 위해서 보안상 필요로 하므로 yes로 설

                        정한다.

  ⑥ read only : 클라이언트가 서버에서 데이터만 다운로드 하는 경우에는 이 옵션을 yes로 설

                      정하여 읽기 전용 권한을 부여해야 한다. 만일 업로드가 가능하도록 하려면

                      no로 설정하지만 특별한 경우가 아니라면 yes로 설정한다.

  ⑦ host allow : 접속 호스트를 제한하지 않으면 누구나 데이터를 가져갈 수 있기 때문에 익

                        명의 FTP 미러 서버가 아니라면 보안상 rsync 서버에 접속 가능한 호스트의

                       아이피를 지정하는 것이 안전하다.

  ⑧ max connections : 동시에 접속 가능한 접속횟수를 설정한다. 무제한은 0으로 설정한다.

  ⑨ timeout : 클라이언트의 접속이 idle 상태에 있을 때 접속을 끊어버릴 시간을 설정한다.

                   기본값은 60초이다.


  다음은 지금까지 살펴본 설정을 가지고 작성한 /etc/rsyncd.conf 예제 설정 파일이다.

  [root@localhost  /]# cat  >  /etc/rsyncd.conf

  [rh9iso]

  comment = Red Hat Linux 9 ISO Mirror

  path = /data/ftp/pub/redhat9

  uid = nobody

  gid = nobody

  use chroot = yes

  read only = yes

  host allow = 192.168.1.13

  max connections = 5

  timeout = 60


  [root@localhost  /]#  _


# 6.  /etc/xinetd.d/rsync 설정


     rsync 서비스는 슈퍼데몬 xinetd에 의해서 작동하기 때문에 /etc/xinetd.d/rsync 파일을

     설정해 주어야 한다. RPM 패키지 설치시 이 파일이 제공되므로 이 파일 가운데에서 다음

     화면과 같이 disable = yes를 disable = no로 변경한다.


     -------------------------------------------------------------------------------

      root@localhost:/

     -------------------------------------------------------------------------------

     service rsync

     {

                disable              =  no

                socket_type        =  stream

                wait                  =   no

                user                  =  root

                server               =  /usr/bin/rsync

                log_on_failure     +=  USER ID

      }

      _ ----->대기중인 커서를 의미함.

      ~


      [영어][완성][두벌식]                                                11,0-1                     모두

      --------------------------------------------------------------------------------

      그런 다음 xinetd 슈퍼 데몬을 다시 실행하여 rsync서비스가 작동될 수 있도록 한다.

      [root@localhost   /]#  /etc/init.d/xinetd  restart

      xinetd  를 정지함 :                                                                              [   확인   ]

      xinetd  (을)를 시작합니다 :                                                                   [   확인   ]

      [root@localhost  /]#  _


      rsync 서비스는 873 서비스 포트를 이용하므로, 텔넷으로 이 포트로 접속하여 rsyncd 정

      보가 나오는지를 확인한다. 만일 접속이 이뤄지지 않는다면 방화벽을 점검하거나

      /etc/rsyncd.conf 파일의 설정이 정확한지를 체크한다.


      [root@localhost  /]#  telnet  localhost  873

      Trying  127.0.0.1...

      Connected to  localhost.localdomain  (127.0.0.1)

      Escape  character  is  '^]' .

      @RSYNCD:  26

      _ ----->대기중인 커서를 의미함.


# 7. rsync 사용법


     SSH를 이용하여 rsync 미러링하는 방법에서 간단히 명령의 쓰임에 대해서 이미 살펴봤다.

     그러면 rsync의 사용법에 대해서 자세히 알아보자.........


     rsync  [옵션]  rsync서버주소::서비스명 미러경로

     rsync에서 자주 사용되는  옵션은 -avzr이다. -a 옵션은 아카이브 모드이며, -v 옵션은

     처리과정을 화면상에 출력되도록 하는 것이고, -z는 전송시 압축모드이며, -r 옵션은 하위

     디렉토리를 의미하는 옵션이다. 그외 자세한 옵션은 man 페이지를 참고하자.

     그러면 rsync로 미러링하는 방법을 연습해 보기로 하자....^_^*


7-1. rsync 서비스 모듈(서비스명과 설명) 알아보기


       앞서 작성한 /etc/rsyncd.conf 예제 파일을 통하여 원격 rsync 서버에서 어떤 서비스를

       현재 제공하는지를 알아보고자 할 때는 다음과 같은 명령을 실행한다.


      rsync  서버주소::

      

      [root@localhost  root]#  rsync  192.168.1.1::

      rh9iso               Red Hat Linux 9 ISO Mirror

      [root@localhost  root]#  _    

      이 때 출력되는 것은 /etc/rsyncd.conf 파일에서 서비스명(모듈명)과 comment로 설정

      된 메시지이다. 


  7-2. 로컬 시스템 데이터 백업


        rsync를 이용하여 로컬 시스템의 데이터를 백업하려면 다음과 같은 명령을 사용한다. 


        rsync  -avzr  --delete  백업소스경로  백업될경로

        --delete 옵션은 rsync서버의 백업할 데이터와 클라이언트의 데이터와 비교하여 변경

        된 데이터를 추가하거나 삭제하고자 할 때 사용하는 데이터 비교 옵션이다.

        그러면 /rh9hwp 디렉토리에 있는 파일을 /mirror/rh9hwp_backup 디렉토리로 백업해

        보자.........

        [root@localhost  root]# rsync  -avzr  /rh9hwp/  /mirror/rh9hwp_backup

        building  file  list  ...  done

        created  directory  /mirror/rh9hwp_backup

        ./

        맨드레이크  9.1.hwp

        명령어사전  .hwp

        제1부설치편  (60-151p).hwp

        제2부 (152-731p).hwp

        제3부 (732-1115p).hwp

        wrote  36854994 bytes  read 100 bytes  1890004.82 bytes/sec

        total  size  is  42531514  speedup  is 1.15

        [root@localhost  root]#  ls  /mirror/rh9hwp_backup

        맨드레이크  9.1.hwp  제1부설치편 (60-151p).hwp     제3부 (732-1115p).hwp

        명령어사전  .hwp      제2부 (152-731p).hwp

        [root@localhost  root]#  _


         /mirror/rh9hwp_backup 디렉토리로 데이터가 백업되고 있음을 확인할 수 있다.


  7-3. 원격 서버의 데이터 백업


        rsync  -avz  서버주소::모듈명(서비스명)  백업될경로


        이번에는 원격 서버의 레드햇리눅스9 배포판 이미지 파일을 미러링을 해보자.... 먼저

        rsync 서버주소::를 실행하여 모듈명을 확인하여 원격 서버에 접속해 미러링되게 하면

        된다.


        [root@localhost  root]#  rsync  192.168.1.1::

        rh9iso               Red Hat Linux 9 ISO Mirror

        [root@localhost  root]#  rsync  -avz  192.168.1.1::rh9iso  /mirror/redhat9

        receiving  file  list  ...   done

        ./

        shrike-i386-disc1.iso

        shrike-i386-disc2.iso

        shrike-i386-disc3.iso

        wrote 118 byets  read 1855717775 bytes  4995202.94 bytes/sec

        total  size  is  1855094784  speedup  is  1.00

        [root@localhost  root]#  _

2006/09/08 22:19 2006/09/08 22:19
이 글에는 트랙백을 보낼 수 없습니다
출처 카페 > Sharon Stone / nasonark
원본 http://cafe.naver.com/sharonstone/23

JavaScript의 문법에는 연산자, 제어문, 전역함수가 있다.


연산자는 JavaScript의 가장 기초가 되는 구문으로 C 언어와 같은 동작을 한다. 

제어문은 연산자와 함께 JavaScript의 가장 기초가 되는 구문으로, C언어와 거의 유사하다.

전역함수는 브라우저에 내장되어 있는 함수로 별도의 객체를 지정하지 않고도 사용할 수 있
는 함수이다.

이들은 JavaScript를 사용하기 위해 최소한 알아두어야 할 문법으로 웹페이지에 JavaScript
를 사용한다면 반드시 익혀둘 필요가 있다.


연산자

  연산자는 JavaScript의 가장 기초가 되는 구문으로 C 언어와 같은 동작을 한다. C언어를
안다면 이 페이지는 건너 뛰어도 상관없지만 C언어를 모른다고 이 페이지가 어려운 것은
아니다. 간단한 산수에 불과할 뿐이다. JavaScript를 사용할 때 가장 기초가 되는 것들이다.


◈ 지정(Assignment) 연산자 

변수에 값을 지정하는 연산자이다. 

x = y

변수 x에게 값 y를 지정한다. 왼쪽에 있는 것이 변수이고 오른쪽에 있는 것이 지정할 값으
로 수학의 같다(equal)라는 개념이 아니고 값을 지정하는 것이다. 항상 변수는 왼쪽에 있고
지정할 값은 오른쪽에 위치한다. 

x = 5

로 지정하면 변수 x에게 정수 5를 저장해서 alert(x) 로 하면 5가 나온다. 

var x = 5
x = x + 5
alert(x)

로 하면 x는 10이 된다. 처음 5에서 5를 더해주고 x 에 더한 값을 지정해서 10으로 된다. 


◈ 산술(Arithmetic) 연산자

-는 빼기, +는 더하기, *는 곱하기, /는 나누기, ++ 는 증가 연산자, -- 는 감소연산자, 
-변수는 부정연산자 이다. 

var x = 4 / 2

로 하면 x는 2가 된다.  4나누기 2를 수행한 값이다. 

x = 5 % 2

위의 값은 1이 된다. %는 앞 값을 뒤의 값으로 나누었을 때의 나머지 값을 반환한다. 

var x = 5
x++

x는 6이다. x++ 는 x = x + 1 과 같은 작동을 한다. 즉, 1을 더해주고 1이 증가한 값을 지
정해 준다. 짧게 쓸 수 있어서 많이 사용한다. ++x도 비슷하지만 차이점이 있다. 

var x = 5; var y = 5
var w = 0; var z = 0
w = x++
z = ++y

로 하면 변수 w는 5가 되고 z는 6으로 된다. 뒤에 있는 ++은 지정식을 수행한 후에 증가연
산을 하고 앞에 있는 ++은 증가연산을 먼저 하고 지정식을 수행해서 w, z가 1이 차이가 나
게 된다. 

var x = 5
x--

x는 4가 된다. x = x - 1 과 같고 나머지 사항도 위의 ++과 같다. 

var x = 5
x = -x

x는 -5 이다. 변수에 "-" 빼기 기호를 붙이면 값의 부호를 바꾸는 부정 연산자로 양수는 음
수로 음수는 양수로 바꾼다. 

x + = y, x = x + y
x - = y, x = x - y
x * = y, x = x * y
x / = y, x = x / y
x % = y, x = x % y
x << = y, x = x << y
x >> = y, x = x >> y
x >>> = y, x = x >>> y
x & = y, x = x & y
x * = y, x = x * Y
x | = y, x = x | y

위의 지정식에서 왼쪽의 지정은 오른쪽의 지정과 같은 식으로 작동한다. 각 부호의 사용법
은 -는 빼기, +는 더하기, *는 곱하기, /는 나누기, %는 나누고 남은 나머지, <<, >>, >>>
는 비트연산, &, ^, |는 조건 비트연산이다.

◈ 비교(Comparison) 연산자 

두개의 값에서 크기를 비교하여 참, 거짓을 반환해 주는 것으로 보통 if, for, while 같은 조
건문에서 사용한다.

연산자 의미
== 같다
|= 같지 않다
> 크다
>= 크거나 같다
< 작다
<= 작거나 같다

if( 3 < 5 ) alert("참입니다")

로 3이 5보다 작으므로 "참입니다" 가 나온다. 

var x = 12
var y = 20
if( x >= y ) alert("참입니다")

로 하면 12가 20보다 같거나 크지 않으므로 거짓을 반환한다. 그래서 if문은 수행되지 않아
서 "참입니다"는 나오지 않는다. if () 조건문은 비교식이 참이면 자신의 문장을 실행하고 거
짓이면 실행하지 않는다. 자세한 설명은 아래의 조건문 페이지에서 설명하겠다. 


◈ 논리(Logical) 연산자

두개의 비교식을 검사하여 참, 거짓을 말해준다. 

연산자 의미
&& 두개의 비교식이 둘 다 참이면 참(true)을, 하나나 둘 다 거짓이면 거짓(false)을 반환한
다.
||= 두개의 비교식 중에서 하나 이상이 참이면 참을, 둘 다 거짓이면 거짓을 반환한다.
! 한 개의 변수가 참이면 거짓, 거짓이면 참을 반환한다.

if( 3 < 5 && 10 < 20 ) alert("참입니다")
if( 100 < 50 || 200 > 150 ) alert("참입니다")

위는 둘 다 "참입니다" 가 나온다. 

var x = 0
if( !x ) alert("참입니다")

로 하면 "참입니다" 가 나온다. 정수 0은 if문에서 거짓인데 반대로 하는 연산자 ! 를 지정
하여서 참으로 된다. 

◈ 특수 연산자 

new 는 브라우저 내장 객체인 Array, Boolean, Date, Function, Math, Number, String 객체
를 변수에 지정할 수 있게 한다. xx = new Function(인자)로 xx를 Function 객체의 생성자
로 만든다.

typeof 는 값이 어떤 종류인지 확인한다. 종류는 string, boolean, number, object, func,
undefined 이다. 비교한 값이 맞으면 true 값을 반환한다. 

var XX = "123A" 
if ( typeof XX == "string" ) 
  alert("XX는 string입니다.") 
else 
  alert("XX는 string이 아닙니다.") 

다른 값도 마찬가지로 확인할 수 있다 

void 는 링크의 'href'에서 JavaScript 구문을 지정하는 것으로 void()로 사용한
다. 괄호 안에 값을 넣어주면 그 값을 실행하는데 0이나 null은 아무런 실행을 하지 않는다.
주로 사용하는 곳은 링크에게 javaScript 구문을 지정시 문서를 이동하지 않게 하는데 사용
한다. 

< a href="void(0)">링크 < / a >
-->주의 : < a ..... < / a > 공간이 있는데 없이 붙여 써야함. 아래는 붙여쓸경우
예)<a href="void(0)">링크</a>

() ? : 는 괄호 속에 있는 값이 참이면 물음표 다음의 구문을, 거짓이면 colon(:) 다음의 구
문을 지정한다. 조건문 if else 문과 비슷한 작동을 하는 것이다. 

var xx = (true) ? 100 : 200

으로 하면 xx는 100으로 지정되고 (false)라면 xx는 200으로 지정된다. 

this 는 객체 자신을 말한다. 브라우저에 있는 내장 객체나 new 연산자로 만든 객체일 수
있는데 자기 자신을 가리킨다. 

function xx() {
   this.zz = "Hellow"
}
myThis = new xx()

로 하면 "myThis"는 함수 객체 xx의 생성자가 되어서 alert(myThis.zz)로 하면 "Hellow"가
나온다. 


◈ Bitwise 연산자

&, |, ^, >>, <<, >>>, >>> 는 0과 1로 이루어져 있는 bit 단위로 사용되는 연산자로 컴퓨
터에서 사용하는 모든 값은 0과 1로 구성되어 있는 이진수로 이루어져 있는데 이 0과 1을
조작하는 연산자이다. 

10 & 7

&는 Bitwise AND연산자이다. 1이나 0중에서 서로 같은 값을 가지고 있는 값을 지정하는데
위의 식은 1010 & 111 으로 컴퓨터 안에서 작동해서 이진수 10으로 되고 십진수로는 2이
다. 그래서 alert(10&7)은 2로 나온다. 

10 | 7

|는 Bitwise OR 연산자이다. 바(|)를 두개의 값 사이에 지정하여 사용한다. 1이나 0중에서
하나라도 1이면 1을 둘 다 0이면 0을 지정한다. 10 | 7은 1010 | 111 으로 작동하고 1111로
되어 십진수15가 된다. 

10 ^ 7

^는 Bitwise XOR 연산자이다. 1이나 0이 서로 다른 값을 가지는 값을 1로 같은 값을 가지
면 0으로 지정한다. 10 ^ 7은 1010 ^ 111 로 계산되고 1101로 되어 13이 된다. 

>>, <<, >>> 는 Bitwise Shift 연산자이다. >>는 오른쪽으로 비트를 이동시키고 <<는 왼
쪽으로 이동시킨다. 이동시킨 곳의 빈곳은 0으로 채운다. 음수를 이동시켜도 부호값은 보존
한다. 

10 << 2

<<는 왼쪽의 값을 오른쪽의 값만큼 왼쪽으로 bit 이동시킨다. 위의 지정은 1010에서 101000
으로 되어서 십진수 40으로 나온다. 10 >> 2 는 이진수 10이 되어 2로 나온다. 

>>> 는 음수 값을 오른쪽 bit 이동 시킬 때, 부호값을 보존하지 않는 연산자로 양수에서는
>>, >>>가 같은 동작을 한다. 


◈ 연산자 우선 순위

여러 연산자를 두개 이상 사용할 때에는 연산자 사이에 먼저 실행되는 우선순위가 있다. 아
래의 여러 연산자에서 가장 높은 우선순위는 함수와 배열이고 아래로 내려갈수록 순위가 낮
아진다. 

함수 배열
! ~ - ++ -- typeof void 
* / % 
+ - 
<< >> >>> 
< <= > >= 
== !=
&
^
|
&&
||
?: 
= += -= *= /= %= <<= >>= >>>= &= ^= |=  (이 줄은 오른쪽으로 우선순위가 높다)

이들 연산자를 여러 개 사용하여 우선순위를 구분하기가 복잡할 때, 가장 쉬운 방법은 가장
먼저 실행할 연산자를 괄호로 감싸주면 가장 높은 우선순위가 된다. 

var x = 5 * (4 + 2)

x는 30이다. 곱셈(*)이 덧셈(+)보다 우선순위가 높지만 괄호로 지정해 주어서 곱셈보다 먼저
실행하기 때문이다. 

2006/09/08 22:18 2006/09/08 22:18
이 글에는 트랙백을 보낼 수 없습니다
대수학  2006/09/08 22:17
어떤 진수 이건...일단 문제가 나오면 10진수로 바꿔 보세요...
그리고 원하는 진수로 나누는 겁니다...
일단 모두 10진수로 바꿉니다. 바꾸는 방법은..
만약 수가 n진수라고 치면..
맨 오른쪽 자리가 n의 0승, 즉 1입니다.(십진법에서도 일의자리라고 하는..)
그 왼쪽이 n의 1승, 즉 10진법에서 말하는 10입니다. 5진법이라면 5의자리죠.
그 왼쪽이 n의 2승, .. 이런식이죠.
* a^b는 a의 b승을 말합니다.


★★★★★★★1101(2)를 10진수로 고치면
                                   ▲
                                     ||===2진수

1X2^3 + 1X2^2 + 0X2^1 + 1X2^0 (여기서 '2'가 들어가는 자리에 원래 숫자의 진수를 넣으면 됩니다.)
= 8+4+0+1 = 13 입니다.

★★★★★★★68(10)을 8진수로 고치려면 8로 계속 나누고 나머지를 기록하는 겁니다.
8 |68
 ----
8 | 8 ... 4  위에 있는 68을 왼쪽의 8로 나눴을 때 몫이 8, 나머지 4
 ----
  1 ... 0  위에 있는 8을 역시 8로 나눴을 때 몫이 1, 나머지 0
이제 1부터 위로 읽으면 됩니다. 8진수로 '104'가 되죠.
이런 식으로 수들을 10진수로 고친 다음 원하는 수로 변환시킬 수 있습니다.

%%%%%%%%%%%%★★★★★★★TIP★★★★★★★%%%%%%%%%%%

★★★★★★★1101₂를 10진수로 변환
2진법이므로
일의 자리 = 1, 십의자리 = 2, 백의 자리 = 4, 천의 자리 = 8이신건 아시죠??
2진법이라서 자리가 한칸 올라갈수록 2배씩 커지는 겁니다.
만약 삼진법이라면 십의자리 = 3이 되겠지요, 백의자리는 9가 될테고
주어진 수가 1101이므로
십의자리를 제외한 나머지숫자가 다 1이네요
식으로 정리하면
1*1 + 2*0 + 4*1 + 8*1 입니다
따라서 답은 13이 되네요

★★★★★★★(68)10을 8진수로 변환

10진법이므로, 우리가 그냥 알고있는 68로 생각합시다
진법을 바꾸는 문제의 유형은
n진법 -> 10진법 or
10진법 -> n진법 이 대부분입니다
여기서, 10진법 -> n진법으로 바꿀때에는
주어진 수를 n으로 일단 나눠보시면 됩니다
68을 예로들면, n진법에서의 n이 8이니까(8진법으로 바꾸라 했으므로)
8 | 68
8 | 8 ......4
8 | 1.......0
0.......1
이렇게, 나머지는 버리고, 몫만을 꼐속 나눠줍니다
그러면 오른쪽에 나머지를 보세요.. 4,0,1이죠??
이걸 거꾸로 읽습니다..
답은 104(8) 입니다
2006/09/08 22:17 2006/09/08 22:17
이 글에는 트랙백을 보낼 수 없습니다
출처 블로그 > 장미왕국
원본 http://blog.naver.com/rosekingdom/60005112976
<script>
function check_form(theform) {
       if (!theform.title.value) {
               errorMsg("글의 제목을 입력하세요",theform.name,theform.title.name,'no','no','alert');
               return false;
       }
}

function errorMsg(error_str,obj1,obj2,del,sel,ertype) {
       var winX = parseInt(document.body.clientWidth,10);
       var winY = parseInt(document.body.clientHeight,10);
       var scTop = parseInt(document.body.scrollTop,10);
       var elayer = eval(document.all.errorMessage);
       var Inhtml;
       Inhtml = "<table width=\"250\" height=\"100\" border=\"0\" cellspacing=\"0\" cellpadding=\"3\" style=\"border: 1px solid Gray;\">";
       Inhtml += "<tr>";
       Inhtml += "        <td width=\"250\" height=\"100\" bgcolor=\"#FFFFFF\">";
       Inhtml += "        <table width=\"100%\" height=\"100%\" cellspacing=\"0\" cellpadding=\"0\" border=\"0\" bgcolor=\"#DCDCDC\" style=\"border: 1px solid Gray;\">";
       Inhtml += "        <tr>";
       Inhtml += "                <td align=\"center\">";
       Inhtml += "                <table width=\"100%\" height=\"100%\" cellspacing=\"0\" cellpadding=\"0\" border=\"0\">";
       Inhtml += "                <tr>";
       Inhtml += "                    <td width=\"12\" height=\"32\"> </td>";
       Inhtml += "                    <td width=\"32\" height=\"32\">";
       Inhtml += "                        <img src=\"/img/warning.gif\" border=\"0\" align=\"absmiddle\">";
       Inhtml += "                        </td>";
       Inhtml += "                    <td width=\"14\" height=\"32\"> </td>";
       Inhtml += "                    <td  style=\"color:#696969;font-size: 9pt; line-height: 150%; padding : 4px 4px 4px 4px;\">";
       Inhtml +=                         error_str;
       Inhtml += "                        </td>";
       Inhtml += "                </tr>";
       Inhtml += "                </table>";
       Inhtml += "                </td>";
       Inhtml += "        </tr>";
       Inhtml += "        <tr>";
       Inhtml += "                <td height=\"35\" align=\"center\">";
       if (ertype=="alert") {
               Inhtml += "                        <img src=\"/img/icon_ok.gif\" onclick=\"document.all.errorMessage.style.display='none';errorFocus('"+obj1+"','"+obj2+"','"+del+"','"+sel+"');\" style=\"cursor:hand\">";
       }
       else if (ertype=="confirm") {
               Inhtml += "                        <img src=\"/img/icon_ok.gif\" onclick=\"document.all.errorMessage.style.display='none';document."+obj1+".submit();\" style=\"cursor:hand\">";
               Inhtml += "                        <img src=\"/img/icon_cancel.gif\" onclick=\"document.all.errorMessage.style.display='none';errorFocus('"+obj1+"','"+obj2+"','"+del+"','"+sel+"');\" style=\"cursor:hand\">";
       }
       Inhtml += "                        </td>";
       Inhtml += "                </tr>";
       Inhtml += "        </table>";
       Inhtml += "        </td>";
       Inhtml += "</tr>";
       Inhtml += "</table>";
       elayer.innerHTML = Inhtml;
       elayer.style.posLeft = (winX-250)/2;
       elayer.style.posTop = scTop + ((winY-100)/2);
       elayer.style.display = "block";
}

function errorFocus(obj1,obj2,del,sel){
       var temp = eval("document."+obj1+"."+obj2);
       if (del=="yes") {
               temp.value="";
       }
       if (sel=="yes") {
               temp.select();
       }
       temp.focus();
}
function IsNumber(str) {
       if (str.search(/[^0-9]/g)==-1) return true;
       else return false;
}
<script>

----------------------------------------------------
<div id="errorMessage" style="display:none;position:absolute;"></div> <--에러메세지 띄우는 레이어
<form method=post action="ok.php" name=boardin enctype='multipart/form-data' onsubmit="return check_form(document.boardin)">
<input type="text" name="title" size="40">
<input type="submit" value="입력">
</form>
2006/09/08 22:16 2006/09/08 22:16
이 글에는 트랙백을 보낼 수 없습니다
출처 블로그 > What you see is what you get
원본 http://blog.naver.com/etwas0227/60019740139
[css] background-image 를 이용한 배경 설정





▶ <head>...</head>에서 background-image 를 이용한 배경 설정

<head>

<style>
body { background-image:url(http://blogfiles15.naver.net/data11/2005/11/22/78/sweet_spy.jpg);
background-attachment: fixed;}
table { background-color: transparent; }
td { background-color: transparent; }
</style>

</head>







▶ Table 에서 background-image 를 이용한 배경 설정

<TABLE cellSpacing=0 cellPadding=0 width="100%">
<TR>
<TD style="FONT-SIZE: 9pt; FONT-FAMILY: '돋움; 굴림'; TEXT-ALIGN: justify; background-image: url(http://blogfiles15.naver.net/data11/2005/11/22/78/sweet_spy.jpg);">
<pre>블로그에 배경화면 넣기입니다.
background-image: url 에 자신이 원하는
배경화면을 넣어보세요
^^)/
</pre></TD></TR></TABLE>



<예시>

<html>
<body bgcolor="white" text="black" link="blue" vlink="purple" alink="red">
<TABLE cellSpacing=0 cellPadding=0 width="100%">
<TR>
<TD style="FONT-SIZE: 9pt; FONT-FAMILY: '돋움; 굴림'; TEXT-ALIGN: justify; background-image: url(http://blogfiles15.naver.net/data11/2005/11/22/78/sweet_spy.jpg);">
<pre><nobr>블로그에 배경화면 넣기입니다.
background-image: url 에 자신이 원하는
배경화면을 넣어보세요
^^)/ </nobr>
</pre>
</TD></TR></TABLE>
</body>
</html>




<결과>

블로그에 배경화면 넣기입니다. background-image: url 에 자신이 원하는 배경화면을 넣어보세요 ^^)/


2006/09/08 22:15 2006/09/08 22:15
이 글에는 트랙백을 보낼 수 없습니다
출처 블로그 > /JAVA/Servlet/JSP
원본 http://blog.naver.com/nova750/70003479208

JavaScript Reference
      
1.자바스크립트 기본문법
  [1] 기본형식
   1)
<script language="javascript">
스크립트내용
</script> 의 형식으로 스크립트를 기술한다
   2) 스크립트 블록은 주로 head태그나 body태그내에 기술한다
   3) 한문장이 끝날때마다 문장끝에 ;를 붙인다
   4) 변수는 대소문자를 구별하며 숫자로 시작해서는 안된다
변수 선언은 var 변수명=초기값; 형식으로 한다
예) var a=3;
   5) document.write구문 --> 문서내에 내용을 출력하는 구문
document.write구문내에서 문자는 ""로 감싸고 변수와 문자를 결합시는
기호를 사용한다
예)
var a=3;
var b=2;
var c=a*b;
document.write("a*b=" c);
=> 출력결과 a*b=3 즉 ""안에 쌓이 값은 문자로서그냥 출력된다
   6) 산술연산자
더하기, -빼기, *곱하기, /나누기, %정수나머지
   7) 관계연산자
> 크다, >=크거나 같다, < 작다, <=작거나 같다, == 같다, != 같지않다
   8) 논리 연산자
!(부정) ,&&(그리고:둘다 참일때만 참),||(또는:둘중하나만 참이어도참)
   9) 함수선언과 호출
함수선언은 function 함수명(인자들){ 함수내용;} 의 형식으로한다
함수호출은 이벤트 핸들러에 의해 이벤트핸들러="함수명(인자들)" 의
형식으로 한다
예)
function myFun(a,b){
var c=a b;
window.alert(c);
}


이런씩으로 코딩되었다면 body태그의 onload이벤트 핸들러(문서가 로드될때호출됨)에 의해 myFun() 함수가 호출되는데 그인자값으로 3과4
를 넘긴다 . a에는 3 b에는 4가 각각 입력된다
그리고 경고창으로 두개를 더한값(c) 7을 띄운다

      
  [2] 제어문
   1) for문 - 동일한 작업의 반복수행
     구조는
for(변수명=초기값;반복종료기준;증감값){
반복수행 내용;
}
의 형식으로 한다
예)
for(i=0;i<3;i ){
document.write("앗사
");
}
i 은 i=i 1 과 같은 의미임.
i--는 i=i-1 과 같은 의미임.
이구문은 i=0에서 시작해서 3보다 작은동안(즉i=0,1,2)총 3번 반복 i를 1식증가하여 앗사와 줄바꿈을 반복 출력한다
반복문에도 몇가지 더있지만 for만으로도 충분합니다...
      
   2) if else구문 - 조건에 따른 제어
     구조는
if(조건식){
조건식이 참일때 수행될문장;
}else{
조건식이 거짓일때 수행될 문장;
}

여기서 조건식이 거짓일때 수행할 문장이 없다면 else부분은 생략할수있다
예)
var a=3;
if(a>5){
alert("a는 5보다 큰값이다");
}else{
alert("a는 5보다 작은값이다");
}
여기서 a는 5보다 작으므로 조건식이 거짓이다 따라서 else이후의 문장이
수행되어 경고창으로 a는 5보다 작은값이다라는 메세지가뜨게 된다
if,else구문대용으로 삼항연산자 ? 기호 가있으나 처음부터 넘 많이 알려고하면 머리 아플것이므로 일부러 설명하지 않겠습니다...
꼭필요한 구문만 설명합니다

   3) switch case 구문 - 조건에 따른 제어
     구조는

switch(변수){
case(변수의 값1):
실행문1;
break;
case(변수의 값2):
실행문2;
break;
..... 계속 case더 있을수 있슴
default:
위조건중 하나도 일치하는것이 없을때 실행할 문장;
break;
}

예)
var a=5;
switch(a){
case(1):
alert("1이다");
break;
case(2):
alert("2다");
break;
case(3):
alert("3이다");
break;
default:
alert("a는 1,2,3은 아니다");
break;
} => 수행결과 a는 1,2,3은 아니다 라는 경고메세지가 뜨게 된다
      
  [3] 내장함수
   1) eval 
     문자열을 숫자로 변환하여 계산결과를 반환한다
     그외에도 루프를 사용해야 하는 부분에서 다양하게 쓰인다
      
   2) parseInt
     문자열로 표시된 정수값을 숫자로 변환한다
     예)
var a="3";
var b="4"; //a,b는 따옴표로 둘러싸여있으므로 현재 문자로 취급됨
var c1=a b; --> c1="34";가 입력된다
var c2=parseInt(a) parseInt(b); --> parseInt에 의해
a,b는 숫자로 변환되며 기호는 덧셈으로 인식되어 c2에는 7이 입력된다
      
   3) parseFloat
     문자열로 표시된 부동소수를 숫자로 변환한다
      
  [4] 문자열 관련 함수
   1) length - 문자열의 길이
     예)
var str="abcdeabc";
var sLen=str.length; sLen에는 8이 입력된다
   2) charAt - 특정위치의 문자
     예)
var str="abcdeabc";
var myChar=str.charAt(2); => myChar에는 "c"가 입력된다
인덱스가 0부터시작하므로 0,1,2 즉 세번째 문자 c가 입력된다
   3) indexOf - 특정문자가 첫번째로 나타나는 위치
     예)
var str="abcdeabc";
var myIdx=str.indexOf("b"); => myIdx 에는 b가 처음으로 나타나는위치 1 이 입력된다
   4) lastIndexOf - 특정문자가 마지막으로 나타나는 위치
     예)
var str="abcdeabc";
var myIdx=str.lastIndexOf("b"); => myIdx에는 b가 마지막으로 나타나는 위치 6이 입력된다
   5) charCodeAt - 특정위치의 문자의 문자코드
     예)
var str="abcdeabc";
var myChar=str.charCodeAt(2); => 세번째 위치의 문자 "c" 의 문자코드인 99가 입력된다
   6) split - 문자를 특정문자를 기준으로 분리한다
     예)
var str="abc-dea-bc";
var partStr=str.split("-");
partStr에는 abc,dea,bc 가 입력된다
partStr[0]에는 abc가 partStr[1]에는 dea가 partStr[2]에는 bc가 입력된다
      
  [5] alert,prompt,confirm
   1) alert - 단순한 경고창을 띄운다.
     alert("메세지 내용");
      
   2) prompt - 사용자로부터 데이타를 입력받는 창을 띄운다
     구조 var 변수명=prompt("메세지내용","기본입력값");
예)
var n=prompt("숫자를 입력하세요","3"); => 숫자를 입력하세요라는 메세지와 기본적으로 입력값 3이 입력된 prompt창이 뜨고 사용자가 여기
숫자를 넣고 확인을 누르면 n에 그값이 입력된다
      
   3) confirm - 사용자에게 다음작업처리의 방향을 물어본다
     주로 if등의 조건제어문과 같이 쓰인다.
확인을 누르면 true반환하고 취소를 누르면 false를 반환한다
구조
if(confirm("확인받을 메세지")){
확인을 눌렀을때 실행할문장;
}else{
취소를 눌렀을때 실행할문장;
}
예)
if(confirm("당신머리는 큽니까?")){
alert("좋으시겠습니다 --;;");
}else{
alert("다행입니다");

      
      


 
2.Event Handler
    
  [1] 이벤트란?
   쉽게 설명해서 어떤웹페이지에서 일어나는 사건.일등을 말합니다.
예를들어 마우스를 클릭한다든가 더블클릭한다든가 브라우저를 닫는다든가 특정객체에 포커스를 가져간다든가 하는 모든것을 이벤트라 할수있습니다.
      
  [2] 이벤트 핸들러란?
   어떤 이벤트가 일어났을때 어떤처리를 해줄것인지를 정의하는 데 사용합니다
      
  [3] 이벤트 핸들러의 종류와 의미
   모든 이벤트 핸들러를 설명하지는 않습니다. 모든걸 한번에 다할려면 골깨집니다.
웹페이지를 만드는데 기본적으로 알아야 할것들만 설명하겠습니다.
      
   onLoad 문서가 로드될때
   onUnLoad 문서를 닫을때 다른 페이지로 이동하려 할때
   onFocus 문서에서 특정객체가 활성화 되었을때,특정입력박스에 포커스가 이동되었을때
   onBlur 문서에서특정객체가 비활성화 되었을때,
특정입력박스에서 포커스가 다른곳으로 떠날때
   onClick 버튼이나 이미지를 클릭했을때
   onDblClick 버튼이나 이미지를 더블클릭 했을때
   onChange 셀렉트박스나 파일 입력상자의 내용이 변경되었을때
   onMouseOver 특정객체위에 마우스를 올렸을때
   onMouseDown 마우스를 눌렀을때
   onMouseOut 특정객체위에 있던마우스가 영역밖으로 나갈때
   onMouseUp 마우스를 눌렀다가 놓았을때
   onKeyDown 키보드를 눌렀을때
   onKeyUp 키보드를 눌렀다 놓을때
   onReset 폼내용이 리셋버튼으로 초기화 될때
   onSubmit 폼내용이 전송되려고 할때
      
      

3.Object
  
  -객체(object)란?
   자바스크립트에서 객체란 브라우저창,이미지,입력양식등...웹문서속의 각각의 모든
항목들을 말한다고 보면 되겠습니다
  -속성이란?
   각 객체가 지닌 특성을 말합니다.
사용법 : 객체명.속성="속성값";
예) window.status="반가워여"; --> 브라우저 상태바에 반가워여라는 글자를 보입니다.
  -메서드란?
   각 객체에게 어떤 동작을하도록하는 명령어라고보면 됩니다.
예를들어 window객체의 close라는 메서드는 브라우저창에게 창을닫도록 명령합니다.
사용법 : 객체명.메서드(인자값);
예) window.alert("경고한다.밥무라"); --> 경고한다.밥무라라는 메세지로경고창을띄웁니다
    
  * 자바스크립트와 DHTML
   객체의 메서드나 속성중에서 근래에는 잘쓰여지지 않는 것들도 있습니다, style을
이용한 다이나믹html이 대체되어 쓰이는경우가 많이 있습니다.
예로 문서의 배경색깔을 동적으로 변경시키고자 할때 예전에는
document.bgColor="#ff00ff";이렇게 썼으나
요즘은 document.body.style.background="#ff00ff";로 쓰는경우도 많이 볼수있습니다.
    
    
  [1] window 객체
   속성 closed 브라우저 창이 닫혔는지를 체크
     opener 현재창이 새창일경우 현재창을열개한 브라우저창
     status 브라우저의 상태표시줄의 정보
     screenLeft 윈도우화면 좌측상단모서리에서 브라우저 상단까지의
x축 거리
     screenTop 윈도우화면 좌측상단모서리에서 브라우저 상단까지의
y축 거리
        
   메서드 alert 경고창을 띄운다
     blur 현재창을 최소화한다.포커스를 잃게 한다
     focus 현재창에 포커스를 준다,활성화 시킨다.
     moveTo(x,y) x,y좌표로 브라우저를 이동시킨다
     moveBy(dx,dy) 현재위치에서 dx,dy만큼 창을 이동
     resizeTo(w,h) 브라우저창 크기를 w(폭),h(높이)로 변경한다
     resizeBy(dx,dy) 브라우저창 크기를 dx,dy만큼 변경한다
     open 새창을 연다
     close 브라우저를 닫는다
     print 문서를 인쇄한다
     setTimeout 특정시간후에 특정작업을 호출합니다
     clearTimeout setTimeout으로 설정한 Timer를 해제합니다
        
       예제보기
  [2] document 객체
   속성 title 문서의 제목
     lastModified 마지막으로 수정된 날짜
     bgColor 문서의 배경색
     fgColor 문서의 글자색
     linkColor 링크의 색상
     alinkColor 링크 클릭시의 색상
     vlinkColor 방문했던 링크의 색상
        
   콜렉션 -문서에 존재하는 여러개의 이미지들이나 링크들 폼들에대한 정보를 배열형식
으로 저장하고있는 속성을 말합니다.
     forms 문서에 여러개의 폼이 있을경우 각폼들은 폼이름대신
document.forms[index]으로 접근할수있습니다
index는 0부터시작합니다.
     links 문서에서의 a href태그들의 정보를 가진 콜렉션
     images 문서에서의 모든 img태그들의 정보를 가짐
     applets 문서에서 여러개의 자바애플릿을 사용했을경우 모든애플릿들의 콜렉션
     embeds 문서에서 embed태그의 콜렉션
        
   메서드 write 문서에 내용쓰기
     writeln 문서에 줄바꿈을 포함한 내용쓰기
        
       예제보기
        
  [3] screen 객체
   속성 width 시스템 스크린의 폭(픽셀)
     height 시스템 스크린의 높이(픽셀)
     availWidth 시스템 스크린중 브라우저의 문서영역 폭
     availHeight 시스템 스크린중 브라우저의 문서영역 높이
        
       예제보기
        
  [4] navigator 객체
   속성 userAgent 브라우저 전체정보
ex) Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)
     appCodeName 브라우저 CodeName
ex) Mozilla
     appVersion 브라우저 Version
ex) 4.0 (compatible; MSIE 6.0; Windows NT 5.0)
     appName 브라우저 이름
ex)Microsoft Internet Explorer
     cookieEnabled 브라우저 쿠키이용 가능여부
반환값 : true/false
   메서드 javaEnabled 브라우저의 자바이용가능여부
반환값 : true/false 
        
       예제보기
        
  [5] history 객체
   속성 length history목록(방문한사이트목록)의 갯수
        
   메서드 go(숫자) 지정숫자만큼 사이트이동
ex) go(2) 앞으로 2번째로 이동
     back 현재사이트 기준에서 이전사이트로 이동
     forward 현재사이트 기준에서 다음사이트로 이동
        
       예제보기
        
  [6] Event 객체
   속성 keyCode 이벤트를 일으킨 키보드의 키코드값
     altKey altKey를 눌렀는지의 여부
     ctrlKey ctrlKey를 눌렀는지의 여부
     shiftKey shiftKey를 눌렀는지의 여부
     button 마우스 오른쪽버튼을 눌렀는지
왼쪽버튼을 눌렀는지의 여부
     clientX 마우스 클릭시 브라우저기준의 x축거리
     clientY 마우스 클릭시 브라우저기준의 y축거리
   * srcElement 이벤트가 일어난 엘리먼트
        
       예제보기
        
  [7] Form 관련객체
   input type="text" 각값은 document.form이름.엘리먼트이름.value 로
접근할수 있다
   input type="password"
   input type="checkbox" 어떤 값이 선택되었는지는 루프를 돌며 checked속성이 true인지 false인지로 체크할수있다
   input type="radio"
   input type="file" 파일업로드를 위한 객체로서 파일값이 변할때
onChange이벤트 핸들러를 사용한다
   input type="button" submit이나 reset버튼의 제한된 기능에 다른여러기능을 추가적으로 스크립트로 제어할때는
input type="button"을 쓰고 onClick이벤트
핸들러를 사용한다
   input type="submit" 폼을 전송한다
   input type="reset" 폼을 초기상태로 reset한다
   select 선택값은 document.forms이름.엘리먼트이름.value로접근할수있습니다
      
       예제보기
       
        
   속성 disabled 버튼이나 셀렉트박스등을 클릭 선택하지 못하게 합니다
     readonly 텍스트 박스의 내용을 읽기 전용으로 합니다
        
       예제보기
        
        
    
        
  [8] Date 객체
   특징 다른 객체와 달리 new연산자와 생성자 함수 Date()를 사용해서 객체인스턴스를
생성한후 그메서드들을 이용할수있다
사실 생성자함수에는 몇가지유형 인자를 가지는 유형이 있으나 인자없는 단순한 Date(); 함수만으로도 충분하다 ..다른 인자를 가지는 생성자들까지 공부할려면
이야기주제는 자바스크립트라기보다 자바에 가까와 질듯하다...
        
   메서드 getTime 1970년 1월1일 오전0시0분0초로 부터 현재까지의 시간을 m초로 반환한다
     getYear 현재의 년도를 반환한다
     getMonth 현재의 월을 반환한다 (1월:0 2월:1...)
     getDate 날짜(1~31)를 반환한다
     getHours 현재의 시간을 반환한다 (5시 --> 17)
     getMinutes 현재의 분을 반환한다
     getSeconds  현재의 초를 반환한다
     getDay 요일(0:일요일 1:월요일)에 대한 숫자를 반환한다
        
   사용예 초를 이용한 랜덤 숫자 생성방법
var myDate=new Date();
var sec=myDate.getSeconds(); //이렇게 하면 sec에는 일단 0~59라는 숫자가 들어있다
var rndNum=sec%7; // %나머지를 구하는 연산자
따라서 rndNum에는 0~6중의 한숫자가 입력된다...
이해가 안되는것은 아닐것으로 보지만 그래도 설명하자면 어떤 수를 7로나누면
나머지는 반드시 0~6중에 하나이다... 아시겠져???
시간은 계속변하므로 웹페이지상에서 랜덤으로 이미지를 보여주고자 할때 사용하면 된다..
사실랜덤숫자 생성법은 다른 방법도 있겠지만 다른방법은 한번 생성된 숫자가
나중에 다시 생성될 가능성이 많아 랜덤의 의미가 떨어지는것 같다..
        
       예제보기
        
   지금까지 자바스크립트에서 사용되는 객체에 대해 개략적으로 알아 보았습니다... 이해가 안되신다면 한번더 읽어보시기 바라면 예제의 소스보기를 눈여겨 보시면 차차 이해가 될것입니다. 이해를 돕기위해 코드에 불필요한 부분은 모두 배제시켰습니다 모든 객체에 대해 알필요까지는 없습니다. 위 객체들에 대해 이해한후 자꾸 자바스크립트에 익숙해지다 보면 필요할때마다 정보를 보면서 자바스크립트를 이용하기만 하면 됩니다 --;;
        
4.CSS(stylesheet)
  stylesheet ?
걍 일반적인 태그의 한계(이미지나 테이블등의 정확한 위치나 테이블내의 셀과 글자
사이의 간격,줄간의 간격,링크의 색깔등)를 극복하고 나아가 동적인 웹페이지를 만들기위한것(?) 뭐 정의가 그렇게 중요한건 아니고 어디서먹느냐 어떻게 사용하느냐가 우선적인 문제일것입니다...
이 사이트가 추구하는바 속성으로 웹페이지 기본을 마스터 하자 이기때문에 모든것을
설명하지는 않습니다.기본적이고 꼭필요한것 만 설명합니다. 나머지는 그때그때 문서
찾아가며 적용해도 됩니다...
      
  [1] css
   1.태그와 태그사이에


2.스타일 정의 파일을 외부에따로 두고 불러오기


3.각태그내에서 정의하기
<태그 style="속성:값">
      
  [2] 선택자
   1) Type선택자
     문서내의 태그엘리먼트에 대한 스타일을 지정한다
예제)
=> 문서내의 input태그들은 모두 글자색을
붉은색으로 정한다는 의미임
      
   2) Class선택자
     문서내의 각요소들에 class속성을 부여할수 있는데 동일한 클래스가 부여된 태그들에 대해서는 동일한 스타일을 지정한다
예제)


본문부분


abc


abc

아래의 div태그의 클래스 속성이 redDiv로써 위에 정의된 클래스명과 같다.따라서 이div 의 배경색은 붉은색이 된다

      
   3) ID선택자
     문서내에 각요소에 대해 오직 하나의 id(다른것과 같아서는 안됨)를 지정할수 있는데 각 아이디가 부여된 태그에대해서 스타일을 지정한다


본문부분

굵은글씨
=> 이 div태그의 아이디가 special이므로 이태그내의 텍스트는 굵은 글자로 나타난다
      
     *head태그내에서 스타일정의할때 여러태그들을 중복해서 정의할수있다

      
  [3] 자주쓰이는 스타일 
   1) 색상
글자색 -> color:색상명 또는 rgb값
배경색 -> background:색상명 또는 rgb값
*** background-color로 써도 됨
      
   2) 배경그림
background:url(배경그림경로)
*** background-image로 써도 됨
-배경그림을 특정위치에 고정시키고 반복하지 않기
=>body{background:url(파일경로명) x위치 y위치 no-repeat fixed}
여기서 x위치 y위치는 %값이나 px값 사용
      
   3) 커서 모양변경
     원래 링크태그(a)에만 마우스를 올렸을경우 손모양으로 바뀌나 코딩하다보면 span태그나 div태그 또는 td태그내에 바로
onclick="location.href='이동파일명'" 이런씩으로 사용할경우
커서가 손모양으로바뀌지 않는다 이때 다음 스타일을 사용한다
 
      
   4) font속성
     물론 기본속성을 그대로 쓰려면 아래 스타일을 지정할 필요없다
font종류-> font-family:font명
font체 -> font-style:italic(기울임)
font굵기 -> font-weight:bold,bolder(굵게,더굵게)
font크기 -> font-size:폰트크기 px이나 pt
      
   5) border테두리
     주로 테이블의 셀이나 레이어태그(div,span)등의 테두리 설정에쓰이나
거의 모든 태그에 사용가능하다
     border:색상 크기 형태; 로사용하거나
테두리중 특정부분 예로 위쪽테두리만 주고싶을경우는
border-top:색상 크키 형태;

예)
=> 테이블의 현재셀의 위쪽테두리는 1픽셀의 회색실선으로 하고 아래쪽 테두리는 1픽셀의 검은색 점선으로 한다는 의미임
      
   6) text-decoration
     글자에 줄을 긋거나 링크에서 줄을 없앨때 사용된다
속성값으로 underline -> 밑줄긋기
overline -> 윗줄긋기
line-through -> 글자를 가로질러 긋기
none -> 링크에밑줄 없애기
      
   7) 위치,크기관련 속성
     위치 : position:absolute;left:수평위치;top:수직위치;z-index:쌓이는 순서;
크기 : width:폭;height:높이;
overflow -> 내용이 컨테이너(내용을 포함하는 레이어)보다 클경우
속성값으로 hidden 넘치는 부분은 숨긴다
auto 필요한 방향으로만 스크롤바를 생성한다
scroll 상하,좌우스크롤바를 모두 생성한다
      
   8) 여백 관련
     -> padding : 컨테이너와 내용사이의 거리
예)  => 이셀내의 글자는 이셀의 좌측에서 10px떨어져서 부터 시작한다
-> margin : 컨테이너와 컨테이너 사이의 거리
예) 이테이블은 브라우저 좌측에서 20px부분에서 시작된다         
   9) text-align 글자 정렬
     특정 컨테이너(레이어나 테이블의셀등에서의 글자의 정렬위치)
속성값 : left , right , center

    
5.DHTML
  이 내용도 마찬가지로 DHTML의 모든것을 설명하지는 않습니다.
가장기본적이고도 꼭 필요한 내용만 설명합니다.
아래 내용만 이해하신다면 다른 것들은 모두 여러분이 응용하실수 있을것입니다
    
  [1] 레이어 보이기 감추기
   -스타일의 visibility 속성을 이용합니다
... 스크립트 방법...................................
=레이어를 감출려면 -> 레이어ID.style.visibility="hidden";
=레이어를 보일려면 -> 레이어ID.style.visibility="visible";
   예제보기
    
  [2] 레이어 크기 변경하기
   -스타일의 pixelWidth,pixelHeight 속성을 이용합니다
... 스크립트 방법 ...................................
=레이어 폭 변경 -> 레이어ID.style.pixelWidth=폭(숫자);
=레이어 높이 변경 -> 레이어ID.style.pixelHeight=높이(숫자);
   예제보기
    
  [3] 레이어 위치 변경하기
   -스타일의 pixelLeft,pixelTop 속성을 이용합니다.
... 스크립트 방법 .................................
=레이어 좌우위치 변경 -> 레이어ID.style.pixelLeft=x축방향위치(숫자);
=레이어 상하위치 변경 -> 레이어ID.style.pixelTop=y축방향위치(숫자);
   예제보기
    
  [4] 레이어 시간적 이동
   -스타일의 pixelLeft,pixelTop 속성과 함께 window객체의 setTimeout
메서드를 이용합니다. setTimeout 메서드를 함수내에 선언하여 반복호출합니다
예)
function goLeft(){
if(myLayer.style.pixelLeft < 200){
//만약 myLayer의 x방향위치가 200px보다 작다면
myLayer.style.pixelLeft=myLayer.style.pixelLeft 10;
//현재 myLayer의 x방향위치를 현재위치에 10을 더하라는 말
setTimeout("goLeft();",100);
//0.1초 뒤에 다시goLeft함수가 호출되어 myLayer위치가 200에 도달할때
//까지 계속이동하고 200에 도달하면 멈추게 됩니다
}

   예제보기
    
  [5] 그외의 속성변경
   예로 마우스를 특정 레이어 위에 올렸을경우 내렸을경우 배경색변경은

onmouseout="this.style.background='gold'" >
이렇게 코딩하면 이레이에 마우스를 올리면 배경색은 green으로 이레이어에서
마우스를 내리면 배경색은 gold로 바뀌게 됩니다

또다른예로 마우스를 특정레이어위에 올렸을경우 내렸을경우 글자크기변경은

onmouseout="this.style.fontSize='10px'">
이렇게 하면 이레이어에 마우스를 올리면 글자크기는 20픽셀로 되고 이레이어에서마우스를 내리면 글자크기는 10픽셀로 됩니다

*이때 주의 할것은 fontSize할때 "S"는 대문자입니다..
*다른경우도 마찬가지로 z-index같은 경우도 -로연결된 스타일은
자바스크립트로 접근시 -다음의 문자를 대문자로 해야 합니다
예-> background-image => 스크립트에서는
레이어ID.style.backgroundImage ...
또한 z-index => 스크립트에서는 레이어ID.style.zIndex 처럼
스타일에서의 "-"문자 뒤의 알파벳은 항상 대문자로 해주어야 합니다...

2006/09/08 22:13 2006/09/08 22:13
이 글에는 트랙백을 보낼 수 없습니다
Linux/SHELL  2006/09/08 22:12

아마 MS-DOS를 접해본 분이라면 와일드카드(wildcard, 유닉스에서는 glob pattern이라고 부른다)이라고 부르는 *?와 같은 기호에 익숙할 겁니다. a로 시작하는 모든 GIF 파일을 a*.gif와 같이 비슷한 파일명을 일일이 명시하지 않고 지정할 수 있습니다. 정규표현식(regular express, 줄여서 regexp, regex, re)도 MS-DOS의 *?와 같이 패턴을 기술하는 방식입니다. 그러나 정규표현식은 MS-DOS의 와일드카드와는 달리 파일명 뿐만이 아니라 파일 내용을 포함한 일반적인 용도로 사용이 가능하며, 그 기능도 더 강력합니다.

유닉스는 기본적으로 그래픽보다는 문자 기반 인터페이스를 제공하기 때문에, 문자들을 찾거나 다른 문자로 대체하는 도구인 정규표현식은 매우 중요합니다. 사실, 정규표현식을 모르고 유닉스를 사용하는 것이 가능할까란 의문이 들 정도로 정규표현식은 유닉스 사용과 관리의 많은 부분에 적용이 가능합니다. 우리가 자주 사용하는 편집기인 vi와 emacs, 자주 사용하는 도구인 grep과 sed와 awk, portable shell로 불리는 Perl, 자동으로 메일을 정리하는 procmail 등, 정규표현식은 유닉스의 거의 모든 도구와 관련이 있습니다. 개인적으로 뼈아픈 경험뒤에 "멍청하면 손발이 고생한다"는 격언(?)의 적절한 예로 정규표현식을 꼽습니다.

불행히도 도구마다 정규표현식을 지원하는 정도가 조금 차이가 나지만 몇번 시도해보면 이 차이를 알 수 있습니다. 그러면 기본적이고 광범위하게 쓰이는 정규표현식부터 하나씩 알아봅시다.


2. 정규표현식 기초

기본적으로 정규표현식은 다음 세가지로 구별할 수 있습니다.

  • 문자에 해당되는 부분
  • 앞의 해당되는 부분을 반복하는 부분
  • 문자에 해당되지않고 위치나 결합을 나타내는 부분

이제 MS-DOS의 *와 같이 특수한 의미를 가지는 문자들을 만나게 됩니다. 우리가 정규표현식을 배운다는 것은 이런 특수 문자들과 그들의 의미를 아는 것입니다.

2.1. 문자에 해당되는 부분

우선 보통 알파벳과 숫자 등은 그 문자 그대로를 나타냅니다. 물론 대소문자는 서로 구별됩니다.

$ egrep 'GNU' COPYING GNU GENERAL PUBLIC LICENSE freedom to share and change it. By contrast, the GNU General Public the GNU Library General Public License instead.) You can apply it to ...(생략)... $

위에서 egrep은 파일들에서 원하는 문자들을 찾는 도구입니다. (흔히들 사용하는 grep의 변종으로 grep보다 다양한 정규표현식을 사용할 수 있습니다.) 첫번째 아규먼트로 원하는 문자를 나타내는 정규표현식을 사용합니다. 여기서 GNU는 정규표현식으로 뒤에 나오는 파일들에서 G, N, U 세 문자가 연이어 나오는 경우를 찾습니다. 여기서 사용한 파일인 COPYING은 자유 소프트웨어 소스코드에서 쉽게 찾을 수 있는 GPL 조항입니다. 결과를 명확하게 하기 위해서 찾은 단어를 굵게 표시했습니다.

그런데 왜 GNU 주위에 따옴표를 했을까요? 여기서 따옴표는 정규표현식에서 쓰이는 *, ?, | 등의 문자들이 쉘에서도 특별한 기능을 하기때문에 이들 문자가 쉘에서 처리되지 않게하려고 필요합니다. 또, egrep 'modified work' COPYING와 같이 찾으려는 패턴에 공백이 포함된 경우에도 따옴표는 이들을 한개의 아규먼트로 처리합니다. 사실 위의 GNU에 따옴표는 필요없지만, 항상 규칙처럼 따옴표를 같이 사용하는 것을 권합니다.

어떤 특정한 문자가 아니라 가능한 여러 문자들을 지정할 수도 있습니다.

$ egrep '[Tt]he' COPYING The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public software--to make sure the software is free for all its users. This ...(생략)... $

위에서 [Tt]는 그 자리에 Tt가 나올 수 있음을 의미합니다. 이렇게 []안에 가능한 문자들을 적어줄 수 있습니다.

[a-z]와 같이 [] 안에 -를 사용하여 그 범위 안의 문자들도 지정할 수 있습니다. 예를 들어, [a-zA-Z0-9]는 영문 알파벳 대소문자와 숫자들을 모두 포함합니다. 또, [^a-z]와 같이 [] 처음에 ^를 사용하여 뒤에서 지정된 문자 이외의 문자를 지시할 수도 있습니다. 즉, 이는 영문 알파벳 소문자를 제외한 문자들을 의미합니다.

([a-z]에서 범위는 ASCII 코드값으로 a (97)에서 z (122)까지를 뜻합니다. 만약 [z-a]와 같이 큰 값을 앞에 쓰면 안됩니다. ASCII 코드값은 man ascii로 볼 수 있습니다.)

마지막으로 (보통 행바꿈 문자를 제외한) 어떤 문자에도 대응되는 .이 있습니다. (MS-DOS의 ?와 같습니다.)

$ egrep 'th..' COPYING of this license document, but changing it is not allowed. freedom to share and change it. By contrast, the GNU General Public software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to ...(생략)... $

이는 th 뒤에 두 문자가 나오는 경우를 찾습니다. 세번째 줄 끝에 This는 대소문자를 구별하기 때문에 패턴에 해당되지않고, the 에서 공백도 한 문자로 취급한 것을 주의하길 바랍니다. 위에서 program will individually obtain patent licenses, in effect making the와 같은 줄을 출력하지 않은 이유는 마지막 the에서 th와 그 뒤의 한 문자는 찾았지만 그 뒤에 문자가 줄바꿈 문자이기 때문에 조건이 만족되지않기 때문입니다.

2.2. 앞의 해당되는 부분을 반복하는 부분

여기서는 *, ?, +을 다룹니다.

*는 바로 앞의 문자를 0번 이상 반복해도 됨을 나타냅니다. 예를 들어, abc*

  • abccccccccc
  • abc
  • ab

를 모두 만족합니다. 여기서 주의해서 볼 것은 "0번 이상"이기 때문에 마지막 경우와 같이 앞의 문자가 안나와도 된다는 것입니다. (그래서 MS-DOS의 *은 정규표현식으로 .*입니다.)

*와 비슷하게, ?는 앞의 문자가 없거나 하나 있는 경우를 나타내고, +는 앞의 문자가 1번 이상 반복하는 경우를 나타냅니다. 그래서 a+aa*와 같습니다.

이제 abc 모두를 반복하고 싶다면 어떻게 해야 되는지 의문이 듭니다. 이 경우 (, ) 괄호를 사용하여 문자들을 묶어주면 됩니다. 그래서 (abc)*

  • abcabcabcabc
  • abc

를 모두 만족합니다. 마지막 예는 0번 반복한 경우로 어떤 문자도 없는 빈 경우입니다. 이제 앞에서 말한 "앞의 문자"라는 말을 정정해야 겠습니다. *, ?, +는 "앞의 문자"에 적용되는 것이 아니라 "앞의 단위"에 적용됩니다. 기본적으로 한 문자는 그 자체로 한 단위입니다. 그래서 abc*에서 *는 바로 앞 문자이자 단위인 c에 적용된 것입니다. 그러나 괄호로 문자들을 묶어서 단위를 만들 수 있고, (abc)*의 경우에 *는 앞의 단위인 abc에 적용된 것입니다.

주의
위에서 (abc)*가 0번 반복해서 어떤 문자도 없는 것을 나타낼 수 있음을 주의해야 합니다. 정규표현식에서 이런 경우 대상과 관계없이 패턴이 만족한 것으로 판단하기 때문에 egrep '(abc)*' COPYING와 같은 명령어는 COPYINGabc라는 부분이 없음에도 불구하고 모든 줄을 출력합니다. 즉, egrep '(abc)*' COPYING | wc -lwc -l COPYING은 같습니다.

또, 주의할 점은 정규표현식은 패턴을 만족시키는 가장 긴 부분을 찾는다는 점입니다. 즉, abababab에 대한 정규표현식 (ab)+ababab에 대응되지 않고 abababab 모두에 대응됩니다. 이런 행동은 어떻게보면 당연한 것이지만 주의를 하지않으면 문제가 생길 수도 있습니다. 예를 들어, compiler and interpreter<\B>에 대한 정규표현식 .*<\B>는 (의도했을) compiler을 찾지않고 compiler and interpreter<\B> 전체를 찾게 됩니다. 이를 해결하기 위해 [^<]*<\B>을 사용합니다. . 대신에 [^<]를 사용한 것처럼 찾는 대상을 제한하기 위해서 [^...] 형식을 자주 사용합니다.

2.3. 문자에 해당되지않고 위치나 결합을 나타내는 부분

여기서 다루는 ^, $, |는 앞에서와는 달리 특정 문자에 대응하지는 않지만, 위치나 결합의 중요한 기능을 합니다.

우선 ^는 줄의 처음을 뜻합니다.

$ egrep '^[Tt]he ' COPYING the GNU Library General Public License instead.) You can apply it to the term "modification".) Each licensee is addressed as "you". the scope of this License. The source code for a work means the preferred form of the work for ...(생략)... $

정규표현식의 마지막 문자가 공백임을 주의하길 바랍니다. 만약 이 공백이 없다면 Thesethemselves,로 시작하는 줄들도 찾게됩니다. 이렇듯 정규표현식을 적을 때는 자신이 찾길 원하는 부분을 빼먹거나, 자신이 원하는 부분 이외의 것을 포함하지 않도록 주의해야 합니다. 지금처럼 정규표현식을 입력하고 그 결과를 하나씩 살펴볼때는 문제가 없지만, 많은 경우 정규표현식은 스크립트로 많은 문서를 한꺼번에 처리할때 사용하기때문에 주의해야 합니다. 잘못 쓴 정규표현식때문에 원하는 결과를 얻지 못하는 것은 물론이고 원본까지 망치게 되는 경우가 있습니다.

^는 이렇게 [Tt]와 같이 특정 문자에 대응되지는 않지만 원하는 문자가 선택될 수 있게 도와줍니다. 반대로, $는 줄의 끝을 나타냅니다. 그래서 ^$과 같은 정규표현식은 빈 줄을 찾습니다.

|은 기호 앞뒤의 것 중 하나를 선택한다는 뜻입니다. 즉, 문서에서 this(This)나 that(That)을 찾는다면,

  • this|This|that|That
  • [tT]his|[tT]hat
  • [tT]his|hat - 틀림! 이 정규표현식은 [tT]hishat을 찾음.
  • [tT](his|hat)
  • [tT]h(is|at)

모두 가능합니다. 세번째와 네번째 경우에서 괄호의 기능을 알 수 있습니다.

2.4. 일반문자와 특수문자

아마도 지금쯤 ^이 두가지 의미로 쓰인다는 것이 이상해 보일 수도 있을 겁니다. 정규표현식에서 쓰이는 문자는 크게 일반문자와 특수문자로 나눠볼 수 있습니다. 여기서 특수문자란 앞에서 다룬 (순서대로) [, ], -, ^, ., *, ?, +, (, ), $, |과 같이 정규표현식에서 문자그대로의 의미로 해석되지 않는 문자들입니다. 반대로 특수문자가 아닌 문자는 일반문자로 G, N, U와 같이 문자그대로의 의미를 가집니다.

여기서 특수문자는 쓰이는 곳에 따라 다릅니다. 자세히 말하면, []안이냐 밖이냐에 따라 특수문자가 달라집니다.

우선 [] 밖에서는 -를 제외한, ^, ., *, ?, +, (, ), $, |이 특수문자입니다. 여기서 ^는 줄의 시작을 의미합니다.

그러나 [] 안에서는 -^만이 특수문자이고, 다른 문자들은 일반문자가 됩니다. 즉, [*?+]는 반복이 아니라 문자그대로 *?+ 중 하나를 뜻합니다. [] 안에서 (제일 앞에 나오는) ^는 뒤에나오는 조건을 만족하지 않는 문자를 찾는다는 의미가 됩니다.

2.5. 특수문자에 해당하는 문자 사용하기

그렇다면 찾으려는 부분에 특수문자가 포함되있다면 어떻게 할까요? 예를 들어 what?이라는 물음표로 끝나는 문자를 찾고 싶다고, egrep 'what?' ...이라고 하면 ?이 특수문자이므로 wha를 포함한 whale도 찾게 됩니다. 또, 3.14로 찾을때는 3+14 등도 찾게 됩니다.

특수문자가 [] 안과 밖에서 다르다는 점을 생각하여 각각의 경우를 살펴봅시다. 우선 [] 밖의 경우는,

  • \을 특수문자 앞에 붙이기. 예, what\?, 3\.14
  • []을 사용하기. 예, what[?], 3[.]14

첫번째 방법은 보통 escape라고 부르며, 특수문자 앞에 \을 붙여서 특수문자의 특수한 기능을 제거합니다. 두번째 방법은 [] 밖의 많은 특수문자들이 [] 안에서는 일반문자가 되는 점을 이용한 것입니다. 보통 첫번째 방법을 많이 사용합니다.

주의할 점은 첫번째 방법에서 사용하는 \가 뒤에 나오는 특수문자를 일반문자로 만드는 특수문자이기 때문에, 문자 그대로의 \을 나타내려면 \\을 사용해야 합니다. 물론 [\]도 가능합니다.

[] 안의 특수문자는 위치를 바꿔서 처리합니다. 먼저, ^[^abc]와 같이 처음에 나와야만 의미가 있으므로 [abc^]와 같이 다른 위치에 사용하면 됩니다. -[a-z]와 같이 두 문자 사이에서만 의미가 있으므로 [-abc][abc-]와 같이 제일 처음이나 마지막에 사용합니다.

(grep과 같이 도구에 따라 역으로 일반 문자앞에 \를 붙여서 특수문자를 만드는 경우가 있습니다. 아래 각 도구에 대한 설명 참고.)


3. 정규표현식 고급

고급이라고 제목을 붙였지만 여기서는 도구마다 차이가 나거나 없을 수도 있는 내용을 다룹니다.

3.1. 자세한 반복

반복하는 횟수를 자세히 조정할 수 있습니다.

  • {n} - 정확히 n번 반복. a{3}aaa와 같음.
  • {n,} - n번 이상 반복. a{3,}aaaa*와 같음.
  • {n,m} - n번 이상 m번 이하 반복. a{2,4}aaa?a?와 같음.

물론 (abc){2,4}같이 괄호로 반복할 단위를 지정할 수 있습니다. 여기서 {, }*, ?, +와 같이 특수문자임을 주의하길 바랍니다. (엄밀한 의미에서 }은 특수문자가 아닙니다.)

3.2. 기억하기

앞에서 여러 문자를 묶어서 단위로 만드는 괄호는 정규표현식으로 찾은 부분을 기억하여 다른 곳에서 사용할때도 사용합니다. 예를 들어, HTML 제목 테그는 (egrep에서) <[Hh]([1-6])>.*와 같이 찾을 수 있습니다. 여기서 ([1-6])(, )는 사이에 대응된 부분을 기억하여 (첫번째 기억된 내용을) \1에서 사용합니다. 즉, 2>Conclusion2>에서 외에

등은 만족하지 않습니다.

(...)은 여러번 사용할 수 있고 (심지어 겹쳐서도), \n은 기억된 n번째 부분을 지칭합니다. 순서는 기억이 시작되는 (의 순서입니다.

여기에서는 ()이 특수문자이고, 그냥 \(\)는 일반문자이지만, 도구에 따라 반대인 경우도 있습니다.

이 기능은 또 치환에서 자주 사용됩니다. 아래 vi와 sed 부분을 참고하길 바랍니다.

3.3. 단어 찾기

앞에서 the를 찾으면 the 외에 them 등도 같이 찾는 것을 보았습니다. 그러면 정관사 the만 찾으려면 어떻게 할까요?

간단히 정규표현식 앞뒤에 공백을 추가한 the 를 생각해 볼 수 있습니다. 그러나 이 정규표현식에는 두가지 문제가 있습니다. 첫번째는 탭(tab) 등 다른 공백문자가 있기 때문입니다. 두번째는 이 정규표현식으로 the가 줄 제일 앞이나 제일 뒤에 나오는 경우는 찾지 못하기 때문입니다. 물론 [], ^, $|를 복잡하게 결합하여 이들 경우를 모두 처리할 수 있는 정규표현식을 쓸 수 있지만, 자주 사용하는 표현이기 때문에 간단히 할 수 있는 방법이 마련되있습니다.

그것은 \<\>로, \<은 공백에서 공백이 아닌 문자 사이, \>는 공백이 아닌 문자에서 공백 사이의 위치를 나타냅니다. 즉, ^$와 같이 문자에 해당되지않고 위치만을 나타냅니다. 이제 해답은 \입니다.

3.4. 단축 표현들

정규표현식에는 이외에도 자주 사용되는 표현에 대한 단축된 형식을 제공합니다. 예를 들어, vim에서 \i는 (C 언어 인식자 이름에서 사용하는 문자인) [_a-zA-Z0-9]와 같습니다. 그러나 이런 단축된 형식은 도구에 따라 많은 차이가 나기때문에 관련 문서를 참고하길 바랍니다.

POSIX.2에서 정의한 단축 표현은 다음과 같습니다. (C 언어에서 에 선언된 is*() 함수와 비슷한 것을 알 수 있습니다.) 단축된 형식이 나타내는 정확한 값은 locale에 따라 변합니다. 여기서는 영어권에서 사용하는 값을 보입니다. 독일어의 움라우트(a)와 같이 다른 언어권에서는 다른 값을 가질 수 있습니다.

  • [:alnum:] - 알파벳과 숫자. [a-zA-Z0-9]
  • [:alpha:] - 알파벳. [a-zA-Z]
  • [:cntrl:] - 제어문자. ASCII 값으로 0x00-0x1F와 0x7F
  • [:digit:] - 숫자. [0-9]
  • [:graph:] - 제어문자와 공백을 제외한 문자. ASCII 값으로 0x21-0x7E
  • [:lower:] - 소문자. [a-z]
  • [:print:] - 제어문자를 제외한 문자. ASCII 값으로 0x20-0x7E
  • [:punct:] - [:graph:] 중에 [:alnum:]에 속하지 않은 문자. !, @, #, :, ,
  • [:space:] - space, tab, carriage return, new line, vertical tab, formfeed. ASCII 값으로 0x09-0x0D와 0x20
  • [:upper:] - 대문자. [A-Z]
  • [:xdigit:] - 16진수에 사용하는 문자. [0-9a-fA-F]

3.5. 눈으로 보는 정규표현식

정규표현식이 패턴을 찾는 과정을 시각적으로 보여주는 프로그램들이 있습니다.

4. 정규표현식 사용

이제 이런 정규표현식을 실제로 어떻게 사용하는지 알아봅시다. 평소에 많이 사용하는 vi, grep/egrep/fgrep, sed/awk의 예를 들어보겠습니다.

4.1. vi에서

vi에서 정규표현식은 ':'상태에서 사용합니다. (실제로 이 상태에서 실행하는 명령어는 ed나 ex라는 프로그램이 처리하게 됩니다. 그래서 보통 이 상태를 "ed-모드"라고 합니다.) 문서에서 원하는 패턴을 찾으려면, (커서 다음에서 찾을때) /패턴이나 (커서 전에서 찾을때) ?패턴을 사용합니다.

정규표현식은 문자치환과 결합하여 강력한 기능을 합니다. 문자치환 명령은 다음과 같습니다.

:범위s/변경전/변경후/수정자

"범위"는 명령이 실행될 범위를 나타내며, 보통은 현재 편집하고 있는 문서 전체를 지시하는 (첫번째 줄에서 마지막 줄까지를 뜻하는) 1,$나 줄여서 %를 사용합니다.

뒤에 "s"는 치환(substitute) 명령어입니다.

"변경전"과 "변경후"에 치환할 내용을 입력합니다. "변경전"에 정규표현식을 적습니다. 정규표현식으로 ., *, ^, $, [], \(...\), \<...\>, POSIX.2 단축 표현을 사용할 수 있습니다. 여기서 여러 문자를 묶여서 단위를 만들고 찾은 내용을 기억하는 특수문자가 \(, \)임을 주의해야 합니다. 반대로 (, )가 일반문자입니다. vim(VI iMproved)에서는 vi에 추가로 |, +, (?와 같은) =, {n,m}을 사용할 수 있지만, 앞에 \를 붙여야 합니다. 또, vim에는 \i, \k, \p, \s 등의 단축 표현들이 있습니다.

"변경후"에 \n&를 사용할 수 있습니다. \n는 "변경전"에서 n번째 \(...\)에 대응하는 부분이고, &는 "변경전"에 만족한 전체를 나타냅니다. 예를 들어, :%s/\([0-9][0-9]*\) \([Cc]hapter\)/\2 \1/는 문서에서 12 Chapter같은 부분을 Chapter 12와 같이 치환하고, :%s/F[1-9][12]*/&/g는 HTML 문서에서 "F1" ~ "F12"란 단어 모두를 굵은 체로 바꿉니다. (주의! &는 정규표현식의 특수문자는 아니지만 vi의 특수문자이므로, 문자그대로의 &를 사용하려면 대신 \&를 사용해야 한다.) 이외에도 (뒤를 모두 대문자로) \u나 (뒤를 모두 소문자로) \l같은 기능이 있습니다.

"수정자"는 치환 명령의 세부사항을 결정합니다. 필요한 것만 뒤에 적어주면 됩니다.

  • g (global) - 한 줄에서 정규표현식을 만족하는 부분을 여러개 찾았을 때 모두다 치환한다. 이 수정자를 사용하지 않으면 처음 것만 치환한다.
  • c (confirm) - 만족하는 정규표현식을 찾았을때 치환하기 전에 확인한다.
  • i (ignore-case) - 대소문자를 무시하고 찾는다. 즉, :%s/[aA][bB][cC]/XXX/ 대신에 :%s/abc/XXX/i를 사용할 수 있다.

마지막으로 주의할 점은 치환명령어가 / 문자로 각 부분을 구분하기때문에 "변경전"이나 "변경후"에 / 문자를 사용하려면 \/ 같이 써야합니다. 필요하다면 / 대신 다른 문자를 사용해도 됩니다. 예를 들어, :%s/\/usr\/local\/bin\//\/usr\/bin\//g 대신 :%s#/usr/local/bin/#/usr/bin/#g가 알아보기 더 쉽습니다.

4.2. grep/egrep/fgrep에서

grep은 Global Regular Expression Print(ed 명령어로 :g/re/p)의 준말로 입력에서 원하는 정규표현식을 찾는 명령어입니다. grep에는 egrep과 fgrep이라는 변종이 있습니다. 전통적으로 egrep은 grep 보다 더 다양한 정규표현식을 지원하고, fgrep은 정규표현식을 지원하지 않고 빨리 검색하기 위한 명령어입니다. GNU grep에서 egrep은 grep -E, fgrep은 grep -F와 같습니다.

grep과 egrep 모두 ., *, ?, +, {n,m}, ^, $, |, [], (...), \n, \<...\>, POSIX.2 단축 표현을 지원합니다. 단, grep은 ?, +, {, |, (, )를 일반문자로 보기때문에 특수문자로 사용하려면 앞에 \를 붙여야 합니다.

2006/09/08 22:12 2006/09/08 22:12
이 글에는 트랙백을 보낼 수 없습니다
출처 블로그 > 돈포겟미
원본 http://blog.naver.com/jjazungna/23879946
ascii code 아스키 코드표

Char

Hex

Oct

Dec

Char

Hex

Oct

Dec

Char

Hex

Oct

Dec

Char

Hex

Oct

Dec

Ctrl-@

NUL

00

000

0

Space

20

040

32

@

40

100

64

`

60

140

96

Ctrl-A SOH

01

001

1

!

21

041

33

A

41

101

65

a

61

141

97

Ctrl-B STX

02

002

2

"

22

042

34

B

42

102

66

b

62

142

98

Ctrl-C ETX

03

003

3

#

23

043

35

C

43

103

67

c

63

143

99

Ctrl-D EOT

04

004

4

$

24

044

36

D

44

104

68

d

64

144

100

Ctrl-E ENQ

05

005

5

%

25

045

37

E

45

105

69

e

65

145

101

Ctrl-F ACK

06

006

6

&

26

046

38

F

46

106

70

f

66

146

102

Ctrl-G BEL

07

007

7

'

27

047

39

G

47

107

71

g

67

147

103

Ctrl-H BS

08

010

8

(

28

050

40

H

48

110

72

h

68

150

104

Ctrl-I HT

09

011

9

)

29

051

41

I

49

111

73

i

69

151

105

Ctrl-J LF

0A

012

10

*

2A

052

42

J

4A

112

74

j

6A

152

106

Ctrl-K VT

0B

013

11

+

2B

053

43

K

4B

113

75

k

6B

153

107

Ctrl-L FF

0C

014

12

,

2C

054

44

L

4C

114

76

l

6C

154

108

Ctrl-M CR

0D

015

13

-

2D

055

45

M

4D

115

77

m

6D

155

109

Ctrl-N SO

0E

016

14

.

2E

056

46

N

4E

116

78

n

6E

156

110

Ctrl-O SI

0F

017

15

/

2F

057

47

O

4F

117

79

o

6F

157

111

Ctrl-P DLE

10

020

16

0

30

060

48

P

50

120

80

p

70

160

112

Ctrl-Q DCI

11

021

17

1

31

061

49

Q

51

121

81

q

71

161

113

Ctrl-R DC2

12

022

18

2

32

062

50

R

52

122

82

r

72

162

114

Ctrl-S DC3

13

023

19

3

33

063

51

S

53

123

83

s

73

163

115

Ctrl-T DC4

14

024

20

4

34

064

52

T

54

124

84

t

74

164

116

Ctrl-U NAK

15

025

21

5

35

065

53

U

55

125

85

u

75

165

117

Ctrl-V SYN

16

026

22

6

36

066

54

V

56

126

86

v

76

166

118

Ctrl-W ETB

17

027

23

7

37

067

55

W

57

127

87

w

77

167

119

Ctrl-X CAN

18

030

24

8

38

070

56

X

58

130

88

x

78

170

120

Ctrl-Y EM

19

031

25

9

39

071

57

Y

59

131

89

y

79

171

121

Ctrl-Z SUB

1A

032

26

:

3A

072

58

Z

5A

132

90

z

7A

172

122

Ctrl-[ ESC

1B

033

27

;

3B

073

59

[

5B

133

91

{

7B

173

123

Ctrl- FS

1C

034

28

<

3C

074

60

5C

134

92

|

7C

174

124

Ctrl-] GS

1D

035

29

=

3D

075

61

]

5D

135

93

}

7D

175

125

Ctrl-^ RS

1E

036

30

>

3E

076

62

^

5E

136

94

~

7E

176

126

Ctrl_ US

1F

037

31

?

3F

077

63

_

5F

137

95

DEL

7F

177

127


2006/09/08 22:02 2006/09/08 22:02
이 글에는 트랙백을 보낼 수 없습니다
웅쓰:웅자의 상상플러스
웅자의 상상플러스
전체 (379)
게임 (5)
영화 (2)
기타 (23)
맛집 (5)
영어 (2)
대수학 (3)
형태소 (5)
Hacking (9)
Linux (112)
HTML (48)
Application_developing (48)
Web_developing (102)
Window (11)
«   2006/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. 2016/01 (1)
  2. 2015/12 (3)
  3. 2015/10 (3)
  4. 2015/03 (2)
  5. 2015/01 (4)