블로그 > H.i.p.p.i.e .♂. N.a.y.a http://blog.naver.com/xxfinger/100002953652 | ||||||||||||||||
[펌] 온더넷
|
블로그 > H.i.p.p.i.e .♂. N.a.y.a http://blog.naver.com/xxfinger/100002953652 | ||||||||||||||||
[펌] 온더넷
|
블로그 > jks3500님의 블로그 http://blog.naver.com/jks3500/40002554697 | |
nmap은 열린 포트를 확인하여 보안 점검을 위한 대표적인 툴이면서 원치 않는 서버를 대상으로 포트 스캐닝과 시스템의 OS 종류와 버전을 알아내는데 사용되기도 한다. 최근에 나온 nmap 3.45버전은 오픈된 서비스의 버전 정보까지도 확인시켜준다. -------------------------------------------------------------- # nmap -A -T4 -F localhost Starting nmap 3.45 ( http://www.insecure.org/nmap/ ) at 2003-09-16 22:45 KST Interesting ports on truefeel (127.0.0.1): (The 1203 ports scanned but not shown below are in state: closed) PORT STATE SERVICE VERSION 21/tcp open ftp vsFTPd 1.2.0 25/tcp open smtp Sendmail smtpd Securing..214-2.0.0 This is sendmail version 8.12. 80/tcp open http Apache httpd 2.0.44 ((Unix) DAV/2 PHP/4.3.2) ... 중략 ... Running: Linux 2.4.X|2.5.X OS details: Linux Kernel 2.4.0 - 2.5.20, Linux kernel 2.4.20 Uptime 0.505 days (since Tue Sep 16 10:38:25 2003) Nmap run completed -- 1 IP address (1 host up) scanned in 16.859 seconds -------------------------------------------------------------- 위에서 보는 것처럼 nmap의 뛰어난 기능으로 어느 OS를 사용하는지 쉽게 알 수 있다. 이러한 nmap의 OS를 알아내는 기능은 7단계(T1~T7)를 거치게 된다. T1 단계에서 열린 포트로 SYN 패킷을 보내고, T2에서 열린 포트로 null 패킷 전송, T3에서 열린 포트로 SYN, FIN, URG, PSH 패킷을 전송 T5 부터는 닫혀진 포트로 비슷한 과정을 거치게 된다. 자~ 이제 nmap OS fingerprinting을 막는 방법을 알아보자. 1. iplog 툴 iplog는 포트 스캐닝으 로깅하는 툴이다. TCP 포트, UDP 포트 스캐닝, TCP null 스캔, FIN 스캔, smurf 공격, Xmas 스캔, ping 플러딩, IP fragment 공격 등을 감지할 수 있다. procmisc 모드를 지원하여 같은 서브넷으로 들어오는 스캐닝을 감지할 수 있다. 또한 OS 정보를 숨기기한 목적으로도 사용할 수 있다. 1) 설치 http://ojnk.sourceforge.net/ 에서 iplog-2.2.3.tar.gz 을 받아온다. -------------------------------------------------------------- # tar xvfz iplog-2.2.3.tar.gz # cd iplog-2.2.3 # ./configure # make # make install # cp example-iplog.conf /etc/iplog.conf -------------------------------------------------------------- iplog.conf에서 다음 2가지를 수정한다. -------------------------------------------------------------- user nobody # default는 iplog 사용자로 실행함 pid-file /var/run/iplog.pid # default는 /var/run/iplog/iplog.pid 임 -------------------------------------------------------------- 소스 설치가 귀찮은 분 중 레드햇 사용자는 http://www.rpmfind.net/ 에서 iplog-2.2.3-fr2.i386.rpm 받아 설치한다. FreeBSD 사용자는 포트 시스템을 이용해서 설치한다. 실행 파일은 /usr/local/sbin에, 설정파일은 /usr/local/etc에 설치된다. -------------------------------------------------------------- # cd /usr/ports/net/iplog/ # make install # make clean -------------------------------------------------------------- '포트시스템이 뭐에요?' 하는 분은 최준호님이 쓴 글을 참고하기 바란다. http://www.bsdnet.co.kr/articles/article.qsp?no=14 2) 실행 -------------------------------------------------------------- # iplog -o -z -i lo (테스트를 위해 lo interface를 지정함) -------------------------------------------------------------- -o 등의 옵션의 의미는 nmap 테스트 후에 알아본다. -------------------------------------------------------------- # nmap -sS -O localhost Starting nmap 3.45 ( http://www.insecure.org/nmap/ ) at 2003-10-29 23:37 KST Insufficient responses for TCP sequencing (2), OS detection may be less accurate Insufficient responses for TCP sequencing (3), OS detection may be less accurate Interesting ports on truefeel (127.0.0.1): (The 1651 ports scanned but not shown below are in state: closed) PORT STATE SERVICE 25/tcp open smtp 80/tcp open http ... 중략 ... No exact OS matches for host (If you know what OS is running on it, see http://www.insecure.org/cgi-bin/nmap-submit.cgi). TCP/IP fingerprint: SInfo(V=3.45%P=i686-pc-linux-gnu%D=10/29%Time=3F9FD0B9%O=25%C=1) T1(Resp=Y%DF=Y%W=7FFF%ACK=S++%Flags=AS%Ops=MNNTNW) T2(Resp=Y%DF=Y%W=100%ACK=O%Flags=BAPRSF%Ops=) T2(Resp=Y%DF=N%W=0%ACK=O%Flags=BARS%Ops=) T2(Resp=Y%DF=Y%W=100%ACK=O%Flags=BPRF%Ops=) T3(Resp=Y%DF=Y%W=7FFF%ACK=S++%Flags=AS%Ops=MNNTNW) T4(Resp=Y%DF=Y%W=0%ACK=O%Flags=R%Ops=) T5(Resp=Y%DF=Y%W=0%ACK=S++%Flags=AR%Ops=) T6(Resp=Y%DF=Y%W=0%ACK=O%Flags=R%Ops=) T7(Resp=Y%DF=Y%W=0%ACK=S++%Flags=AR%Ops=) PU(Resp=N) Uptime 0.303 days (since Wed Oct 29 16:21:04 2003) Nmap run completed -- 1 IP address (1 host up) scanned in 21.301 seconds -------------------------------------------------------------- nmap은 T1~T7까지 OS 탐지 테스트 과정을 거쳤지만 OS 종류는 알아내지 못했음을 확인했다. 그럼 도대체 스캐닝 로그는 어디에 있는건가? /etc/iplog.conf 설정에 따라 /var/log/iplog에 저장된다. -------------------------------------------------------------- ... 생략 ... Oct 29 23:37:09 ICMP: echo from truefeel (127.0.0.1) (8 bytes) Oct 29 23:37:09 TCP: port 5901 connection attempt from truefeel (127.0.0.1):49574 Oct 29 23:37:09 TCP: port 516 connection attempt from truefeel (127.0.0.1):49574 Oct 29 23:37:09 TCP: port 657 connection attempt from truefeel (127.0.0.1):49574 Oct 29 23:37:09 TCP: port 32 connection attempt from truefeel (127.0.0.1):49574 Oct 29 23:37:09 TCP: port 2044 connection attempt from truefeel (127.0.0.1):49574 Oct 29 23:37:09 TCP: port 737 connection attempt from truefeel (127.0.0.1):49574 Oct 29 23:37:09 TCP: pop2 connection attempt from truefeel (127.0.0.1):49574 Oct 29 23:37:09 TCP: port 872 connection attempt from truefeel (127.0.0.1):49574 Oct 29 23:37:09 TCP: port 670 connection attempt from truefeel (127.0.0.1):49574 Oct 29 23:37:09 TCP: SYN scan detected [ports 5901,516,657,32,2044,737,109,872,670,374,...] from truefeel (127.0.0.1) [port 49574] Oct 29 23:37:12 TCP: Bogus TCP flags set by truefeel (127.0.0.1):49581 (dest port 25) Oct 29 23:37:14 TCP: ipp connection attempt from truefeel (127.0.0.1):40509 ... 생략 ... -------------------------------------------------------------- 3) 옵션과 설정은? -o : 백그라운드로 실행하지 않는다. (기본 백그라운드) -z : 이게 바로 핵심이다. nmap로 OS 정보 알아내는 것을 막는다. -L : log를 화면으로 출력한다. -i : interface를 지정한다. (기본 eth0) -u : iplog 실행 사용자 또는 UID를 지정한다. (기본 nobody) -g : iplog 실행 그룹명 또는 GID를 지정한다. (기본 nobody) -l : 로그파일을 지정한다. (기본 /var/log/iplog) -a : promisc 모드로 전환하여 지정한 네트워크 내의 스캐닝을 로깅한다. (예. -a 192.168.123.0/24) -k : iplog 프로세스를 kill한다. 백그라운드, 포그라운드 실행중인 것과 상관없이 kill. -R : iplog를 재실행한다. 이 많은 옵션을 어떻게 사용하면 좋을까? 화면으로 모니터링한다면 # iplog -o -z -L 파일로 로깅을 한다면 (부팅시 실행되도록 하려면 /etc/rc.d/rc.local 등에 추가) # iplog -z /etc/iplog.conf 설정 파일에서는 옵션으로 사용할 것을 미리 지정해 둘 수 있다. 실행 사용자, interface, 감지에서 제외할 포트 등 2. iptables 이용하는 방법 iptables를 이용하는 방법이 있으나 커널 패치+iptables 패치를 해야하는 과정이 필요하며 커널 2.4.19 이후의 버전에 대해서는 더이상의 발표도 있지 않아 간단하게 설명한다. http://ippersonality.sourceforge.net/ 에서 ippersonality-20020819-2.4.19.tar.gz 를 받아 커널과 iptables 각각 패치를 한 후 컴파일을 한다. ippersonality-20020819-2.4.19/samples 디렉토리에는 OS를 속이기 위한 총 10개의 파일이 있다. AmigaOS, Dreamcast, FreeBSD, Linux 2.0x, Linux 2.2, MacOS 9, Solaris 8, Tru64 UNIX, Win Me 또는 Win 2000, Win 9x 이렇게 10개. Windows를 사용하는 것 처럼 속이려면 어떻게 해야 하는가? 패치된 iptables를 이용해서 -------------------------------------------------------------- # insmod ipt_PERS (모듈을 로딩, 커널 컴파일시에 CONFIG_IP_NF_PERS=m로 했을 때) # /usr/local/sbin/iptables -t mangle -A PREROUTING -s ! 서버IP -d 서버IP -j PERS --tweak dst --local --conf win2k.conf # /usr/local/sbin/iptables -t mangle -A OUTPUT -s 서버IP -d ! 서버IP -j PERS --tweak src --local --conf win2k.conf -------------------------------------------------------------- 3. 참고 자료 * A practical approach for defeating Nmap OS-Fingerprinting http://coffeenix.net/doc/security/nmap_os_fingerprinting.html * IP Personality 프로젝트 http://ippersonality.sourceforge.net/ * iplog http://ojnk.sourceforge.net/ * nmap 3.45의 새기능, 버전 스캐닝 (글 좋은진호) http://coffeenix.net/board_view.php?bd_code=71 |
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 버전은 재부팅하지 않고서도 바뀐 파티션 내용을 충분히 갱신할 수 있다 리눅스 설치시 전문가용으로 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 명 령 기 능 2. fdisk 명령어 다음은 fdisk 명령어에 대한 것들을 알아보자. 일단 많이 사용되는 명령어부터 해서 각각의 명령어들의 사용법에 대해서 알아보도록 한다. 새로운 파티션을 만들려면 n 명령어를 사용한다. 파티션 생성을 위해 우선 다음과 같이 n을 입력한다. Command (m for help): n 다음에 나오는 선택 사항에서 우선 Primary 파티션을 만들어야 하므로 p를 입력한다. 4개 이상의 파티션을 만들고 싶을 경우에만 확장 파티션이 필요하다. Command action 그 다음 프롬프트에서는 파티션 번호를 선택한다. 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 파티션 번호 다음 번호부터 다시 잡힌다. 알맞게 파티션을 나눈 후에 부트파티션을 지정해 주어야 한다. 대부분 첫 번째 Primary 파티션을 부트파티션으로 잡는다. 프롬프트에서 다음과 같이 입력한다. Command(m for help) : a 삭제해야 할 파티션이 있다면 d 명령을 사용하여 삭제할 수 있다. 다음과 같이 Command (m for help): d 만들어진 파티션의 시스템 id는 기본적으로 83번으로 Linux 파티션이다. 그렇지만, 경우에 따라서 Dos 파티션을 만들어야 하는 경우도 있고 swap 파티션을 만들어야 하는 경우도 있다. 이 경우에 시스템 id를 변경해 주기 위해서 t 명령어를 사용한다. 다음은 t 명령어를 사용해서 83번으로 되어 있던 시스템 id를 82번으로 바꾼 예제이다. 일련의 작업이 끝난 후 실제로 반영시키기 위해서 w명령으로 변경 내용을 저장한 후 종료한다. 만약 새로 파티션을 생성하는 경우라면 재부팅을 해야 새로운 파티션이 인식이 된다. 그러므로, 포맷을 하기 위해서는 컴퓨터를 재부팅한다. 실수로 파티션을 삭제하거나 잘못 설정한 경우에는 q 명령으로 변경 내용을 반영하지 않고 종료하거나 Ctrl + C키를 눌러 강제 종료 시켜야 한다. 다음과 같이 q 명령을 내리면 그대로 fdisk가 종료된다. Command (m for help): q 만약 컴퓨터가 알파 시스템이라면 bsd 디스크 레이블로 파티션을 편집해야 할 수도 있다. 이 경우에 b 명령어로 그렇게 할 수 있도록 환경을 변경해 주어야 한다. 이후의 파티션을 잡는 방식은 앞서와 같다. [파티션 복구] 리눅스의 fdisk는 Windows 시스템의 fdisk와 달리 잘못 사용한 경우에 복구가 가능하다. 우선 이전의 실린더 숫자를 적어 두고 파티션을 나눈다. 그러면, 파티션을 잘못하고 저장한 경우 다른 시스템에 연결하여 실린더를 맞추어 이전의 것을 복구할 수 있다. 이것은 보안을 위해서도 사용될 수 있는데, 하드디스크의 실린더 숫자를 적어 놓고 파티션을 다르게 해버리면 파일시스템을 제대로 사용할 수 없게 된다. 이렇게 실린더 숫자를 적어 두는 것은 불시의 사고에 대비하는 방법이기도 한데, 만약 fdisk를 하면서 실수로 잘못 저장한 경우에 이전의 실린더 번호대로 복구하면 이전 상태 그대로 된다. 3. 파티션 요령과 fdisk 사용 fdisk를 이용해서 서버로 사용될 시스템의 파티션을 나눠 보도록 하자. 하드 디스크를 분할하는 것에는 일정한 공식은 없지만, 각각의 파일시스템에 사용될 파티션은 하드 디스크의 퍼센트보다는 각각의 사용 용량에 따라서 나눠 준다. 다음은 파일시스템에 따른 파티션 용량이다. 이외에 자신의 필요에 따라 백업용 파티션을 나누거나 일정한 파티션에 백업용 공간을 둘 수 있을 겁니다. 위와 같이 나누면 되지만 일단 /, /usr, /home, swap, /boot 정도로 파티션을 나눠본다. 우선 /boot를 만든다. 이곳에는 시스템 부트에 관계되는 파일들이 있게 된다. 따라서, 이 부분은 가장 앞부분에 위치하도록 하는 것이 좋다. 만약 시스템에 윈도우즈 시스템에 있고 /boot가 1024 실린더 다음에 위치하게 되는 경우라면 이 파티션을 먼저 앞에 잡아 두고 다음에 윈도우즈용 파티션을 잡아 두는 것이 무리가 없다. 물론 lba32 옵션으로 lilo를 MBR에 설치할 수는 있지만 이것보다는 /boot 파티션을 앞에 잡아 두는 것이 더 편하다. 다음은 n 명령어로 파티션을 생성하는 것이다. 먼저 n 명령을 내린 다음, p로 primary 파티션으로 지정하고 파티션 번호를 지정한다. 이후에 시작 실린더 번호를 지정하고 마지막 실린더를 지정하거나 크기를 지정하면 된다. 다음은 /를 위한 두번째 파티션으로 300M를 잡아주는 모습이다. 파티션 편집이 모두 끝났다면 w 명령으로 설정을 저장하고 fdisk를 종료한다.
---------------------------------------------------------------------------------------
카페 > 리눅스 웹마스터 키우기 / 리눅서님
http://cafe.naver.com/k2linux/39
그러면 다음과 같은 도입 화면이 나올 것이다.
fdisk는 독자적인 명령어를 가지고 있다. 도움말을 원한다면 간단하게 m 명령어를 통해 얻을 수 있다. 그리고, 이 정보만 보고서도 충분히 파티션을 할 수 있을 것이다. 다음은 이 명령을 사용했을 때 나오는 명령에 대한 해설이다. a 부트 가능한 플래그로 변경 b bsd 디스크 레이블을 편집 c 도스 호환 플래그로 변경 d 파티션 삭제 l 알려진 파티션 형태의 목록 m 이 메뉴를 출력 n 새로운 파티션 추가 o 새로운 도스 파티션 테이블을 생성 p 파티션 테이블을 출력 q 변경을 저장하지 않고 종료 s 새로운 Sun 디스크 레이블을 생성 t 파티션의 시스템 id를 변경 u 표시/엔트리 단위를 변경 v 파티션 테이블을 점검 w 디스크에 테이블을 기록하고 빠져나감
이 명령어를 입력하면 fdisk는 Command(m for help): 라는 프롬프트를 보여주며 명령을 기다린다. m을 입력하면 다음과 같은 도움말을 볼 수 있다. 명령어를 전체적으로 외우기가 그렇게 쉬운 일만은 아니므로 이 명령어를 자주 사용하게 될 것이다.
선택한 디스크에 있는 기존의 파티션 현황을 보기 위해서는 p를 입력하면 된다. 만약 기존에 파티션이 있고 파티션을 새로 만들어야 한다거나 만들어야 할 파티션이 많은 경우에 파티션 상태를 확인하는데 사용된다. 만약 기존의 모든 파티션을 하나씩 없애고 싶다면 d 명령어와 함께 제거하고자 하는 파티션의 번호를 입력하면 된다.
e extended
p primary partition ( 1-4 )
Partition number (1-6) : 1
Partition number (1-8): [파티션 번호]
앞서 t 명령어를 사용할 때 시스템 id의 정보를 알아보기 위해서는 l 명령어를 사용한다.
다음에는 /, /usr, /home. swap를 위한 파티션을 차례로 잡아준다. swap의 경우에는 반드시 t 명령으로 시스템 id를 82번 swap으로 바꿔 주어야 한다.
다음은 /usr을 위한 파티션으로 2500M를 잡아주는 모습이다.
다음은 확장 파티션을 잡는 모습이다.
다음은 확장 파티션 아래에 swap 파티션으로 500M를 잡고 /home 파티션으로 남은 모든 공간을 잡은 모습이다.
다음은 p 명령어로 파티션 현황을 확인한 모습이다.
다음은 마지막으로 swap 파티션의 시스템 id를 82번으로 변경한 모습이다.
만약 윈도우즈 시스템이 있다면 swap 파티션을 윈도우즈 시스템과의 중간에 두거나 윈도우즈 시스템과 약간의 간격을 두고 파티션을 해주는 것이 안전하다. 파티션을 할 때 주의할 점의 하나는 윈도우즈 시스템의 FDISK에서 확장 파티션으로 잡은 도스용 파티션에 리눅스를 설치하지 말라는 것이다. 이 경우에 윈도우즈에서 리눅스 파티션이 보이면서 제대로 읽지 못해 시스템에 문제가 생길 수 있다.
블로그 > 세상이 끝나는날 까지 도전하자 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로 변경한다. ------------------------------------------------------------------------------- ------------------------------------------------------------------------------- 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]# _ |
아마 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 등, 정규표현식은 유닉스의 거의 모든 도구와 관련이 있습니다. 개인적으로 뼈아픈 경험뒤에 "멍청하면 손발이 고생한다"는 격언(?)의 적절한 예로 정규표현식을 꼽습니다.
불행히도 도구마다 정규표현식을 지원하는 정도가 조금 차이가 나지만 몇번 시도해보면 이 차이를 알 수 있습니다. 그러면 기본적이고 광범위하게 쓰이는 정규표현식부터 하나씩 알아봅시다.
기본적으로 정규표현식은 다음 세가지로 구별할 수 있습니다.
이제 MS-DOS의 *와 같이 특수한 의미를 가지는 문자들을 만나게 됩니다. 우리가 정규표현식을 배운다는 것은 이런 특수 문자들과 그들의 의미를 아는 것입니다.
우선 보통 알파벳과 숫자 등은 그 문자 그대로를 나타냅니다. 물론 대소문자는 서로 구별됩니다.
$ 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]는 그 자리에 T나 t가 나올 수 있음을 의미합니다. 이렇게 [와 ]안에 가능한 문자들을 적어줄 수 있습니다.
[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와 그 뒤의 한 문자는 찾았지만 그 뒤에 문자가 줄바꿈 문자이기 때문에 조건이 만족되지않기 때문입니다.
여기서는 *, ?, +을 다룹니다.
*는 바로 앞의 문자를 0번 이상 반복해도 됨을 나타냅니다. 예를 들어, abc*는
를 모두 만족합니다. 여기서 주의해서 볼 것은 "0번 이상"이기 때문에 마지막 경우와 같이 앞의 문자가 안나와도 된다는 것입니다. (그래서 MS-DOS의 *은 정규표현식으로 .*입니다.)
*와 비슷하게, ?는 앞의 문자가 없거나 하나 있는 경우를 나타내고, +는 앞의 문자가 1번 이상 반복하는 경우를 나타냅니다. 그래서 a+는 aa*와 같습니다.
이제 abc 모두를 반복하고 싶다면 어떻게 해야 되는지 의문이 듭니다. 이 경우 (, ) 괄호를 사용하여 문자들을 묶어주면 됩니다. 그래서 (abc)*는
를 모두 만족합니다. 마지막 예는 0번 반복한 경우로 어떤 문자도 없는 빈 경우입니다. 이제 앞에서 말한 "앞의 문자"라는 말을 정정해야 겠습니다. *, ?, +는 "앞의 문자"에 적용되는 것이 아니라 "앞의 단위"에 적용됩니다. 기본적으로 한 문자는 그 자체로 한 단위입니다. 그래서 abc*에서 *는 바로 앞 문자이자 단위인 c에 적용된 것입니다. 그러나 괄호로 문자들을 묶어서 단위를 만들 수 있고, (abc)*의 경우에 *는 앞의 단위인 abc에 적용된 것입니다.
여기서 다루는 ^, $, |는 앞에서와는 달리 특정 문자에 대응하지는 않지만, 위치나 결합의 중요한 기능을 합니다.
우선 ^는 줄의 처음을 뜻합니다.
$ 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 ...(생략)... $ |
정규표현식의 마지막 문자가 공백임을 주의하길 바랍니다. 만약 이 공백이 없다면 These나 themselves,로 시작하는 줄들도 찾게됩니다. 이렇듯 정규표현식을 적을 때는 자신이 찾길 원하는 부분을 빼먹거나, 자신이 원하는 부분 이외의 것을 포함하지 않도록 주의해야 합니다. 지금처럼 정규표현식을 입력하고 그 결과를 하나씩 살펴볼때는 문제가 없지만, 많은 경우 정규표현식은 스크립트로 많은 문서를 한꺼번에 처리할때 사용하기때문에 주의해야 합니다. 잘못 쓴 정규표현식때문에 원하는 결과를 얻지 못하는 것은 물론이고 원본까지 망치게 되는 경우가 있습니다.
^는 이렇게 [Tt]와 같이 특정 문자에 대응되지는 않지만 원하는 문자가 선택될 수 있게 도와줍니다. 반대로, $는 줄의 끝을 나타냅니다. 그래서 ^$과 같은 정규표현식은 빈 줄을 찾습니다.
|은 기호 앞뒤의 것 중 하나를 선택한다는 뜻입니다. 즉, 문서에서 this(This)나 that(That)을 찾는다면,
모두 가능합니다. 세번째와 네번째 경우에서 괄호의 기능을 알 수 있습니다.
아마도 지금쯤 ^이 두가지 의미로 쓰인다는 것이 이상해 보일 수도 있을 겁니다. 정규표현식에서 쓰이는 문자는 크게 일반문자와 특수문자로 나눠볼 수 있습니다. 여기서 특수문자란 앞에서 다룬 (순서대로) [, ], -, ^, ., *, ?, +, (, ), $, |과 같이 정규표현식에서 문자그대로의 의미로 해석되지 않는 문자들입니다. 반대로 특수문자가 아닌 문자는 일반문자로 G, N, U와 같이 문자그대로의 의미를 가집니다.
여기서 특수문자는 쓰이는 곳에 따라 다릅니다. 자세히 말하면, []안이냐 밖이냐에 따라 특수문자가 달라집니다.
우선 [] 밖에서는 -를 제외한, ^, ., *, ?, +, (, ), $, |이 특수문자입니다. 여기서 ^는 줄의 시작을 의미합니다.
그러나 [] 안에서는 -과 ^만이 특수문자이고, 다른 문자들은 일반문자가 됩니다. 즉, [*?+]는 반복이 아니라 문자그대로 *나 ?나 + 중 하나를 뜻합니다. [] 안에서 (제일 앞에 나오는) ^는 뒤에나오는 조건을 만족하지 않는 문자를 찾는다는 의미가 됩니다.
그렇다면 찾으려는 부분에 특수문자가 포함되있다면 어떻게 할까요? 예를 들어 what?이라는 물음표로 끝나는 문자를 찾고 싶다고, egrep 'what?' ...이라고 하면 ?이 특수문자이므로 wha를 포함한 whale도 찾게 됩니다. 또, 3.14로 찾을때는 3+14 등도 찾게 됩니다.
특수문자가 [] 안과 밖에서 다르다는 점을 생각하여 각각의 경우를 살펴봅시다. 우선 [] 밖의 경우는,
첫번째 방법은 보통 escape라고 부르며, 특수문자 앞에 \을 붙여서 특수문자의 특수한 기능을 제거합니다. 두번째 방법은 [] 밖의 많은 특수문자들이 [] 안에서는 일반문자가 되는 점을 이용한 것입니다. 보통 첫번째 방법을 많이 사용합니다.
주의할 점은 첫번째 방법에서 사용하는 \가 뒤에 나오는 특수문자를 일반문자로 만드는 특수문자이기 때문에, 문자 그대로의 \을 나타내려면 \\을 사용해야 합니다. 물론 [\]도 가능합니다.
[] 안의 특수문자는 위치를 바꿔서 처리합니다. 먼저, ^는 [^abc]와 같이 처음에 나와야만 의미가 있으므로 [abc^]와 같이 다른 위치에 사용하면 됩니다. -는 [a-z]와 같이 두 문자 사이에서만 의미가 있으므로 [-abc]나 [abc-]와 같이 제일 처음이나 마지막에 사용합니다.
(grep과 같이 도구에 따라 역으로 일반 문자앞에 \를 붙여서 특수문자를 만드는 경우가 있습니다. 아래 각 도구에 대한 설명 참고.)
고급이라고 제목을 붙였지만 여기서는 도구마다 차이가 나거나 없을 수도 있는 내용을 다룹니다.
반복하는 횟수를 자세히 조정할 수 있습니다.
물론 (abc){2,4}같이 괄호로 반복할 단위를 지정할 수 있습니다. 여기서 {, }도 *, ?, +와 같이 특수문자임을 주의하길 바랍니다. (엄밀한 의미에서 }은 특수문자가 아닙니다.)
앞에서 여러 문자를 묶어서 단위로 만드는 괄호는 정규표현식으로 찾은 부분을 기억하여 다른 곳에서 사용할때도 사용합니다. 예를 들어, HTML 제목 테그는 (egrep에서) <[Hh]([1-6])>.*[hh]\1>와 같이 찾을 수 있습니다. 여기서 ([1-6])의 (, )는 사이에 대응된 부분을 기억하여 (첫번째 기억된 내용을) \1에서 사용합니다. 즉,
(...)은 여러번 사용할 수 있고 (심지어 겹쳐서도), \n은 기억된 n번째 부분을 지칭합니다. 순서는 기억이 시작되는 (의 순서입니다.
여기에서는 (과 )이 특수문자이고, 그냥 \(와 \)는 일반문자이지만, 도구에 따라 반대인 경우도 있습니다.
이 기능은 또 치환에서 자주 사용됩니다. 아래 vi와 sed 부분을 참고하길 바랍니다.
앞에서 the를 찾으면 the 외에 them 등도 같이 찾는 것을 보았습니다. 그러면 정관사 the만 찾으려면 어떻게 할까요?
간단히 정규표현식 앞뒤에 공백을 추가한 the 를 생각해 볼 수 있습니다. 그러나 이 정규표현식에는 두가지 문제가 있습니다. 첫번째는 탭(tab) 등 다른 공백문자가 있기 때문입니다. 두번째는 이 정규표현식으로 the가 줄 제일 앞이나 제일 뒤에 나오는 경우는 찾지 못하기 때문입니다. 물론 [], ^, $와 |를 복잡하게 결합하여 이들 경우를 모두 처리할 수 있는 정규표현식을 쓸 수 있지만, 자주 사용하는 표현이기 때문에 간단히 할 수 있는 방법이 마련되있습니다.
그것은 \<과 \>로, \<은 공백에서 공백이 아닌 문자 사이, \>는 공백이 아닌 문자에서 공백 사이의 위치를 나타냅니다. 즉, ^나 $와 같이 문자에 해당되지않고 위치만을 나타냅니다. 이제 해답은 \
정규표현식에는 이외에도 자주 사용되는 표현에 대한 단축된 형식을 제공합니다. 예를 들어, vim에서 \i는 (C 언어 인식자 이름에서 사용하는 문자인) [_a-zA-Z0-9]와 같습니다. 그러나 이런 단축된 형식은 도구에 따라 많은 차이가 나기때문에 관련 문서를 참고하길 바랍니다.
POSIX.2에서 정의한 단축 표현은 다음과 같습니다. (C 언어에서
정규표현식이 패턴을 찾는 과정을 시각적으로 보여주는 프로그램들이 있습니다.
이제 이런 정규표현식을 실제로 어떻게 사용하는지 알아봅시다. 평소에 많이 사용하는 vi, grep/egrep/fgrep, sed/awk의 예를 들어보겠습니다.
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같은 기능이 있습니다.
"수정자"는 치환 명령의 세부사항을 결정합니다. 필요한 것만 뒤에 적어주면 됩니다.
마지막으로 주의할 점은 치환명령어가 / 문자로 각 부분을 구분하기때문에 "변경전"이나 "변경후"에 / 문자를 사용하려면 \/ 같이 써야합니다. 필요하다면 / 대신 다른 문자를 사용해도 됩니다. 예를 들어, :%s/\/usr\/local\/bin\//\/usr\/bin\//g 대신 :%s#/usr/local/bin/#/usr/bin/#g가 알아보기 더 쉽습니다.
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은 ?, +, {, |, (, )를 일반문자로 보기때문에 특수문자로 사용하려면 앞에 \를 붙여야 합니다.
thegrendel (at) theriver.com
차례
출처 : http://wiki.kldp.org/HOWTO//html/Adv-Bash-Scr-HOWTO/index.html
http://blog.naver.com/misadamo.do?Redirect=Log&logNo=80001904458
블로그 > 몽크 http://blog.naver.com/machoon/40003720775 | |||||||||||||||||||||||||
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 3. tcpdump 플래그(flags)
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 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 |
카페 > CrazyJava / 플그래머님 http://cafe.naver.com/autocrat/75 | ||||||||||||||||||||
Vi 사용하기Vi 시작하기
커서의 이동
편집 버퍼를 통한 이동
행 단위 이동
삽입명령어
삭제명령
파일의 저장 및 종료
내용의 복사 및 이동
내용 고치기
명령 취소 및 반복
행 번호 설정 및 화면표시
시스템이 다운된 후에 파일 되살리기
다른 파일을 파일 내로 삽입
새로운 파일 편집하기
다중 편집하기
혹은 :e file1 file2 file3 했을 때,
문자열 탐색
치환vi에서 치환은 정규표현식이 이용된다. (실제로 이 상태에서 실행하는 명령어는 ed나 ex라는 프로그램이 처리하게 된다. 그래서 보통 이 상태를 "ed-모드"라고 한다.) 문서에서 원하는 패턴을 찾으려면 바로 위에 '문자열 탐색'에서 설명된 바와 같이 /문자열 이나 ?문자열 을 사용한다. 문자치환 명령은 다음과 같다. [형식] :범위s/변경전/변경후/수정자 '범위'는 명령이 실행될 범위(예: 10,20 이면 10행 부터 20행 까지)를 나타낸다. 's'는 치환(substitute)의 약자이며 '수정자'는 치환 명령의 세부사항을 결정한다. 필요한 것만 뒤에 적어주면 된다. (중복 가능)
"변경전"과 "변경후"에 치환할 내용을 입력한다. "변경전"에 정규표현식을 적는다. 정규표현식으로 ., *, ^, $, [], \(...\), \<...\>, POSIX.2 단축 표현을 사용할 수 있다. 여기서 여러 문자를 묶여서 단위를 만들고 찾은 내용을 기억하는 특수문자가 \(, \)임을 주의해야 한다. 반대로 (, )가 일반문자이다. vim(VI iMproved)에서는 vi에 추가로 |, +, (?와 같은) =, {n,m}을 사용할 수 있지만, 앞에 \ 를 붙여야 한다. 또, vim에는 \i, \k, \p, \s 등의 단축 표현들이 있다. "변경후"에 \n 과 & 를 사용할 수 있다. \n 는 "변경전"에서 n번째 \(...\) 에 대응하는 부분이고, & 는 "변경전"에 만족한 전체를 나타낸다. 예를 들어,
:%s/^M//g - 파일 전체(g)에서 ^M 을 삭제. ^M은 Ctrl+V+Enter로 입력한다. :s/aaa/bbb/ - 현재 행에서 'aaa'을 'bbb' 로 치환 :1,10 s/aaa/bbb/ - 1행부터 10행 까지 'aaa'을 'bbb' 로 치환 :1,. s/str/rep/ - 1부터 현재행까지 'aaa'를 'bbb' 로 전부 바꾸기 :g/감자/s//바위/gc - 각 발생 확인 후 대체 주의할 점은 치환명령어가 / 문자로 각 부분을 구분하기때문에 "변경전"이나 "변경후"에 / 문자를 사용하려면 \/ 같이 써야한다.
아래 웅자꺼를 쓸려면 프로그래밍 코딩 시 해당 코드가 활성화 되지 않는다. 이유는 vim 버전이 라이트버전이라서 기본적인 기능들만 포함되어져 있다. $ sudo apt-cache search vim-full $ sudo apt-get install vim-full $ vi .vimrc syntax on 추가하면 된다. 웅자가 쓰는 vimrc. set nocompatible " VI 오리지널과 호환하는 모드를 사용하지 않음(VIM확장) set number " 라인번호를 붙임 set backspace=indent,eol,start " BS로 라인끝과 처음 자동들여쓰기한 부분을 지날수 있음 set tabstop=4 " 탭문자는 4컬럼 크기로 보여주기 set shiftwidth=4 " 문단이나 라인을 쉬프트할 때 4컬럼씩 하기 set autoindent " 자동 들여쓰기 set visualbell " Alert 음을 화면 깜박임으로 바꿔보여주기 set laststatus=2 " 최종상태 2개 기억하기 set statusline=%h%F%m%r%=[%l:%c(%p%%)] " 상태표시줄 포맷팅 set hlsearch " / ? 명령 등으로 찾은 문자열을 하일라이트 해준다. syntax on " 적절히 Syntax에 따라 하일라이팅 해주기 set background=dark " 이건 터미널 모드에선 영향이 없다. set hi=1000 "명령어 기록을 남길갯수 지정 set hlsearch " / ? 명령 등으로 찾은 문자열을 하일라이트 해준다. set bs=indent,eol,start " 백스페이스 사용 set ru " 커서의 위치를 항상 보이게 함. set ts=8 "탭 길이 set sts=4 "들여쓰기 탭 간격 set sw=4 " 들여쓰기 탭 간격 set noet " 탭 -> 공백 변환 기능 (사용 안함) set sol "여러가지 이동 동작시 줄의 시작으로 자동 이동 set hls "검색어 강조 기능 set scs "똑똑한 대소문자 구별 기능 사용 imap <F2> <C-X><C-O> map <F3> :set paste<CR> map <F4> :set nopaste<CR> vmap <F5> :norm i// i;<CR> vmap <F6> :norm xx<CR> vmap <F9> zf map <F10> zo map <F11> zc map <C-b> :tabprevious<CR> map <C-n> :tabnext<CR> map <F12> :tabnew<CR>:e .<CR> |
블로그 > maxoverpro 블로그 http://blog.naver.com/maxoverpro/140008222477 | |
/etc/rc.d/rc3.d/S22nospoof에 위치시키고 방화벽 또는 라우터에 설치 /etc/rc.d/init.d/S22nospoof로 연결 #/bin/sh #Turn on Source Address Verification on all interface if [ -e /proc/sys/net/ipv4/conf/all/rp_filter ]; then echo -n "Enabling IP spoofing blocking..." for f in /proc/sys/net/ipv4/conf/*/rp_filter; do echo 1 > $f done echo "done" else echo "ERROR : CANNOT SET UP IP SPOOF BLOCKING!" sleep 30 fi |
0