Search Results for '프로그래밍'


1208 posts related to '프로그래밍'

  1. 2010/06/01 yum을 이용한 시스템 업데이트
  2. 2010/06/01 콘솔모드 또는 X윈도우로 부팅하기
  3. 2010/06/01 웹호스팅 사용자용 계정관리 스크립트
  4. 2010/06/01 리눅스 명령어 (역시나 필요한 사람이 있을까 해서..)
  5. 2010/06/01 개발자 PC에서의 백업파일 관리
  6. 2010/06/01 끊김없이 네임서버 이전(교체)하기
  7. 2010/06/01 MySQL 백업용 쉘스크립트입니다.
  8. 2010/06/01 vi 에디터에서 창 나누기
  9. 2010/06/01 메일서버에서의 스펨메일 운영 방안(고급) 3
  10. 2010/06/01 jQuery 에서 jsonp 이용하여 다른도메인에 데이터 보내기
  11. 2010/06/01 MSSQL Query 달력
  12. 2010/06/01 iframe resize 함수
  13. 2010/06/01 구글맵처럼 큰 이미지를 분할해서 보는 자바스크립트
  14. 2010/05/18 Adobe Flash Builder 4 3
  15. 2010/05/03 Source2Html v1.0
  16. 2010/05/02 초간단 XMPP 트위터 봇
  17. 2010/04/27 xmpp 개요
  18. 2010/04/27 공개 채팅서버 OpenFire 설치 XMMP 1
  19. 2010/04/14 windows 서버에 파일질라 보안 ftp 서버 ( filezilla secure ftp server ) 설치하는 법 3
  20. 2010/04/14 윈도우 웹로그 분석
  21. 2010/04/14 인터넷슈퍼데몬(xinetd)
  22. 2010/04/14 JSP CENT OS 5 세팅법 |
  23. 2010/04/14 qmail 설치 |
  24. 2010/04/14 리눅스 iptables 사용법 1
  25. 2010/04/14 리눅스 iptables 중지하고자 할때
  26. 2010/04/12 아웃룩 익스프레스 (Outlook Express) 시스템에서 삭제하기 1
  27. 2010/04/08 [스크립트] 스크립트 한 줄로 IE6 죽이기
  28. 2010/04/01 Windows cmd 명령어 모음 .
  29. 2010/03/30 PHP 리다이렉션 페이지 이동 - 3가지 방법 1
  30. 2010/03/30 한개의 호스팅으로 여러개 홈피 동시운영! 1
yum을 이용한 시스템 업데이트
 
1. yum ?
yum은 rpm기반 시스템에서 자동으로 패키지를 업데이트, 설치, 삭제를 해주는 유틸리티입니다.
업데이트는 알려진 문제를 해결하고 알려진 보안 위협으로부터 서버를 보호하는 데 도움을 줍니다.

rpm의 의존성 문제를 자동적으로 처리하여 쉽게 패키지를 유지 관리할 수 있습니다.
또한 쉽게 레드햇의 release도 변경할 수 있습니다. fedora project에는 기본적으로 내장되어 있습니다 :)
현재 레드햇은 updates.redhat.com등에서 RHEL과 Fedora Project를 제외하고 RedHat의 모든 버전의 업데이트가 중지되고 있습니다. (RedHat 7.3은 2003년 12월 말부터, RedHat 9는 2004년 4월부로 공식지원이 중단됨)
RHN은 회원가입의  번거로움과 기능의 단순함, 막대한 비용에 대한 부담으로 실증을 느끼셨다면 yum을 이용해 보시기 바랍니다.

스마일서브에서는 Redhat 7.3, 9.0, Fedora Core1을 공식 지원하고 있습니다.


1-1. 설치전 확인 사항
  # cat /etc/redhat-release
    에서 자신의 release에 맞는 yum을 설치한다.
  다운로드 사이트는 smileserv.com yum repository 서버를 이용하시기 바랍니다.
  http://mirror.smileserv.com/yum_binary/
 
1-2. 설치
  http://mirror.smileserv.com/yum_binary/ 에서 자신의 redhat-release와 맞은 디렉토리에서 다운로드한 yum rpm을 설치합니다.
  # rpm -Uhv yum*.rpm
1-3. 기본 사용법
  최신 패키지로 업데이트
  # yum update
  패키지 설치
  # yum install 패키지명
  패키지 업데이트
  # yum update 패키지명
  패키지 삭제
  # yum remove 패키지명
  패키지 검색
  # yum search 패키지명
 
1-4. yum을 이용한 레드햇 release upgrade
  ftp://ftp.quicknet.nl/pub/Linux/ftp.redhat.com/
  에서 업그레이드 하고 싶은 버전의 redhat-release***.rpm을 받아서 설치
  # yum upgrade

2. 실제 적용방법
 
 
[root@mirror root]# cat /etc/redhat-release
Red Hat Linux release 7.3 (Valhalla)
현재 시스템에는 RedHat Linux 7.3이 설치되어 있다.

RedHat Linux 7.3을 위한 yum rpm 패키지를 다운로드 받아 설치한다.
[root@mirror root]# wget http://mirror.smileserv.com/yum_binary/redhat7.3/yum-1.0.3-6.0.7.x.legacy.noarch.rpm
[root@mirror root]# rpm -Uhv yum-1.0.3-6.0.7.x.legacy.noarch.rpm

yum repository가 smileserv.com 인지 체크한다.
  [root@mirror root]# cat /etc/yum.conf
  [main]
    cachedir=/var/cache/yum
    debuglevel=2
    logfile=/var/log/yum.log
    pkgpolicy=newest
    #exactarch=1
    #exclude=kernel*
    [base]
    name=Red Hat Linux 7.3 base
    baseurl=http://mirror.smileserv.com/redhat/7.3/os/i386/

    [updates]
    name=Red Hat Linux 7.3 updates
    baseurl=http://mirror.smileserv.com/redhat/7.3/updates/i386/
yum rpm 패키지가 정상적으로 설치됐음이 확인되었습니다.

* fedora core 1(x86 32bit) 이용 고객님께서는 아래 URL에서 yum 을 받아 설치하세요.
  http://mirror.smileserv.com/yum_binary/fedora_Core1/

설치된 모든 패키지에 대한 업데이트를 시작합니다.
    [root@mirror root]# yum update
    이후 hdr 파일을 다운로드 후 현재 시스템에 설치된 rpm 패키지와 버전 체크를 한 후 업데이트가 필요한 패키지 리스트가 출력됩니다. 업데이트를 위해서는 y 를 입력하시면 됩니다.
   
    열거된 rpm 리스트에 따라서 rpm을 다운로드 합니다. 이 후 다운로드된 rpm이 설치되며 업데이트 후에는 리부팅을 하시면 시스템에 적용됩니다.
   
    ntsysv에 yum을 check on 해두면 자동으로 시스템의 패키지들이 업데이트됩니다. 업데이트된 리스트는 /var/log/yum.log 에 남습니다.

  안타깝게도 fedoralegacy.org에서는 더 이상 redhat 7.2, redhat 8.0에 대한 지원은 중단되었습니다.
2010/06/01 12:11 2010/06/01 12:11
콘솔모드 또는 X윈도우로 부팅하기

리눅스 부팅시에 콘솔모드 또는 X윈도우모드로 부팅을 하고 싶다면 여러분은.. 어떻게 하시는지요.

/etc/inittab에서 제어를 하실수 있습니다.

만약 5번모드로 (즉 X윈도우로 부팅한다면) 부팅을 원한다면

vi /etc/inittab 로 파일을 열고

아래의 파일 부분을 변경해주시면 됩니다.

# Default runlevel. The runlevels used by RHS are:
# 0 - halt (Do NOT set initdefault to this)
# 1 - Single user mode
# 2 - Multiuser, without NFS (The same as 3, if you do not have networking)
# 3 - Full multiuser mode
# 4 - unused
# 5 - X11
# 6 - reboot (Do NOT set initdefault to this)
#
id:3:initdefault: <-- 이부분의 숫자를 변경해주시면 됩니다. (현재는 콘솔모드입니다.)

ex) id:5:initdefault:

위와 같이 하시면 X윈도우로 부팅이 됩니다.
2010/06/01 12:07 2010/06/01 12:07
웹호스팅 사용자를 위한 스크립트를 짜봤습니다.

주요기능
① 계정(SSH/Telnet) 암호 변경
② 계정(HDD) 사용량 조회
③ 계정(HDD) 백업
④ 데이타베이스(MySQL) 암호변경
⑤ 데이타베이스(MySQL) 백업
⑥ 데이타베이스(MySQL) 복구
⑦ 데이타베이스(MySQL) 초기화
⑧ 알지보드설치
⑨ 제로보드설치

태터툴즈 자동설치 기능도 넣었지만 허락을 받지 못해 일단 메뉴에서만 제외 되어 있습니다.
제로보드도 문제가 될지....
보시고 많은 조언 부탁 드립니다.
파일은 위 링크에 있습니다.
2010/06/01 10:09 2010/06/01 10:09
addbib - 도서목록 형식의 데이터베이스를 만들거나, 확장
apropos - 사용설명서의 키워드 검색
ar - 라이브러리 만들기, 관리
at, batch - 원하는 시간에 원하는 명령을 실해하게 하는 명령
awk - 패턴 검색과 언어 처리
banner - 큰 글자(배너) 만들기
basename - 경로 이름에서 마지막에 있는 이름만 출력
biff - 자신에게 편지가 배달되면 알려주는 명령
bin-mail, binmail - 예전에 사용한 전자우편 프로그램
cal - 달력보기
calendar - 간단한 일정표
cat - 파일 병합과 내용 보기
cb - 간단한 C 프로그램 beautifier(?)
cc - C 컴파일러
cd - 작업 디렉토리 바꾸기
checknr - nroff 또는 troff 입력 파일 검사; 오류를 보여준다
chgrp - 파일의 사용자 그룹 바꾸기
chmod - 파일의 접근 권한 바꾸기
clear - 터미날 화면 깨끗이 하기
cmp - 두 파일을 바이트 단위로 비교
colcrt - troff 파일의 밑줄 속성 문자 처리
comm - 지정 두파일의 줄 단위 비교와 그 처리
compress, uncompress, zcat - 파일 압축관련 유틸리티들
cp - 파일 복사
cpio - copy file archives in and out
cpp - C 언어 전처리기
csh - C 문법과 비슷한 쉘 스크립트 문법과 기타 여러 기능이 내장된 쉘
ctags - ex 나 vi 편집기에서 사용될 tag 파일을 만드는 명령
date - 시스템 시간 보기나 지정하기
dbx - 소스 수준의 디버거
deroff - nroff, troff, tbl, eqn 관련 내용 지움
df - disk free: 디스크의 남은 용량 보기
diff - 두 파일의 차이점 비교
du - disk used : 디스크 사용량 보기
echo - 인자를 표준 출력으로 출력
ed, red - 기본 줄 편집기
eqn, neqn, checkeq - 수식 표현 포멧 도구
error - 컴파일러 오류 메시지 목록
ex, edit, e - 줄 편집기
expand, unexpand - TAB 문자를 공백문자로 바꿈, 또는 그 반대로
expr - 인자를 수식으로 처리
file - 파일 형식 알아보기
find - 파일 찾기
finger - 사용자 정보 알아보기
fmt, fmt_mail - 간단한 문서나, 편지 포멧 도구
fold - 긴 줄 출력 방법 지정
ftp - 파일 전송 프로그램
gcore - 실행 중인 프로세스의 core 이미지를 구한다.
gprof - call-graph profile data(?)를 보여줌
grep - 문자열 찾기
groups - 사용자의 그룹을 보여줌
history - 이전 명령 보기
hostname - 현재 시스템 이름을 보여줌
imake - makefile 만드는 프로그램
indent - C 프로그램 소스 파일을 들여쓰기 하는 포멧 도구
install - 파일 설치
join - 관계형 데이터베이스 연산자
kill - 프로세스 죽이기 - "마누라 죽이기"와 상관없음 :-)
last - 사용자가 마지막 접속 상태를 보여줌
ld, ld.so - 링크 편집기, 동적 링크 편집기
leave - 자신의 접속 종료 시간을 알려줌
less - more 명령의 확장
lex - 어휘 분석 프로그램 생성기
lint - C 프로그램 verifier
ln - 파일의 하드, 심벌릭 링크 명령
login - 시스템 접속 명령
look - 시스템 디렉토리나, 정열된 목록에서 단어 찾기
lookbib - 도서목록형 데이타베이스에서 찾기
lorder - 오브젝트 라이브러리의 관계 찾기
lp, cancel - 인쇄 시작, 취소
lpq - 인쇄 작업 상황 보기
lpr - 인쇄
lprm - 인쇄 작업 지우기
ls - 디렉토리 내용 보기
mail, Mail - 전자 우편 프로그램
make - 실행 파일을 만들거나, 특정 작업 파일을 만들 때 사용하는 도구
man - 온라인 사용자 설명서를 보는 명령
mesg - 메시지 수신 상태를 보거나 지정
mkdir - 디렉토리 만들기
mkstr - C 소스 파일을 참조로 오류 메시지 파일을 만듬.
more, page - 텍스트 파일 보기 명령
mv - 파일 이동이나, 이름 바꾸기
nawk - 패턴 검색과 언어 처리
nice - 낮은 우선권에서 명령 실행
nm - 심블 이름 목록 보기
nroff - 문서 포멧 도구
od - 8진수, 10진수, 16진수, ascii 덤프
passwd, chfn, chsh - 비밀번호, 핑거정보, 쉘 바꾸기
paste - 여러파일의 서로 관련 있는 줄 연결시키기
pr - 문서 파일 양식화 도구
printenv - 현재 환경 변수들의 내용과 그 값 알아보기
prof - profile 자료 보기
ps - 현재 프로세스 정보 보기
ptx - permuted(순열화된?, 교환된?) 색인 만들기
pwd - 현재 작업 디렉토리 보기
quota - 한 사용자에게 지정된 디스크 할당량보기
ranlib - archive를 random 라이브러리로 변화
rcp - 리모트 카피
rcs - RCS 파일 속성 바꾸기
rcsdiff - RCS revisions 비교
rev - 한 줄의 문자열 꺼꾸로
rlogin - 리모트 로그인
rm, rmdir - 파일, 디렉토리 지우기
roffbib - 도서목록형 데이터베이스 보기 또는 양식화
rsh - 리모트 쉘
rup - 로칼 머쉰의 호스트 상태 보기(RPC version)
ruptime - 로칼 머쉰의 호스트 상태 보기
rusers - 현재 접속자 보기 (RPC version)
rwall - 모든 사용자에게 알림(RPC)
rwho - 현재 접속자 보기
sccs - Source Code Control System (SCCS)
sccs-admin, admin - SCCS 사용 내역 파일을 만들고, 관리
sccs-cdc, cdc - SCCS 델타의 델파 주석을 바꿈
sccs-comb, comb - SCCS 델타 조합
sccs-delta, delta - SCCS 파일에 데해 델타를 만듬
sccs-get, get - SCCS 파일 버전확인
sccs-help, help - SCCS 오류나 경고 메시지 검색
sccs-prs, prs - SCCS 사용내역의 선택된 부분 보기
sccs-prt, prt - SCCS 파일에서 델타 테이블 정보를 봄
sccs-rmdel, rmdel - SCCS 파일에서 델타를 지움
sccs-sact, sact - SCCS 파일의 편집 상태를 봄
sccs-sccsdiff, sccsdiff - SCCS 파일들의 버전 비교
sccs-unget, unget - SCCS 파일의 미리 얻은 것(?)을 취소한다.
sccs-val, val - SCCS 파일 유요화
script - 화면 갈무리
sed - stream editor
sh - 유닉스 표준 쉘
size - 오브젝트 파일의 크기들을 보여줌
sleep - 지정한 시간 만큼 실행 보류
sort - 줄 정열과 검색
sortbib - 도서목록형 데이터베이스 정열
spell, hashmake, spellin, hashcheck - 맞춤범 검사(물론 영어겠지요)
split - 파일 나누기
strings - 오브젝트 파일이나, 실행 파일에서 문자열 찾기
strip - 오브젝트 파일에서 심벌 테이블과 중복된 비트 삭제
stty - 터미날 설정
su - super-user, 임시적으로 새 ID로 바꿈
symorder - 심벌 순서 바꿈
tabs - 터미날 tab 크기 지정
tail - 파일의 끝 부분 보기
talk - 다른 사용자와 이야기하기
tar - 여러 파일 묶기 또는 묶긴 파일 풀기
tbl - nroff 또는 troff의 도표 작성 도구
tee - 표준 출력으로 방향 전환
telnet - TELNET 프로토콜을 이용한 원격 리모트 호스트 접속
test - 주워진 환경이 참인지, 거짓인지를 돌려줌
tftp - 간단한 ftp.
time - 명령 실행 시간 계산
touch - 파일 날짜 관련 부분을 바꿈
troff - 문서 양식화 도구
true, false - 쉘 스크립트에서 사용되는 참/거짓을 리턴하는 명령
tsort - topological sort
tty - 현재 터미날 이름 보기
ue - MICROemacs
ul - 밑줄 속성 문자 표현
unifdef - cpp 입력 줄에서 ifdef 부분 바꾸거나 지움
uniq - 중복되는 빈줄 지우기
units - 프로그램 변환도구
uptime - 시스템 부팅 기간 보기
users - 현재 접속 사용자 보기
uucp, uulog, uuname - 시스템 간의 복사
uuencode, uudecode - 이진 파일을 아스키파일로 인코딩, 반대로 디코딩
uusend - 리모트 호스트에 파일 보내기
uux - 리모트 시스템 명령 실행
vacation - 자동으로 편지 답장하기
vgrind - grind nice program listings
vi, view, vedit - ex 바탕의 편집기
vtroff - 문서 양식화 도구
w - 현재 누가 접속해 있으며, 무엇을 하고있는지
wait - 프로세스가 마치기를 기다림
wall - 모든 사용자에게 알림
wc - 단어, 줄, 바이트 계산
what - 파일에서 SCCS 버전 정보 알아냄
whatis - 명령의 간단한 설명 보여줌
whereis - 찾는 명령의 실행파일, 소스, 맨페이지가 어디 있는지 경로를 보여

which - 명령만 찾음.
who - 시스템에 접속되어 있는 사람만 보여줌
whoami - 현재 사용하고 있는 자신이 누군지 보여줌
write - 다른 사용자의 화면에 특정 내용을 알림
xargs - 명령행 인자 처리 명령
xstr - extract strings from C programs to implement shared strings
yacc - yet another compiler-compiler: 파싱(형태소분석) 프로그램 생성기
yes - 항상 yes만 응답하는 명령
zcat - 압축 파일 내용보기
2010/06/01 10:06 2010/06/01 10:06

프로그래머든지...
디자이너든지...
편집기를 사용한다면 백업파일은 반드시 저장하도록 설정해 두어야 합니다.

작업도중 정전이나 프로그램 다운등의 갑작스런 사고가 발생하였을때
백업파일을 열어 보면 작업중이었던 문서를 다시 찾을수 있을테니까요...

그런데 문제는 백업파일마저도 계속해서 오버라이트가 되다보면
어제의 문서...또는 몇일전의 문서는 되찾을 수 없습니다.

그렇기 때문에...
아래와 같은 배치파일을 사용하여 백업폴더를 날짜별로 다시 백업 해둘 필요가 있겠죠...

md "D:\일일백업경로\%date%"
move /Y "D:\백업경로\*.*" "E:\일일백업경로\%date%"


위의 스크립트대로라면...
현재의 날짜를 이용하여 일일백업을 위한 경로를 생성하고...
원래의 백업경로의 파일을 일일백업경로로 이동합니다.

이런 배치파일은...
시작프로그램에 등록해 두면 간단하게 컴퓨터를 부팅할때마다 백업을 할수 있습니다.

또한 작업스케줄러에 등록을 해둔다면 주간이나 월간 백업을 따로 보관할 수도 있겠죠...
그리고 백업시에 pkzip.exe등을 이용하여 압축하여 저장 할수도 있을 것 입니다...

윈도우용으로 crontab같은 유틸이 있다면...
몇분 간격이나 몇시간 간격으로 백업도 가능하겠죠;;;

덧 붙이자면 지저분한 바탕화면을 정리하시기 귀찮으신 분들도...
이런 간단한 스크립트하나만 스케줄러에 등록해주시면...
뭐 몇일마다 바탕화면을 청소하는 수고를 덜 수도 있겠죠...



별얘긴 아니지만...
오늘 오전에 백업을 해두지 않은 상태로 디자이너가 파일을 오버라이트 하는 바람에 전날 작업 다 날려버린 프로그래머의 절규를 들었기에....
이렇게 올려 봅니다...



다음은 바탕화면의 내용을 E:\backup\desktop\2004-06-30 과 같은 경로에 백업하는 배치파일 입니다.
C:\Documents and Settings\navyism\Desktop은 제 로그인계정의 바탕화면 폴더인데...
navyism만 쓰시는것으로 변경하시면 됩니다.
물론 백업하려는 폴더의 경로가 다르다면...
E:\backup\desktop를 잘 수정하셔야 하며....설정된 폴더는 미리 생성해 주셔야 합니다.

아래 내용을 메모장에 붙여넣기 한후에...
desktopBackup.bat과 같이 확장자가 bat인 파일로 저장하신후에
시작프로그램에 넣어 주시면 됩니다.


md "E:\backup\desktop\%date%"

xcopy /Y /E /R /H /Z "C:\Documents and Settings\All Users\Desktop\*.*" "E:\backup\desktop\%date%"
xcopy /Y /E /R /H /Z "C:\Documents and Settings\navyism\Desktop\*.*" "E:\backup\desktop\%date%"

xcopy /Y /E /R /H /Z "C:\Documents and Settings\All Users\Desktop\*.*" "E:\backup\desktop\%date%"
xcopy /Y /E /R /H /Z "C:\Documents and Settings\navyism\Desktop\*.*" "E:\backup\desktop\%date%"

del /F /S /Q "C:\Documents and Settings\All Users\Desktop\*.*"
del /F /S /Q "C:\Documents and Settings\navyism\Desktop\*.*"

rd /S /Q "C:\Documents and Settings\All Users\Desktop"
rd /S /Q "C:\Documents and Settings\navyism\Desktop"

md "C:\Documents and Settings\All Users\Desktop"
md "C:\Documents and Settings\navyism\Desktop"

2010/06/01 10:05 2010/06/01 10:05
1. 서버이전 하루전에 전체 도메인 TTL값을 3600 정도로 맞춰줍니다. (아마도 86400로 되어있을듯)
-> zone파일 일괄변경 : 해당 디렉토리에서 ls | xargs perl -pi -e 's/86400/3600/'

2. 이전할 서버에 zone파일을 모두 백업하고. 위와 같이 IP정보를 일괄 변경해줍니다.

3. 이전할 서버의 IP가 정상적으로 질의응답하는지 테스트합니다.
->nslookup
->server 신규서버IP
->test.com

4. ns.domain.com ns2.domain.com의 호스트 정보를 변경하여 줍니다.

5. domain.com의 네임서버를 변경하여 줍니다.

6. 하루이상 모니터링하시고... 여러 도메인 질의해보시고 기존 서버를 내리시면 됩니다

TTL값 조정후 하루지난 후 TTL값이 동일하게 적용됬는지.. 질의해보시고.. 이전하시기 바랍니다. 호스트정보 변경도 잊지마시구요..
2010/06/01 10:00 2010/06/01 10:00
/etc/cron.daily 에 파일을 만들어 두거나

crond 에 등록해서 사용하시면 됩니다.

[기능요약]

1.root 계정으로 전체 디비를 디비별로 백업 가능함
2.옵션으로 테이블 별 백업 가능함.
3.보존 설정 기간 이후 자동 삭제

--------------------------------------------source----------------------------------------------------------

#!/bin/sh

############################################################################
#
# By 질주본능 2009/06/03
#
#    V 2.0
#
# 데이터 베이스별 혹은 테이블 별로 백업 받을 수 있도록 변경했으며
# 30 LINE 에 명기된 배열에 속하는 디비들만 테이블 별로 백업 받는다.
#
# 데이터베이스 단위로 받은 파일은 DB. 으로 시작하고
# 테이블 단위는 TB. 으로 시작하는 파일명을 갖는다.
#
# 백업 파일은 dump.gz 로 형성 되며 설정된 보존 기간이 지나면 자동 삭제 된다.
#
#############################################################################

##### SET VARIABLES ############ 전체를 백업 받으려면 여기에 root 계정을 입력한다.
DBHOST="yourhost"
DBUSER="yourid"
DBPWD="yourpassword"

#백업 경로
BACKUPDIR="/home/your_backup_dir/"
#로그 작성 경로
LOGDIR="/home/your_backup_log_dir/"
#로그 파일 앞에 붙을 특정 텍스트
LOGNAME="log_"

###### SET DB NAMES which BACKUP by TABLES ###### 여기 표시된 DB 들은 테이블 별로 백업된다.
DB_TBARR=(dbname1 dbname2 dbname3)

#백업 옵션을 원하는 대로 설정
#routine 옵션은 5버전 이상에서만 사용(function 등을 백업함)
OPTIONS="--skip-comments --default-character-set=euckr --routines"

##### SET CHARGE LIMIT ########## 백업 파일 저장 기간(일단위)
CHARGE_LMT=3

##### DELETE OLD_BACKUP FILES #######
find ${BACKUPDIR} -name "*.gz" -mtime +${CHARGE_LMT} -exec rm -rf {} \;

##### START LOG CREATE ##########
YMD_S=`date +%Y%m%d%H%M%S`
touch ${LOGDIR}${LOGNAME}${YMD_S}.start

##### DB LIST GET ###############
#IF YOU WANT TO EXCEPT SOME DATABASE ADD THIS
#grep -v Database | grep -v somename | grep -v somename`
#

#grep -v dbname 하면 백업 시 제외 된다.

RESULT=`mysql -u$DBUSER -p$DBPWD -h$DBHOST -e "show databases" | grep -v Database`

for DB in $RESULT; do

    sw=0
    ##### compare DB to TBARR #####
    for i in ${DB_TBARR[@]}; do
        if [ $i = $DB ]; then
            let "sw=sw+1"
        fi
        done

    if [ $sw = 0 ]; then
        # BACKUP by DB
        FNAME=${BACKUPDIR}DB.${DB}_${YMD_S}.dump
        #echo $FNAME
        touch $FNAME
        echo "set foreign_key_checks=0;" >> $FNAME
        mysqldump -u$DBUSER -p$DBPWD -h$DBHOST $OPTIONS $DB >> $FNAME
        echo "set foreign_key_checks=1;" >> $FNAME
        gzip --rsyncable $FNAME

    else
        # BACKUP by TABLES
                RESULT_TB=`mysql -u$DBUSER -p$DBPWD -h$DBHOST $DB -e"show tables" | grep -v heap | grep -v Tables_in `
                for TB in $RESULT_TB; do

                        FNAME=${BACKUPDIR}TB.${DB}.${TB}_${YMD_S}.dump
            #echo $FNAME
            touch $FNAME
            echo "set foreign_key_checks=0;" >> $FNAME
            mysqldump -u$DBUSER -p$DBPWD -h$DBHOST $OPTIONS $DB $TB >> $FNAME
            echo "set foreign_key_checks=1;" >> $FNAME
            gzip --rsyncable $FNAME

                done        
    fi

done

##### END LOG CREATE ###########
YMD_E=`date +%Y%m%d%H%M%S`

touch ${LOGDIR}${LOGNAME}${YMD_E}.end
2010/06/01 09:58 2010/06/01 09:58
모니터가 16:9 길죽한 거니까
창을 세로로 나누어서 쓰니까 편하군요..
..
vi 에디터에서

ctrl + w  v  하면 수직 창이 나누어진다.
ctrl + w  s 는 수평나누기이다.(별로 쓸일이 없다)
..
나누어서
ctrl + w  w 하면 나누어진 창으로 커서가 이동한다.
..
창 크기 조절은..
수평.. 나누기 했으면..

ctrl + w  N+  하면 N 만큼 커진다..
예를 들면 ctrl+w 를 한뒤에 숫자 3 과 플러스를 누르면 3 만큼 창이 커진다.
마이너스 하면 작아지고..
..
만약 수직 나누기에서 창크기 조절은..
N>.. N< 와 같다.. 즉 ctlr+w 누른후 숫자 3 과 꺽은 괄호 < 나 > 를
누르면 크기가 조절이 된다
..
창 연 후에  다른 파일 열려면..
창 명령모드
:e  aaa.txt  하고 하든가..

파일명을 몰라서 파일목록 보이게 하려면..
:e [디렉토리] 와 같이 한다.
만약 현재 디렉토리의 파일 목록 보려면..
:e .
와 같이 점을 찍으면 된다.
2010/06/01 09:58 2010/06/01 09:58
스펨메일 차단을 위해 HOWTO문서가 아니라, 전체적인 로직을 설명한 문서입니다.

스펨메일때문에, 스펨어쎄신, PROCMAIL, rcpthosts, tcp.smtp 화일등을 다 동원해서 스펨메일을 차단해 보려고 해도 결론적으로는 tcp.smtp 차단으로 답이 나올 것입니다.

스펨어쎄신과 procmail 등은 pop에 관련된 항목이라, 메일을 이용하는 User에게나 유용한 내용이지, 서버에서 메일로 인해 부하가 걸리는 것에는 아무런 효과를 주지 못합니다.

기본적인 사용법으로 tcp.smtp. rcpthosts를 이용해서 기본적으로 메일 발송에 관련해서 차단할 수는 있습니다. 즉, 메일서버를 통해 허용되지 않은 IP에 대해서는 특정 호스트로만 메일 발송이 가능하게 할 수 있습니다.

문제는 일반 사용자들은 이렇게 해서 별 문제가 없습니다만, 어떻게든 뚫고 들어와서 내 메일서버를 통해 타 사이트로 메일을 보내려고 시도하는 스펨메일이 있다는 것입니다. 물론 메일은 날아가지 않을 것입니다. rcpthosts에서 허용한 호스트외에는 말이죠.

문제는 queue에 mess가 계속 쌓인다는 것입니다.
mess가 계속 늘어 난다는 것은 스펨메일이 계속 들어오고 있다는 것입니다. 즉, 메일 서버가 감당하지 못하는 양이 계속해서 들어오고 있다는 것입니다.

이것을 막기 위한 방법에 대해 지금 부터 간략하게 설명하려 합니다.

=================== ===========================
tcp.smtp 화일은 다음과 같은 용도로 사용합니다.
(1) 인증된 IP에 대해서는 어떤 호스트로도 메일발송이 가능하게 합니다.
      방법 : 고정IP에서만 사용된다면 간단하지만, 유동 IP도 고려 하려면, 약간의 트릭이 필요합니다. 저희 같은 경우는 Intranet에 로그인을 하게 되면, 해당 사용자의 IP가 Database에 허용IP로 등록이 됩니다. Crontab을 이용하여 1분 단위로 새로 추가된 IP가 있으면 tcm.smtp에 등록하는 형태로 만들어 두었습니다.  즉, 유동IP에서 메일을 보내려면, 인트라넷 로그인후 1분후에 메일을 보낼 수 있는 것이죠.

(2) Deny된 IP에 대해서는 메일 송/수신 자체가 불가하게 만듭니다.
    사이트를 검색해보면 spamiplist 같은 화일이 있습니다.  일차적으로 이 아이피 리스트를 구해 전부 등록합니다. 물론 Database에 DenyIP로 등록합니다.  추가될때마다 Database에 등록하면 crontab이 1분단위로 tcp.smtp 화일을 생성할 것입니다.
   

(3) 그외 IP는 허용된 호스트로만 메일을 발송할 수 있도록 합니다.
    rcpthots에 허용된 호스트를 등록합니다.


========= 기타 Util ===============

제 경우에는 1분단위로 위의 작업을 하는 crontab 실행 화일과 매일 1회 crontab 실행하는 화일을 만들었습니다.

1분단위는 IP에 대한 block, allow 검사만 합니다.
매일단위는 queue에 쌓여 있는 mess를 삭제하는데 사용합니다.

1분 단위로 잔존해있는 mess를 검색하여, 해당 mess화일을 열어 파싱하여 어떤 IP에서 발송한 메일인지 확인하여 동일 IP에 대해 counting합니다. 몇회 이상이 발생하면 deny로 IP를 추가합니다.

뭐, 기타 웹페이지에서 mess를 읽을 수 있는 곳으로 복사하였다가, 메시지 확인후 ip deny 여부를 판단하는 것을 구현하기도 하였습니다.


==================================

결론은 이렇습니다.
(1) tcp.smtp 화일에 allow, deny IP를 수작업으로 일일이 등록하지 않고, crontab을 이용하여 IP를 등록한다.

(2) crontab으로 실행되는 프로그램이 쉽게 IP리스트를 관리하기 위한 database를 구축한다. 또한, 주기적으로 queue에 쌓여 있는 mess를 삭제하는 루틴을 만든다. 아무거나 삭제하면 안되겠죠? 이건 재량것..

(3) 등록된 database와 메일서버내에 잔존해 있는 queue에 쌓인 mess를 함께 관리할 수 있는 웹페이지를 구성한다.

이런 환경을 만들어 두니, 이젠 메일서버가 말썽을 일으키지 않네요.

============ 서비스 도중 발생한 추가항목 ===============

tcp.smtp에 IP를 Deny해 두어도, qmail-remote 데몬을 이용해서 계속해서 deny한 IP가 접속을 하는군요. ㅡ.ㅡ 도대체 tcp.smtp는 정상적인 메일인 경우에만 적용되는것 같습니다.

예를 들어
From xxx@메일서버IP 형태로 발신자가 잡히면 그냥 통과해 버린다는게 문제입니다.
물론, 다양한 qmail patch를 이용하면 relay되긴 하겠지만... 자신없습니다.ㅡ.ㅡ
그래서 iptables를 사용할수 밖에 없다는 결론에 이르렇습니다.

결론은 tcp.smtp도 하고, iptables를 이용하여 해당 IP를 25, 110 포트 자체를 막아버렸더니, 더이상 들어오지 않네요.  물론, 간혹 특정IP에서 스팸메일을 보내긴 하나, 1,2통 정도는 애교로 봐주고 있습니다. 다 막아 버릴수도 있지만, 거래처 메일이 스팸으로 잡힐지 몰라서.. 3일에 20통의 메일이 걸리면 차단입니다. ^^

iptables 잘못 사용하면 곤란한 일이 생길수도 있으니, 잘 학습해 보고 사용하세요.
2010/06/01 09:56 2010/06/01 09:56
json 을 사용했을 경우 IE 의 보안을 낮추면 jsonp 를 사용하지 않고도 가능합니다.
(과연... 사용자가 보안을 낮출지... ㅎㅎ)


// --------------------------------------------------------------------------
// other.com json.php
<?php
function arr2json($arr){
    foreach($arr as $k=>$val) $json[] = '"'.$k.'"'.':'.php2js($val);
    if(count($json) > 0) return '({'.implode(',', $json).'})';
    else return '';
}
function php2js($val){
    if(is_array($val)) return arr2json($val);
    if(is_string($val)) return '"'.addslashes($val).'"';
    if(is_bool($val)) return 'Boolean('.(int) $val.')';
    if(is_null($val)) return '""';
    return $val;
}

$arr = array ('a'=>$_GET["a"],'b'=>$_GET["b"]);
echo $_GET["jsoncallback"].arr2json($arr);
?>



// --------------------------------------------------------------------------
// jsonsend.php

$(document).ready(function() {
    $('#send').click(function() {
        $.ajax({
            url: 'http://other.com/json.php?jsoncallback=?',
            data: {
            a: a_site_data,
            b: a_email_data
            },
            type: 'get',
            dataType: 'jsonp',
            jsonp : 'jsoncallback',
            error: function() {
              alert('Ajax failure');
            },
            success: function(response) {
            alert('신청이 완료되었습니다.'+response.b);
            }
        });
    }).css({cursor:'pointer'});
});


아래 두가지 방법은 안해봐서 정확히 모르겠지만...
이렇게도 하는거 같더군요. 위에가 복잡하다고 느껴지시면 아래처럼 시도해보세요 ^^;

$.get('http://www.other.com/Service.svc/GetToJson?callback=?', function (data) {
    alert(data);
}, 'jsonp');


$.getJSON('../../Services/Service.svc/GetToJson', function (data) {
    alert(data);
});


중요한건 서버단에서 데이터 전송할때 아래와 같은 형식으로 되어야 한다는겁니다.
jsonp1271738777234({"a":"webst.kr","b":"12333"})


이건 번외인데요.
ajax 디버깅 할때 오류도 안나오고 어찌해야 할지 모를때 아래 툴을 설치하셔서 사용하시면 좋더군요.

http://www.fiddler2.com/fiddler2/

1. 설치하고 실행합니다.
2. IE를 실행하고 웹사이트에 접속합니다.
3. ajax 통신을 시도합니다.
4. 프로그램에서 데이터의 전송이 보이는데 이것을 활용하면 됩니다.

이 프로그램 모를적엔 어떻게든 데이터 넘겨주는 파일에서 값좀 찍어볼라고 힘들었는데...
이제 그럴 필요가 없어졌네요 ^^;
2010/06/01 09:54 2010/06/01 09:54
혹시 있을지도 모르지만 얼핏 봤을 때 없는 거 같아서.

년월만 필요할 때,
select
    convert(char(6),dateadd(mm,number,'2010-01-01'),112) yearmonth
from master..spt_values
where type = 'P'
    and convert(char(6),dateadd(mm,number,'2010-01-01'),112)<'2011'

년월일이 다 필요하면
select
    convert(char(8),dateadd(d,number,'2010-01-01'),112) yearmonthday
from master..spt_values
where type = 'P'
    and convert(char(8),dateadd(d,number,'2010-01-01'),112)<'2011'
요렇게 char(6)을 char(8)로 바꾸고, 날짜 계산을 월(mm)에서 일(d)로 바꾸면 끝

달력을 쭉 뿌리면서 데이터를 뿌려야 하는 경우가 종종 있는데
그럴 때 쓰면 편하다.
2010/06/01 09:52 2010/06/01 09:52
<script>
<!--
function resize_frame(obj) {
    var obj_document = obj.contentWindow.document;
    if(obj_document.height) {
        obj.style.height = obj_document.height;
        obj.style.width = obj_document.width;
    } else {
        obj.style.height = obj_document.body.scrollHeight;
        obj.style.width = obj_document.body.scrollWidth;
    }
}
//-->
</script>

위에다가 살포시 복사해서 붙여 넣으시고
onload='resize_frame(this)' 추가 하시면 됩니다.

예제 코드 ex)
<iframe src="" frameborder=0 scrolling="no" onload='resize_frame(this)'></iframe>
2010/06/01 09:51 2010/06/01 09:51
지원 OS : windows, linux

개발환경 : html, javascript, nmosaic

사용제한 : 소스

제작자 : nmosaic

자료설명 :

구글맵처럼 큰 이미지를 분할해서 로딩하여 표현해주는 html,javascript 입니다.

데모는 http://youfiles.net/nmosaic/webviewer/gogh/

이 페이지는 nmosaic에서 자동생성 되었습니다.

첨부파일은 생성된 html,javascript,분할된 이미지 입니다.

그냥 풀어서 웹브라우져에서 바로 볼수 있습니다.

출처 : http://iblogbox.com/nview/
2010/06/01 09:46 2010/06/01 09:46
Adobe Flash Builder 4
사용자 삽입 이미지
Adobe® Flash® Builder™ 4(이전 Adobe Flex® Builder™) 소프트웨어는 소프트웨어 개발자가 오픈 소스 Flex 프레임워크를 사용하여 크로스 플랫폼 리치 인터넷 애플리케이션(RIA) 및 컨텐츠를 신속하게 개발할 수 있도록 고안되었습니다. 이 소프트웨어는 지능적인 코딩, 디버깅 및 시각적 디자인을 지원하고 개발 시간을 단축하고 애플리케이션의 성능을 더욱 향상시킬 수 있는 강력한 테스팅 툴을 제공합니다.
기능 보기: 새로운 주요 기능 전반적인 주요 기능 모두 강력한 코딩 툴 향상된 기능
MXML, Adobe ActionScript® 언어 및 CSS 편집기뿐만 아니라 구문 색상 표시, 구문 완성, 코드 축소, 인터랙티브한 단계별 디버깅, 일반적인 코드의 자동 생성 등 다양한 기능이 포함되어 있는 강력한 Eclipse™ 기반의 IDE를 사용하여 개발 작업을 수행할 수 있습니다.

풍부한 시각적 레이아웃 향상된 기능
내장된 구성 요소 라이브러리를 사용하여 유저 인터페이스의 레이아웃, 모양 및 작동 방식을 시각적으로 디자인하고 미리 볼 수 있을 뿐만 아니라, 내장되어 있는 Flex 프레임워크 구성 요소를 확장하거나 필요한 경우 새 구성 요소를 만들 수 있습니다. 인터랙티브한 Adobe Flash Catalyst™ 디자인 툴을 사용하여 만든 기능적인 애플리케이션 UI를 가져올 수 있습니다.

데이터 중심의 개발 새로운 기능
Java™, PHP, Adobe ColdFusion®, REST 및 SOAP 서비스를 검사하여 새로운 데이터/서비스 탐색기에서 메서드 및 속성을 표시할 수 있습니다. 또한 간편한 드래그 앤 드롭 방식으로 UI 구성 요소에 메서드를 바인딩할 수 있습니다.

인터랙티브한 데이터 시각화 향상된 기능
Flex 차트 라이브러리를 사용해 원하는 차트 유형을 드래그 앤 드롭한 다음 데이터 소스에 연결하여 데이터 대시보드 및 인터랙티브한 데이터 분석 기능을 만들 수 있습니다. 강력한 고급 데이터 그리드를 사용하면 사용자가 복잡한 데이터를 탐색할 수 있습니다.

스키닝 및 스타일링 향상된 기능
CSS 및 그래픽 속성 편집기를 사용하여 애플리케이션의 모양을 사용자 요구에 맞게 변경할 수 있습니다. 일반적으로 사용하는 속성을 신속하게 설정한 다음 디자인 뷰에서 결과를 미리 볼 수 있습니다. 새로운 테마 브라우저를 통해 사용 가능한 테마를 찾아 프로젝트에 적용할 수 있습니다.

Adobe Creative Suite 디자인 툴과의 통합 향상된 기능
Adobe Flash Professional, Illustrator®, Photoshop® 또는 Fireworks® 소프트웨어에서 만든 디자인 에셋을 가져오거나 Flash Catalyst에서 제작한 전체 애플리케이션 유저 인터페이스를 가져올 수 있습니다. Flash Professional과 Flash Builder 간의 새로워진 워크플로우를 통해 손쉽게 맞춤형 Flex 구성 요소를 가져와 업데이트할 수 있습니다.
Adobe AIR에 대한 기본 지원
AIR 애플리케이션을 구축, 디버그, 패키지 및 서명하는 데 필요한 모든 툴을 포함하고 있는 Flash Builder 4를 사용하면 Adobe AIR® 런타임에서 실행되는 애플리케이션을 개발할 수 있습니다. Adobe AIR를 사용하면 브라우저용으로 RIA를 구축할 때 사용하는 동일한 기법과 코드베이스를 사용하여 데스크탑용 RIA를 신속하게 구축할 수 있습니다.

코드 리팩토링 향상된 기능
신속하게 코드를 검색하거나 클래스, 메서드 또는 변수에 대한 모든 참조 이름을 변경하여 코드를 재구성할 수 있습니다. Flash Builder 4에는 이동 리팩토링 기능이 추가되었습니다.

강력한 테스팅 툴 향상된 기능 (Premium 에디션에만 해당)
메모리 사용 및 CPU 주기를 모니터링하고 분석하는 메모리 및 성능 프로파일러를 사용하면 애플리케이션 성능을 높일 수 있습니다. HP QuickTest Professional과 같은 자동화된 테스트 툴도 지원됩니다.

네트워크 모니터 새로운 기능 (Premium 에디션에만 해당)
로컬 Flex 애플리케이션과 백엔드 간에 전달되는 모든 데이터에 대한 상세한 감사 추적 내용을 생성하여 디버깅과 성능 튜닝을 지원합니다.

고급 데이터 서비스 향상된 기능
오픈 소스 BlazeDS를 사용하면 HTTP 기반의 고성능 바이너리 데이터 전송 방식을 추가하거나 Adobe LiveCycle® Data Services ES2 모듈을 사용하여 실시간 데이터 푸시 및 pub/sub 방식의 메시지 전송 서비스를 추가할 수 있습니다.

명령줄 빌드 새로운 기능 (Premium 에디션에만 해당)
새로운 명령줄 빌드 기능을 사용하면 빌드 프로세스를 자동화할 수 있습니다.

Flex 유닛 테스팅 통합 새로운 기능 (Premium 에디션에만 해당)
Flex 유닛 테스팅 프레임워크를 사용하여 기능 테스트를 자동화할 수 있습니다.

ASDoc 지원 새로운 기능
ASDoc을 사용하면 MXML 및 ActionScript 편집기에 주석을 표시할 수 있습니다.
2010/05/18 01:52 2010/05/18 01:52
사용자 삽입 이미지
C/C++, h, java소스를 HTML로 변환하는 s2html v1.0 입니다.
www.codein.co.kr에서 배포하는 프로그램입니다.
2010/05/03 13:00 2010/05/03 13:00
간만에 간단한 코딩을 한번 해 보기로 한다. 만들어 볼 것은 아주 아주 간단한 트위터 봇(bot)인데, 제목 그대로 내가 내 메신저에서 트위터로 메시지를 날릴 수 있게 해 주는 메신저 봇이다. 트위터(Twitter)는 아주 인기있는 마이크로블로깅 서비스인지라 이미 세상에는 너무나도 많은 봇들이 나와서 돌아 다닌다. 게다가 봇을 자동으로 생성해 주는 서비스도 여럿 있다. 그렇지만 간단한 봇 정도야 1분, 아니 10분 안에 만들어 쓸 수도 있지 않을까?

우선 몇 가지 준비를 하자. 메신저 프로토콜은 오픈 프로토콜인 XMPP를 사용하기로 하자. 부연하자면, XMPP는 예전에Jabber라 불리던 것으로 현재 구글이 GTalk 서비스에 사용하고 있는 XML 스트림 기반의 근사한 메시징 프로토콜이다. 그럼 루비로 간단한 봇 프로그램을 만들어 보자. 코드는 다음과 같다.

require 'rubygems'
require 'eventmachine'
require 'xmpp4r-simple'
require 'twitter'

class TwitterBot
  def initialize(jid, j_pass, tw_email, tw_pass)
    @logger = Logger.new(STDOUT)
    @im = Jabber::Simple.new(jid, j_pass)
    @tw = Twitter::Base.new(tw_email, tw_pass)
  end
 
  def update_messages
    @im.received_messages do |msg|
      jid = msg.from.strip
      @tw.update(msg.body)
      @logger.info "%s update: %s" % [ jid, msg.body ]
      @im.add(jid) if !@im.subscribed_to?(jid)
      @im.deliver(jid, "업데이트 성공.")
    end
  end
end

루비의 XMPP 라이브러리인 xmpp4r-simple과 트위터 API wrapper인 twitter 라이브러리를 사용하였기 때문에, 설명할 여지도 없이 간단한 코드가 되었다. 하는 일이라고는 그냥 메신저로부터 메시지를 받아 그 메시지를 다시 트위터로 보내는 게 전부다.

이제 이 봇을 실행해 보자. 간단한 loop문만 돌려도 되지만, 향후 이 봇의 확장성(?)을 고려해서 루비 이벤트 기반 네트워크 라이브러리인 eventmachine을 사용하기로 하였다. 마지막으로 XMPP 서버가 필요한데, 물론 ejabberd 같은 XMPP 서버를 직접 설치하여도 좋겠지만, 굳이 간단한 봇을 위해 그런 수고까지야. 이미 세상에는 아주 훌륭한 XMPP서버가 나와 있으니 그걸 이용하기로 하자. 바로 구글 Talk다! 봇의 구동 코드는 다음과 같은데, 봇의 생성자에 자신의 구글메일ID, 즉 구글토크ID와 패스워드, 그리고 자신의 트위터 접속 정보를 넘겨주기만 하면 된다.

tb = TwitterBot.new(구글메일 주소, 구글메일 패스워드, 트위터 이메일, 트위터 패스워드)

EM.run do
  EM::PeriodicTimer.new(1) do
    tb.update_messages
  end
end  

이제 이 봇을 실행하고 봇의 ID, 즉 위에서 사용한 구글메일주소를 자신의 메신저 친구 목록에 등록하자. 그리고 나서는 트위터로 무언가 글을 올릴 일이 있을 때마다 그냥 메신저에서 봇에게 메시지만 보내면 그만이다.

이 봇은 트위터를 예제로 하고 있지만, 사실 조금만 변경하면 API가 오픈된 많은 서비스들에 응용할 수 있을 것이다. 자신의 블로그에 블로깅을 하는데 이용할 수도 있고, 미투데이나 스프링노트에 글을 올릴 수도 있을 것이다. 아, 물론 미투데이나 스프링노트는 이미 근사한 봇들이 많이 만들어져 있으니 굳이 그럴 일은 없겠지만.

그리고 또, 음.. 플라타너스트리에도 적용해 볼 수 있지 않을까.
2010/05/02 17:42 2010/05/02 17:42

XMPP란?
RFC3920, RFC3921 등 IETF(Internet Engineering Task Force)에서 제정한 국제 표준 프로토콜로 인스턴트메신저(Instant Messenger)를 위한 프로토콜로 잘 알려져 있다. 국내에서는 몇년 전 구글(google.com)이 XMPP를 채택, googletalk 이라는 인스턴트메신저 서비스를 시작하면서 널리 알려지는 계기가 되었다. XMPP 규격은 2004년 봄에 표준으로 제정되었지만, 사실은 Jabber라는 이름으로 1998년부터 연구가 시작되었고 이 연구의 결과가 표준화라는 결과를 맞이하게 된 것이다.

어떤 규격인가?
이 표준은 인터넷상의 두 지점간의 통신 규격에 관한 것이다. 두 지점은 이메일주소와 같은 방식으로 표현되며 이들 지점간 확장가능한 메시지(message) 그리고 프레즌스(presence)를 거의 실시간(near-realtime)으로 전달해주는 규격이다. 이 규격에 의하면 인터넷상의 지점은 DNS(Domain Name Service) 서비스에 의해 명명될 수 있는 위치들간의 통신으로 예를 들어 yourhost.com 이라는 주소도 하나의 지점이며 yourid@yourhost.com 또한 하나의 주소이다. 결국 DNS에 의해 표현될 수 있는 주소 공간은 새로이 등록되는 도메인 이름에 의해서 계속해서 증가하므로 이론상 무한대의 사용자가 서로 통신이 가능하게 되는 규격인 셈이다.

표준IM을 위한 XMPP?
알려진 대로 XMPP 프로토콜은 표준 인스턴트메신저 서비스를 위한 훌륭한 프레임워크를 제공해준다. 이미 전세계 수 많은 사람들이 XMPP 사용자가 되어 있으며 지금도 계속해서 증가하고 있다. 이것은 XMPP 소프트웨어를 만드는 회사와 단체가 증가하는 것을 보면 알 수 있다. 그러나 인스탄트 메신저 서비스만 가능한 것은 아니다. XMPP라는 규격이 Message와 동시에 Presence라는 것을 정의하고 있기 때문에 그 사용처는 매우 대단하다.

강력한 Presence 기반 응용이 가능
프레즌스(Presence)는 XMPP의 가장 중요한 요소중의 하나이다. DNS에 의해 확장되는 거대한 XMPP 공간에서 각 지점의 상태들을 프레즌스라고 하고 각 지점의 상태가 변경될 경우 이 상태 변경은 즉각 이에 관심있어 하는 지점으로 브로드캐스팅된다. 다른 지점의 상태변경에 관심있는 지점이 되기 위해서는 프레즌스를 구독(subscribe)하는 과정이 필요하다.
 


XMPP IM
 
현재 AOL, MSN, Yahoo 메신저등 다양한 메신저들이 개인간 커뮤니티 도구로 널리 사용되고 있으며, 이를 기반한 다양한 차세대 킬러 어플리케이션 개발에 많은 노력을 하고 있다. 이러한 가운데 대형 포탈 또는 통신업체 등의 기업 메이저시장에서도 업체간 메신저 경쟁도 날로 치열해지고 있다. 불과 몇 년 전만 해도 메신저는 젊은 세대간의 간단한 쪽지 수준의 메시지를 전달하는 도구에 불과했었다.
 
그러나 지금은 메신저가 개인적인 커뮤니티뿐만 아니라 기업내의 협업을 위한 매우 유용한 도구로 활발히 이용되고 있다. 최근 메신저는 이미 수백만 명의 사용자를 가질만큼 규모가 급성장하고 있다. MSN 뿐만 아니라 AOL, Yahoo, ICQ(AOL과 통합되었음) 등 다양한 메신저들이 이미 인터넷 시장에서 ‘작은 포탈’로 주목받고 있다. 이들 메신저는 단순한 메시지 전송 기능과 파일 전송 기능을 넘어서서 교육, 증권, 은행, 음악, 복권 등 다양한 서비스를 함께 제공하고 있어 사용자들에게 인터넷만큼 편리하게 이용된다.
 
그러나 서로 다른 메신저를 사용하는 사용자간의 대화나 파일 전송은 불가능하다는 단점이 있다. 그 뿐만 아니라 친구 등록에는 한계가 있어서 두 개 이상의 메신저 계정을 가지고 있는 사용자는 동시에 여러 계정을 이용할 수 없다. 초기부터 많은 사업자들이 주요 서비스의 부가적인 사업정도로 인식하여 출발한 결과로 이 기종 메신저간에 커뮤니티를 전혀 고려하지 않았다. 그 결과, 서로 다른 메신저를 사용하는 사용자간에는 불편을 감수하여 여러 종류의 메신저를 설치해서 사용하거나 또는 가장 선호하는 메신저를 제외한 다른 메신저를 포기하는 경우가 대부분이다.
 
이러한 고객의 불편함을 해소하기 위해 마이크로소프트(MS), 야후, 아메리카온라인(AOL)등이 비즈니스용 통합 메신저 제품을 공동으로 개발하기로 합의하였다. 이를 바라보는 여러 전문가들은 비즈니스의 영역을 확보하기 위한 이 같은 행보를 꼬집어 비판하면서, 이 세 기업이 새로운 메신저 제품을 위해 얼마나 효율적으로 개발협업을 이끌어낼 지 의문을 제기하였다.
 
다른 한편으로는 여러 업체들이 각기 다른 메시징 소프트웨어를 제작해서 보급함에 따라 메시징 소프트웨어 간의 상호 호환성 문제에 대하여 인터넷기술표준단체 IETF(Internet Engineering Task Force)에서는 메시징 서비스 간의 호환성 문제 해결을 위한 표준 제정을 위해 XMPP(eXtensible Messaging and Presence Protocol) 워킹그룹을 결성하고 표준화를 추진하고 있다. 여기서, XMPP는 XML 스트리밍 기반 확장형 실시간 메시징 기술이다. XMPP는 공개형 프로토콜인 JABBER(http://www.jabber.org) 인스턴트 메신저에 근간을 두고 있으며 HP, SUN 등의 솔루션회사와 AT&T, Orange, France telecom, BellSouth 등의 통신회사가 채택하였다.
 
또한, IETF가 사람들 또는 기계간의 상태와 컨텍스트 정보를 활용하여 실시간 대화형 기술을 제시하고 있는 XMPP-core 및 XMPP-IM을 제안표준으로 채택함에 따라 XMPP 보안, XMPP-연동 등도 표준으로 채택되리라 예상되며, 향후 XMPP가 세계적 표준으로 자리 잡는데 다가섰다고 평가되고 있다.
 
IETF의 인스턴트 메신저 표준은 이전에 이메일이나 웹이 SMTP, HTTP로 인터넷 표준화되어 널리 사용되었듯이 향후 실시간 대화형 서비스 확산에 큰 영향을 미칠 것으로 평가되고 있다. IETF에 의해 XMPP영역의 표준으로 채택된 Jabber는 인터넷에 있는 두 지점간의 메시지, 온라인 상태정보, 및 기타 구조적(structured)정보를 실시간으로 교환하기 위한 스트리밍 XML 프로토콜 및 기술을 의미한다.

 
Jabber 서비스를 이용하기 위해서는 공개된 Jabber 클라이언트를 다운받고 오픈된 공개 서버에 회원가입을 하거나 직접 자신의 서버에 Jabber 대몬을 설치하고 사용할 수 있는데, 일단 가입이 이루어지면 JID라는 식별자를 부여받게 된다. JID는 이메일과 같은 체계로 되어 있다. 예를 들어 씽크테크(thinktek.co.kr)가 재버서버를 설치하고 jklee라는 사용자를 가입시켰다면 이 사용자의 JID는 jklee@thinktek.co.kr이 된다. 이는 공교롭게도 이메일 주소와 동일하다. 즉, JID는 전세계적으로 유일한 ID가 된다.
 
Jabber의 최대 특징은 JID만 알면 다른 어떤 Jabber 서버의 사용자와도 대화가 가능하다는 점이다. 즉, david@jabber.org 라는 JID를 가진 사용자에게 이메일을 쓰듯 메시지를 날리면 실시간 대화가 가능하다. 이 점이 다른 메신저 사업자들과 비교했을 때 가장 특징적이며 획기적인 것이다.
 
향후 재버서버가 메일서버만큼 널리 사용되고 많은 사용자들이 JID를 보유하게 될 때에는 Jabber를 바탕으로 하는 수 많은 응용프로그램 수요가 발생하게 될 것으로 예상된다. 사람들이 일단 JID를 이용하여 상대방과 대화를 하기 시작한다면 그 이후는 대화상태 찾기, 게임, 온라인 거래, 계약 등등 수 많은 일들을 Jabber기반의 네트워크에서 처리할 수 있게 된다.
 
Jabber 프로토콜은 확장성을 고려하여 초기부터 XML이라는 구조적 기술언어를 이용하여 프로토콜이 설계되어 있다. XML의 특성상 풍부한 확장성을 제공하기에 Jabber응용프로그램을 개발하는 개발자는 자신이 새로 설계한 구조적인 정보를 Jabber 네트워크를 통하여 쉽게 전송할 수 있다. 결과적으로 XML에 의해 어떠한 구조적인 정보를 정의하느냐가 Jabber 어플리케이션 개발의 핵심이 되는 것이다.

2010/04/27 23:54 2010/04/27 23:54
XMPP(eXtensible Messaging and Presence Protocol) 프로토콜 기반의 공개 채팅서버인 OpenFire를 로컬 경로에 설치하고 테스트 해 보았습니다.

지원하는 플랫폼은 Windows/Linux/Mac 입니다.

다운로드 URL : http://www.igniterealtime.org/projects/openfire/index.jsp
설치 가이드 : http://www.igniterealtime.org/builds/openfire/docs/latest/documentation/install-guide.html


먼저 java 를 설치 하셔야 합니다.

저는 Windows용 무설치 버전을 받아 C:\openfire 경로에 압축을 해제 하였습니다.
(* 바탕화면에 압축 해제 후 실행시 한글 경로를 찾지 못하는 현상이 있는 듯 합니다.)

압축 해제 후 다음과 같이 실행합니다.

openfire.exe  (실행)

사용자 삽입 이미지




위와 같은 Openfire 창이 뜨면 Launch Admin 버튼으로 초기 세팅을 진행해야 합니다.

화면에 Launch Admin 클릭하면 아래 화면이 나오는데
사용자 삽입 이미지

이곳에서 데이터 베이스 설정 을 하십시오 오라클 MY-SQL , MS-SQL 기타 등등 모두 지원 합니다.

모든 설치과정이 끝나면, 클라이언트를 통해 메신저 서버에 접속 할 수 있습니다.

Spark 또는 SparkWeb을 통해 접속 해 봅니다.


아 참고로 사이트에 접속 하셔서 sparkweb 을 받아서 서버에 업로드 후 HTTP 메신저도 지원 합니다.

사용자 삽입 이미지
--------------------------------------------------------------
추가

웹사이트 작업중 회원 테이블 을 공유 해야할 필요가 생겨서 작업중 알게 되었습니다.

비밀번호가 암호화 되어 있어 MD5 라고 생각했는데 아니더군요 하다 하다 안되서.

이것저것 알아본결과 plainPassword 필드에 암호화 안된 일반 비번을 넣었더니 문제 없이 로그인 되었습니다.

다시 말해 encryptedPassword 에 비밀번호가 없고 널 일경우 plainPassword  에 암호화 안된 비밀번호로 로그인 되는것을

확인할수 있었습니다.

2010/04/27 23:46 2010/04/27 23:46
< windows 서버에 filezilla sftp server 설치하는 법 >

요즘 일반유저도 컴퓨터 보안에 대한 관심이 높아지고 있습니다.
그래서 오늘은 보안에 취약한 서비스, 그 중에서 가장 원초적이면서 쉽게 해킹에 노출 될 수 있는
서비스중에 하나인 ftp 서비스에 대해 글을 올리겠습니다.

telnet 서비스는 오래전부터 ssh 서비스로 바꼈고, 요즘에는 거의 쓰지 않는 서비스가 되었습니다.
그러나 telnet 서비스와 마찬가지로 해킹 sniffer에 쉽게 노출된 ftp서비스는 아직도 많이 쓰고 있습니다.
그나마 다행히 최근부터 호스팅업체나 idc 등에서 sftp 서비스로 대체하고 있는 실정입니다.
아마도 ftp 서비스도 몇년이 지나면 telnet과 같이 거의 사장되는 서비스가 될지 모릅니다.

아래 그림은 알ftp, 파일질라 같은 프로그램으로 일반 ftp 접속을 했을때, tcpdump로 스니핑을 해본 결과
입니다.
그림에 나온것 처럼 ftp id = ftp_user , password = abc 인것을 쉽게 텍스트로 확인 할 수 있습니다.

 

사용자 삽입 이미지
tcpdump




리눅스 서버에서는 특별한 세팅없이 sftp 서비스를 제공할 수 있고, filezilla-client 같은 프로그램으로 접속해서
sftp를 사용하면 됩니다.

아래 링크는  filezilla client 사용법 입니다.
http://youngsam.kr/1145


오늘은 windows 서버에 filezilla sftp server를 설치하는 법에 대해 설명드리겠습니다.

1. 아래 링크에서 파일질라 서버를 다운 받고 설치를 합니다.
    http://filezilla-project.org/

2. 모두 디폴트로 설치하고 실행하면 아래와 같이 FileZilla Server 프로그램이 실행됩니다.
   그림 처럼 EDIT > Settings 를 클릭합니다.

 

사용자 삽입 이미지
FileZilla Server



3. General Settings에서 Connection Settings > Listen on these ports: 990 으로 Listen port를
    990 으로 설정합니다.(다른 포트로 변경해도 상관없음)

 

사용자 삽입 이미지
FileZilla Server - 2




4. 왼쪽에 admin interface settings 을 클릭 합니다.
   filezilla-server admin과 통신할 포트를 14147 로 디폴트값을 씁니다(변경해도 상관없음)
   다음으로 "Change Admin password" 를 체크하고 local에서 filezilla-server admin으로 접속할
   password를 새로 설정합니다.(admin 접속시 사용할 비밀번호를 넣습니다)

 

사용자 삽입 이미지
FileZilla Server - 3





























5.  왼쪽에 "SSL/TLS settings"를 클릭합니다.
   아래 그림과 같이 Enable FTP over SSL/TLS support(FTPS) 에 체크 합니다.
  sftp 포트가 디폴트로 990으로 되어 있습니다. General settings에서 설정한 Listen port 와
  같은 값인지 확인합니다.
   Allow explicit FTP over TLS 체크 합니다
   Disallow plain unencrypted FTP 체크 합니다.
   설정이 다됬으면 아래쪽에 "generate new certificate.."버튼을 클릭합니다.

 

사용자 삽입 이미지
FileZilla Server - 4


                                                                                      




6.  Key size: 4096 bit 를 선택하고 국가번호: 82  ...
    정보를 입력한후에 키생성 합니다.
    인증키 저장위치를 본인이 설정한 안전한 위치에 저장을 합니다.
    확인을 눌러 이전 항목으로 간후에
    Key password 에 인증키 암호를 넣습니다.
    settings 항목을 빠져 나갑니다.


 

사용자 삽입 이미지
FileZilla Server - 5




7.  이제 Edit > Users 항목을 설정합니다. 아래 그림 처럼 Users를 클릭하여 사용자를 등록합니다.

 

사용자 삽입 이미지
FileZilla Server - 6




8.  아래 그림처럼 General > Users 항목에서 Add 버튼을 클릭해서 사용자를 추가합니다.
     Account Settings 에서
    "Enable account" 와 "Password" 에 체크를 하고 password를 넣습니다.(이 패스워드는 ftp접속시 사용됨)
     SFTP로만 접속할 수 있도록 설정 하려면
    아래에 "Force SSL for user login" 값을 체크합니다
.

사용자 삽입 이미지



9.  Users > Shared folders 항목에서 오른쪽에 추가한 사용자(ftp_user)를 클릭한후에
   공유폴더를 지정합니다. (사용자를 여러개 추가 했으면 각 사용자를 클릭하여 공유폴더를 각각 추가합니다)
   아래는 D 드라이버 전체를 공유폴더로 지정한 그림입니다.
   설정이 완료 되었으면 확인후 Users 설정을 빠져나갑니다.

사용자 삽입 이미지



10. 이제 filezilla-server 설정이 완료 되었으므로 이제까지 설정한 세팅이 적용되도록 서비스를 재시작 합니다.
    아래 그리처럼 작업관리자에서
     "FileZilla Server.exe"
프로세스를 죽인후 프로그램을 다시 시작하거나

사용자 삽입 이미지


   또는 아래 그림 처럼
   모든프로그램 > FileZilla Server > Stop FileZilla Server 를 클릭하여 FileZilla server를 정지 시킨후
   다시 Start FileZilla Server 를 클릭하여 재시작 합니다.

사용자 삽입 이미지



11.  이제 앞에서 설정한 admin 비밀번호를 입력하고 FileZilla admin으로 접속합니다.

     아래 그림은 로컬에서 FileZilla server 에 접속한 경우 이므로
      Server Address : 127.0.0.1 (
외부에서 파일질라 admin 접속하려면 해당 서버의 ip값을 넣습니다 )
       port : 14147 (
앞에서 admin 설정시 포트값
)
      Administration Password : (
앞에서 파일질라 admin 패스워드 설정한 값
)
      Always connect to this server
에 체크 합니다

사용자 삽입 이미지



12. 시작 > run > cmd 엔터로 cmd창을 연후에
     "netstat -an"
명령어로 FileZilla Server990 포트가 열려 있는지 확인합니다.
     
아래 그림에 보면 TCP 990 번 포트가 Listening 하고 있음을 확인할 수 있습니다.

사용자 삽입 이미지



 13.  이제 FileZilla Server 설정은 완료 됬으므로
      클라이언트 세팅을 해 봅니다.
        Sftp
를 사용하려는 pc에 위에 링크로 들어가서 FileZilla Client 프로그램을 다운 받은후 설치 합니다.
      설치 후 아래 그림처럼 File > 사이트 관리자 를 클릭합니다.

사용자 삽입 이미지



 14. 사이트 관리자 창이 나오면
      
왼쪽 아래에 "새 사이트"를 클릭해서 파일질라 연결을 만듭니다.
     
오른쪽에 일반 탭에서 그림과 같이 설정합니다.

   
호스트: 111.111.111.111 (파일질라 serverip address를 입력합니다)
   
포트 : 990 (파일질라 server에서 설정했던 포트를 입력합니다
)
   
서버종류 : "명시적 TLS/SSL 상의 FPTES-FTP" 를 선택합니다
.
   
로그온 형식 : 비밀번호 요청

   
사용자 : ftp_user (파일질라 server에서 Users에서 등록했던 ID)

    
설정후에 확인을 누릅니다.

사용자 삽입 이미지



 15.  사이트관리자 열기 아이콘의 아래화살표 표시를 누르면 이제까지 등록한 연결명(vm)이 보입니다.
      해당 연결명을 클릭합니다. (여기서는 앞에서 vm으로 이름을 만들었으므로 vm을 클릭합니다)

사용자 삽입 이미지



 16.  미리 등록한 연결이름을 클릭하면 패스워드 입력창이 뜨는데
      인증키를 만들때 입력했던 "Key Password" 를 입력하면 서버에 접속이 됩니다.
      아래그림은 sftp990포트로 파일질라 server에 접속한 상태 입니다.

사용자 삽입 이미지


 
17. 아래 그림은 Sftp로 파일질라 서버에 접속할 때,
     tcpdump
로 스니핑을 해본 결과 화면 입니다.
   그림 처럼 ftps 접속이 이루어지면서 ftp idpassword는 암호화 되어
   해커가 ftp 접속 패킷을 도청해도 내용을 알 수 없음을 확인할 수 있습니다.

사용자 삽입 이미지


2010/04/14 09:57 2010/04/14 09:57
서버 관리를 하다 보면 내 서버에 접속한 유저 정보가 남아 있는 로그를 보게 될때가 많습니다.
이런 로그를 조금이나마 보기 쉽게 되어있는 웹로그 분석 툴이 있는데
오늘은 그중 하나인 Awstats 설치를 해보시겠습니다.

====준비 과정===
그럼 우선 재료를 받아보겠습니다.
필요한 자료는Awstats와 윈도우즈용 Perl이 필요합니다.

1. Awstats는 http://awstats.sourceforge.net/ 에서 받아줍니다..(필자 설치 버젼은 6.9)
2. 윈도우즈용 perl은 http://www.activestate.com/ 에서 받아줍니다..
    (필자 설치 버젼은 ActivePerl-5.10.0.1004-MSWin32-x86-287188)
3. 다운 받은 perl을 설치합니다..
    설치 폴더는 C:\Perl에 설치 되었을 것입니다..
    그럼 bin 폴더에서 perl.exe 파일과 perl510.dll 파일을
    C:\WINDOWS\system32 폴더로 카피해줍니다..(귀찮으신 분들은 패스로 잡아주시면 됩니다.)
4. 다음은 Awstats를 설치하자 간단하게 설치가 되어질 것입니다.
   기본 설치 폴더는 C:\Program Files\AWStats 으로 되어 있을것입니다..

5. IIS 관리에서 웹서비스 확장에서 Perl Cgi Extension을 허용 시켜줍니다.

 

사용자 삽입 이미지
윈도우 웹로그 분석 - 1


그리고 해당 웹서버의 웹로그 형식을 수정해 주어야합니다.

IIS에서 해당 서버 속성에 들어가
활성 로그형식을 W3C 확장 로그 형식으로 우선 변경해 주고 속성에 들어가
로그파일 디렉토리를 지정해 주고 고급탭으로 가서 로깅옵션을 아래와 같이 체크해 줍니다.


사용자 삽입 이미지
 
                             윈도우 웹로그 분석 - 2                                  
사용자 삽입 이미지
  윈도우 웹로그 분석 - 3

기존 웹로그는 옵션값이 다르기 때문에 Awstats에서 불러 오지 못하기 때문에 이전 로그는 따로 저장하는게 좋습니다.

위와 같이 셋팅을 완료하면 IIS 단에서의 Awstats 설정은 끝났습니다.

다음은 Awstats conf 파일을 설정 해보도록 하겠습니다.

 IIS셋팅이 완료 되었으면 Awstats conf 파일을 설정하여야 합니다.

 기본적으로 Awstats 설치파일은 C:\Program Files\AWStats 여기에 설치되어 있습니다.
여기서 conf 파일로 필요한 데이터는 wwwroot폴더안의 cgi-bin 에 있는데 편하게 관리하시려면
cgi-bin폴더만 다른 경로에 복사하여 사용 하시면 됩니다.

 우선 Awstats 데이터가 저장 되어야 할 폴더가 필요합니다.
필자는 data 폴더를 wwwroot 아래에 하나 더 만들고 분석할 도메인 별로 폴더를 생성하여
데이터를 일괄적으로 관리하고 있습니다. [참고로 데이터 파일은 월별로 awstats042009.도메인.txt 이런 패턴으로 생성 되어집니다.]

 데이터를 만드셨다면 본격적으로 conf 파일 생성 및 설정 방법을 설명해 드리겠습니다.
cgi-bin 폴더에 보시면 awstats.model.conf 이라는 파일이 있습니다.
이 파일이 기본 conf 파일인데 이 파일을 편집하면 되겠습니다.

 파일명은 awstats.도메인명.conf 이런식으로 복사하셔서 사용하시면 됩니다.

그리고 이파일을 열어서 편집 하시면 되는데

=========================================================================================
해당 로그파일 경로
LogFile="해당 로그파일경로 \ex%YY-24%MM-24%DD-24.log"
ex) LogFile="K:\LogFiles\Awstats.com\W3SVC1313589822\ex%YY-24%MM-24%DD-24.log"

IIS 로그 포맷
LogFormat=2

도메인 명
SiteDomain="3fish.kr"

Awstats Data 폴더
DirData="Awstats Data 폴더"
ex) DirData="K:\Awstats\data\Awstats.com"

Awstats 언어
Lang="ko"

=========================================================================================

Awstats Data update

도스창에서 아래와 같이 입력하시면 업데이트가 됩니다.
[로그파일이 오늘 생성하셨다면 업데이트시 에러가 나올겁니다. 하루 지난후에 해보세요]

perl Awatats 소스 디렉토리\awstats.pl -config=도메인명 -update
ex) perl K:\Awstats\Awstats.com\awstats.pl -config=Awstats.com -update

자동으로 업데이트를 하실려면
bat파일로 만드시고 해당 bat파일을 Windows 스케쥴에서 자동으로 업데이트 되게 스케쥴을 잡아주시면 됩니다.

Awstats 확인 방법

IIS에서 Awstats 를 잡아주시고 아래와 같이 확인해보시면 되십니다.
http://서버주소/awstats.pl?config=도메인명

ex) http://***.***.***.***/awstats.pl?config=Awstats.com

데모는 http://awstats.sourceforge.net/#DEMO 에서 보실수 있으십니다.

*테스트 하셨을때 이미지가 안나오시면 설치 폴더의 icon폴더를 conf 폴더에 복사해 주시면 되십니다.

Awstats 설정 방법은 유동성이 많기 때문에 관리자 입맛에 맛추어 설정해 주시면 됩니다.
2010/04/14 09:41 2010/04/14 09:41

# 리눅스 시스템의 서비스관리 방식

 - 리눅스 서버에서 서비스를 관리하는 방식에는 여러가지가 있으며 대부분 서비스들은 init
   이라는 프로세스에 의해 생성 및 제거 된다

 - 특정 스크립트에 의해 시작/종료/재시작되는 것이 있으며 또한 리눅스명령어에 의해
   직접 시작/종료되는 것들도 있다

 - init 프로세스에 의한 관리

  -> 시스템 부팅에서부터 종료할 때까지의 모든 서비스들에 관여하고 있다

  -> 모든 독립데몬 서비스들이 init 프로세스로부터 실행됨

  -> init 프로세스 설정 파일 : /etc/inittab

 - 리눅스 명령어(command)에 의한 관리방식

  -> 가장 직접적인 방식으로서 사용자의 명령어 사용에 의해 실행된다

  -> 시스템에 존재하는 명령어 또는 사용자가 만든 쉘스크립트(또는 실행파일)

 - SYSTEM V 스크립트 방식

  -> /etc/rc.d/init.d 디렉토리에 존재하는 각 서비스 제어파일에 의한 관리방식

 - xinetd에 의한 관리방식

  -> /etc/xinetd.d 디렉토리내의 각 서비스파일들에 의한 관리방식

 - chkconfig에 의한 관리방식

  -> 부팅시에 자동실행할 서비스들을 설정한다

  -> 설정결과는 /etc/rc.d/rcN.d 디렉토리내의 링크파일의 생성과 파일명으로 존재

  -> xinetd 서비스는 /etc/xinetd.d 디렉토리내에 있는 파일내의 설정으로 존재

  -> ntsysv와 상호 보완적인 관리방식이다

  -> ntsysv 방식과 결과는 같지만 command 형식을 이용한 설정방식이다

 - ntsysv에 의한 관리방식

  -> 부팅시에 자동실행할 서비스들을 설정한다

  -> 설정결과는 /etc/rc.d/rcN.d 디렉토리내의 링크파일의 생성과 파일명으로 존재

  -> chkconfig와 상호 보완적인 관리방식이다

  -> chkconfig 방식과 결과는 같지만 툴을 이용한 설정방식이다


 - 서비스명 규칙

  -> /etc/hosts.allow 파일과 /etc/hosts.deny 파일내에서 사용하는 서비스이름은
     실제 데몬파일명을 지정해야 하며 "sshd : ALL" 에서 sshd 라는 이름은
     /usr/sbin/sshd 라는 파일명에서 가져온 것이다

  -> chkconfig 와 ntsysv 는 설정하면 자동으로 이름이 명명되어 나타나며 그 이름을
     그대로 사용하면 된다

  -> /etc/xinetd.d 디렉토리의 파일 내에서 사용하는 services 항목이름은 chkconfig
     설정시 사용되는 이름 또는 서비스 데몬명을 그대로 사용한다


# 슈퍼데몬방식과 독립데몬방식의 서비스 차이점

 - 독립방식서비스는 자체적으로 항상 메모리에 상주하여 서비스 요청시 실시간으로 응답한다

 - xinetd라는 슈퍼데몬에 의해 실행되고 제어된다

 - xinetd 서비스와 standalone 서비스의 비교

  XINETD 환경 서비스

   -> 의미 : xinetd에 의해 제어되는 서비스들의 데몬
   -> 실행방법 : 필요할 때에 xinetd에 수행됨
   -> 데몬상주여부 : xinetd에 의해 불리워진 후에 서비스완료후에 자동 종료
   -> 실행속도 : 독립방식에 비해 느림
   -> 자원사용 : 시스템자원사용이 효율적(자원사용 적음) 
   -> 기타 : /etc/xinetd/서비스명으로 xinetd 제어파일이 존재
   -> 접근제어 : tcp_wrapper에 의해 접근제어
        /etc/hosts.allow, /etc/hosts.deny 파일로 접근제어 설정을 할수 있다


  독립 서비스

   -> 의미 : 독립적으로 실행되는 서비들의 데몬
   -> 실행방법 : 독립적인 서비스를 위하여 항상 독립적으로 수행된다
   -> 데몬상주여부 : 독립적인 서비스를 위하여 메모리에 독립데몬으로 상주한다
   -> 실행속도 : xinetd 방식에 비해 빠름
   -> 자원사용 : xinetd방식에 비해 자원사용이 비효율적이다(자원사용 많음) 
   -> 기타 : /etc/xinetd/서비스명으로 xinetd 제어파일이 존재
   -> 접근제어 : tcp_wrapper와는 무관하지만 자체
        설정파일에 의해 접근제어 할 수 있다  
 
  공통 사항

   -> 로깅 : /etc/syslog.conf 파일의 설정에 따름, 대부분 /var/log파일에 로깅
   -> 참고
    1) 독립적으로 실행되는 데몬들도 xinetd 환경으로 변경할 수 있으며
        반대로 xinetd 환경에서 서비스되는 데몬들도 독립적인 실행모드로
        변경할 수 있다                                               
    2) sshd 서비스의 경우 standalone이지만 /etc/hosts.aloow,        
        /etc/hosts.deny의 접근제어를 받는다 따라서 독립데몬이라도    
         tcp_wrapper의 영향을 받을 수 있다                           
 

  -> standalone 모드로 실행이 되는 데몬은 독립적으로 실행되며 항상 메모리에
     상주하여 서비스요청이 있을 때 언제든 바로 응답하며 응답속도를 요하는 경우에
     이 모드를 이용한다 단점으로는 메모리에 항상 상주해있으므로 메모리점유로
     인하여 서버부하를 준다

  -> xinetd 모드로 실행이 되는 데몬은 xinetd라는 특별한 데몬(인터넷슈퍼데몬)에
     의해 관리되며, 필요한 경우에만 메모리로 적재되어 실행이 되어 응답을 한다
     빠른 응답속도를 요하지 않는 경우에 이 모드를 이용한다 단점으로는 응답속도가
     standalone 보다는 상대적으로 느리다는 것이고 장점으로는 메모리에 항상 상주해
     있는 것이 아니므로 standalone 모드보다는 서버부하를 상대적으로 줄일수 있다


# 인터넷 슈퍼데몬의 특징

 - xinetd는 인터넷슈퍼데몬(Internet Super Daemon)을 의미한다

 - xinetd는 그 자체적으로는 하나의 독립데몬이지만 xinetd가 하는 역할이 여러가지 다른
   서비스들을 관리하는 역할이기 때문이다
 
 - xinetd는 서비스되는 여러가지 데몬들을 제어하면서 각각의 서비스들의 연결을 담당한다

 - xinetd의 특징

  -> 각 서비스별로 별도의 파일에 설정이 가능하다(/etc/xinetd.d/* 파일들)

  -> xinetd에서 가지고 있던 접근제어 기능을 가지고 있다

  -> tcp_wrapper를 내장하고 있기 때문에 접근제어를 할 수 있다

  -> timeout 설정으로 서비스 접근제어를 할 수 있다

  -> 접속시도 횟수로 접근제어를 할 수 있으므로 무차별 서비스거부공격(DoS)을
     방지할 수 있다

  -> 동일한 IP를 가진 호스트에서 동시 접속수를 제어하여 접근제어를 할 수 있다

  -> 로그파일의 크기를 제한 할 수 있다

  -> xinetd에서 제어되는 각 서비스들에 대한 syslog 로깅 레벨 설정이 가능하다

  -> 서비스를 거부하거나 서비스 접근제어가 되었을 경우에 상세로그를 기록한다

 - xinetd는 외부에서 서비스요청이 있을 때 /etc/xinetd.d/ 디렉토리내의 각 서비스파일들에
   정의되어 있는 내부 프로그램(데몬)을 실행시켜주는 역할을 한다


# 슈퍼데몬 xinetd방식의 서비스 흐름

 - 외부에서 telnet 연결요청(서비스의 요청)이 들어온다

 - xinetd 데몬은 외부에서 요청된 서비스를 tcp_wrapper에게 넘겨준다

 - tcp_wrapper는 /etc/hosts.allow와 /etc/hosts.deny 파일의 설정을 확인하여 해당 요청자의
   접근을 허용할지 허용하지 않을지 결정한다

 - 허가된 요청일 경우에는 /etc/syslog.conf에 설정되어 있는 /var/log/secure 파일에
   해당 접속에 대한 정보를 기록하고 /etc/xinetd.d/telnet 파일을 불러들여서 서비스를
   연결한다 이때 /etc/xinetd.d/telnet 파일내의 server 지시자행에 설정되어 있는 telnet
   데몬의 위치를 찾아서 요청을 처리하게된다

 - 허가되지 않은 요청일 경우에는 /etc/syslog.conf 파일에 설정되어 있는 /var/log/secure
   파일에 허가되지 않은 접속이 있었다는 로그를 남기고 접속요청을 거부하게 된다


# xinetd 서비스 관련 파일

 - xinetd 서비스 관련 파일들


  -> /etc/xinetd.conf : xinetd 서비스에 공통적으로 적용되는 주된 설정 파일
  -> /etc/xinetd.d/파일들 :  xinetd 기반 서비스들의 개별 설정 파일들          
  -> /usr/sbin/xinetd : xinetd 데몬파일                                  
  -> /usr/sbin/tcpd : tcp_wrapper 데몬 파일                            
  -> /etc/rc.d/init.d/xinetd : xinetd 시작/종료 스크립트 파일                   
  -> /etc/hosts.allow : 서비스별 허용할 호스트 또는 IP 리스트(tcp_wrapper)
  -> /etc/hosts.deny : 서비스별 거부할 호스트 또는 IP 리스트(tcp_wrapper)
  -> /etc/syslog.conf : 시스템로그 설정 파일                             
  -> /var/log/secure : tcp_wrapper 로그파일 (접근기록 파일)             
  -> /etc/services : 서비스포트 설정 파일                             
  -> /etc/protocols : 프로토콜 설정 파일                               

 - /etc/xinetd.conf 파일은 xinetd의 최상위 설정파일로서 "Tcp_Level Configuration File"
   라고 한다

 - /etc/xinetd.d 디렉토리내의 각 서비스 설정파일들에 대하여 글로벌하게 영향을 주게된다
   개별 설정파일에 개별적으로 존재하지않는 설정항목들에 대해서는 기본적으로 적용될
   항목들이 설정되어 있는 파일이다


# xinetd 주설정 파일과 /etc/xinetd.d 내의 개별 서비스 설정파일

 - xinetd의 메인 설정파일로서 xinetd 데몬이 실행될 때에 설정 내용을 불러와서 적용한다

  # cat /etc/xinetd.conf

  #
  # This is the master xinetd configuration file. Settings in the
  # default section will be inherited by all service configurations
  # unless explicitly overridden in the service configuration. See
  # xinetd.conf in the man pages for a more detailed explanation of
  # these attributes.

  defaults
  {
  # The next two items are intended to be a quick access place to
  # temporarily enable or disable services.
  #
  # enabled  =
  # disabled =

  # Define general logging characteristics.
   log_type = SYSLOG daemon info
   log_on_failure = HOST
   log_on_success = PID HOST DURATION EXIT

  # Define access restriction defaults
  #
  # no_access =
  # only_from =
  # max_load = 0
   cps  = 50 10
   instances = 50
   per_source = 10

  # Address and networking defaults
  #
  # bind  =
  # mdns  = yes
   v6only  = no

  # setup environmental attributes
  #
  # passenv  =
   groups  = yes
   umask  = 002

  # Generally, banners are not used. This sets up their global defaults
  #
  # banner  =
  # banner_fail =
  # banner_success =
  }

  includedir /etc/xinetd.d

  -> /etc/xinetd.conf 파일의 구성

   => defaults 설정은 /etc/xinetd.d 디렉토리내에 존재하는 xientd 서비스들에
            공통적으로 적용하는 설정내용이다
      xinetd 기반의 서비스들에 대하여 기본값으로 적용하는 설정으로 개별
      설정항목이 별도로 존재할 때에는 이 기본 설정값은 무시되고 개별
      설정값이 적용된다

   => includedir /etc/xinetd.d 설정은 xinetd 서비스의 적용을 받는 개별
      서비스 설정파일들을 /etc/xinetd.d 디렉토리에서 불러오는 것이다


 - xinetd 기반의 개별 서비스 설정파일들은 /etc/xinetd.d 디렉토리 내에 개별 서비스이름과
   같은 파일명으로 존재한다

  # ls -l /etc/xinetd.d/
  total 52
  -rw-r--r-- 1 root root 1157 2008-09-18 17:36 chargen-dgram
  -rw-r--r-- 1 root root 1159 2008-09-18 17:36 chargen-stream
  -rw-r--r-- 1 root root 1157 2008-09-18 17:36 daytime-dgram
  -rw-r--r-- 1 root root 1159 2008-09-18 17:36 daytime-stream
  -rw-r--r-- 1 root root 1157 2008-09-18 17:36 discard-dgram
  -rw-r--r-- 1 root root 1159 2008-09-18 17:36 discard-stream
  -rw-r--r-- 1 root root 1148 2008-09-18 17:36 echo-dgram
  -rw-r--r-- 1 root root 1150 2008-09-18 17:36 echo-stream
  -rw-r--r-- 1 root root  332 2008-09-08 23:11 rsync
  -rw-r--r-- 1 root root 1212 2008-09-18 17:36 tcpmux-server
  -rw-r--r-- 1 root root  304 2009-07-29 19:17 telnet
  -rw-r--r-- 1 root root 1149 2008-09-18 17:36 time-dgram
  -rw-r--r-- 1 root root 1150 2008-09-18 17:36 time-stream


 - xinetd 기반의 서비스에 대한 개별 설정 파일

  # cat /etc/xinetd.d/rsync

  # default: off
  # description: The rsync server is a good addition to an ftp server, as it \
  # allows crc checksumming etc.
  service rsync
  {
   disable = yes
   flags  = IPv6
   socket_type     = stream
   wait            = no
   user            = root
   server          = /usr/bin/rsync
   server_args     = --daemon
   log_on_failure  += USERID
  }


 - /etc/xinetd.conf 파일에 다음 항목이 설정되어 있다면 Global 하게 적용되는 것을
     의미하고 /etc/xinetd.d/ 디렉토리 내에 존재한다면 개별서비스 설정이 된다

  -> service   : 서비스이름으로 /etc/services 파일에 등록된 서비스이름과 동일해야한다

  -> disable : 해당 서비스를 서비스할 것인가(no) 아닌가(yes)를 결정한다
             서비스를 하도록 설정하려면 no로 설정하고 서비스를 하지 않으려면
             yes 로 설정한다

  -> socket_type : TCP일 경우에는 stream으로 설정하고 UDP일 경우에는 dgram으로
      설정하며 서비스의 성격에 따라 raw, rdm, seqpacket 등이 올수
      있다

  -> wait  : xinetd가 서비스 요청을 받은 경우, 이후에 즉시 또는 다른 요청을
      처리할 것인지(no) 아닌지(yes)의 여부를 결정하는 지시자이다
      stream일 경우에는 반드시 no 이여야하며 no는 현재 요청외에의
      다른 접속요청을 새로운 것으로 시작하여 처리하게 된다

  -> user  : 서비스를 어떤 사용자 권한으로 서비스할 것인가를 결정한다

  -> server : 해당 서비스 요청이 들어왔을 경우에 해당 서비스를 담당하게될
      데몬파일의 위치를 절대경로로 지정하는 항목이다

  -> log_on_failure : 서버접속에 성공하지 못하였을 때 로그파일에 기록하는 내용을
        설정할 수 있다 HOST, USERID 그리고 ATTEMPT, RECORD 등이
        추가로 설정될 수 있다.

        HOST란 접속을 시도한 클라이언트의 IP 주소를 의미한다

        USERID란 접속한 사용자의 ID를 각각 의미한다

        +=은 /etc/xinetd.conf 파일의 기본설정항목에 추가할 항목을
        지정할 때 사용한다

        -=는 /etc/xinetd.conf 파일의 기본설정항목에서 뺄 항목을
        지정할 때 사용한다

  -> log_on_success : 서버 접속에 성공하였을 경우에 기록할 내용을 설정할 수 있다
        PID, HOST, USERID, EXIT, DURATION 등을 기록할 수 있다

        PID란 프로세스의 ID를 의미한다

        HOSTID란 클라이언트의 IP 주소를 의미한다

        USERID란 접속한 사용자의 ID를 의미한다

        EXIT란 프로세스의 종료상태를 의미한다

        DURATION이란 연결지속시간을 의미한다

  -> only_from : 'only_from = 192.168.1.0/24' 와 같은 설정이 가능하며 서버로
      해당 서비스 접속이 가능한 네트워크를 지정한다

  -> no_access  : 'no_access = 192.168.1.100'와 같은 설정이 가능하며 특정
      호스트를 접속을 제한 한다

  -> instances  : 'instances = 60'과 같은 설정이 가능하며 해당 서비스로 접속
      가능한 최대 접속자수를 제한한다

  -> access_times : 'access_times = 08:00~18:00'와 같은 설정이 가능하며 해당
      서비스의 이용가능 시간을 지정할 수 있다

  -> per_source : 'per_source = 5'와 같은 설정이 가능하며 동일한 호스트에서
      해당 서비스로의 접속시 동시에 접속할 수 있는 횟수를 지정한다

      서비스거부공격 (DoS)을 차단하기 위해 사용될 수 있다


# xinetd의 시작과 종료

 - xinetd 서비스를 위해서는 xinetd 데몬이 실행되어있어야한다

 - xinetd 데몬을 실행하려면 /etc/rc.d/init.d/xinetd 스크립트파일을 이용하면 된다

 - xinetd 의 시작

  -> xinetd 스크립트에 'start' 옵션을 함께 사용하면 된다

   # /etc/rc.d/init.d/xinetd start
   Starting xinetd:                                           [  OK  ]


 - xinetd 의 종료

  -> xinetd 스크립트에 'stop' 옵션을 함께 사용하면 된다

   # /etc/rc.d/init.d/xinetd stop
   Stopping xinetd:                                           [  OK  ]
 
 - xinetd의 재시작

  -> xinetd 스크립트에 'restart' 옵션을 함께 사용하면 된다

   # /etc/rc.d/init.d/xinetd restart
   Stopping xinetd:                                           [  OK  ]
   Starting xinetd:                                           [  OK  ]


# xinetd 서비스의 접근제어 담당 tcp_wrapper

 - 특정 IP나 도메인으로부터 서비스의 접속을 차단할 수 있다

 - 접속기록이나 접속시도기록을 특정한 파일에 로그로 기록한다

 - xinetd는 tcp_wrapper를 내장하고 있기 때문에 xinetd 모드에서 실행되는 서비스들(ftp,
   telnet, ssh 등)은 거의 대부분 tcpd라는 tcp_wrapper의 데몬에 의해 접속제어를 받게 된다

 - 개별서비스들의 접근 허용을 설정하는 파일은 /etc/hosts.allow이며 접근허용이 되지 않도록
   설정하는 파일이 /etc/hosts.deny 이다

 - tcp_wapper에 제어파일인 /etc/hosts.allow 파일과 /etc/hosts.deny 파일에 의해 제어되는
   서비스가 xinetd 기반 서비스에 한정되어있지 않다는 점이다
 
 - xinetd 기반 서비스뿐아니라 독립데몬들에 대한 서비스들도 tcp_wrapper의 제어파일인
   /etc/hosts.allow 파일과 /etc/hosts.deny 파일의 접근제어를 설정할 수 있다는 의미이다

 - /etc/hosts.allow와 /etc/hosts.deny 파일의 설정

  왼쪽부분 설정 항목

   대상서비스 : tcpd에 의해 제어되는 모든 서비스명
       xinetd 기반의 서비스들 뿐 아니라 독립데몬들의
       서비스들도 설정 가능

  오른쪽부분 설정 항목

   접근제어 대상 (host, IP주소, 네트워크주소등)
    : 특정 도메인명, 특정 호스트명, 특정 IP주소, 특정네트워크


  -> 왼쪽 항목과 오른쪽 항목은 콜론(:)으로 구분하며 세번째 항목을 계속 설정할
         때에도 콜론으로 구분하여 설정한다

  -> /etc/hosts.allow 설정과 /etc/hosts.deny 설정이 중복되었을 경우에는
       /etc/shots.allow 파일의 내용이 우선 적용된다

  -> '#'으로 시작하면 주석문으로 인식한다

  -> 대상 리스트들의 나열은 스페이스나 콤마(,)로 구분한다

 - tcp_wrapper에 의해 접근제어(허용 또는 차단)가 된 후에는 그 기록을 /var/log/secure
   파일에 남기게 된다


# ntsysv

 - ntsysv와 chkconfig는 방법이 조금 다를 뿐 목적하는바가 같다

 - 사용법과 실행결과에 조금씩의 차이는 있으나 부팅시에 자동실행할 서비스들을 관리하는
   점에서는 같은 목적을 가진 도구이다

 - GUI 환경에서 사용하고 있다면 "system-config-services"를 실행하면 동일하게 사용할 수
   있다

 - ntsysv는 리눅스의 부팅시 각 부팅레벨에 따라서 실행시키거나 실행시키지 않을 서비스들을
   설정하는 유틸리티이다

 - 0번부터 6번까지의 시스템부팅레벨에 따라서 부팅시에 자동실행 할 여러가지 서비스들에
   대한 실행 여부를 설정할 수 있다

 - /usr/sbin/ntsysv를 실행하면 실행이 되지만 setup 유틸리티를 실행하여 "System services"
   항목을 선택하여 실행할 수도 있다

 - ntsysv를 실행하면 "Services" 설정창이 뜨게 되며 시스템 부팅시에 자동실행할 여러가지
   서비스들에 대해 설정하는 것이 목적이다

  -> ntsysv를 실행한 후에 각 서비스의 앞에 있느 [ ]탭을 빈공간으로 두면 해당
     서비스를 부팅시 시작하지 않으며 [*]와 같이 해당서비스를 선택해두면 부팅시에
     그 서비스를 자동실행한다


 - 개별 서비스들에 간략한 도움말을 ntsysv 실행창에서 확인할 수 있으며 도움말을 보기위해선
   'F1' 키를 누르면 된다  


 - ntsysv를 실행하였을 경우에 현재부팅레벨로 다시 부팅할 경우에 자동 실행할 서비스들을
   설정하지만 '--level' 옵션을 이용하여 특정 런레벨로 부팅시 자동으로 실행할 서비스를
   설정할 수 있다

  형식 : ntsysv --level 3

  -> 여러개의 런레벨을 설정할시에 '35' 처럼 런레벨을 설정한다


# chkconfig

 - ntsysv와 chkconfig는 부팅시에 자동으로 실행할 각종 서비스들을 설정하는 유틸리티이다

 - chkconfig는 /etc/rc.d/rcN.d의 각 디렉토리에 있는 S로 시작하는 링크파일과 K로 시작하는
   링크파일을 생성/삭제함으로써 부팅시에 자동 실행할 서비스들을 결정할 수 있다

 - '--list' 옵션을 이용하여 ckhconfig로 관리되는 자동실행 서비스 리스트들을 확인한다

  # chkconfig --list | more
  NetworkManager  0:off 1:off 2:on 3:off 4:on 5:off 6:off
  acpid           0:off 1:off 2:on 3:on 4:on 5:on 6:off
  anacron         0:off 1:off 2:on 3:off 4:on 5:on 6:off
  atd             0:off 1:off 2:off 3:on 4:on 5:on 6:off

  -> on은 활성화를 의미하는 것으로 해당 런레벨로 부팅시 자동실행 시키며
     off는 비활성화를 의미하는 것으로 해당 런레벨로 부팅시 자동실행하지 않는다


 - '--add'로 지정한 서비스를 chkconfig 관리항목에 추가한다

  # chkconfig --add httpd

  # chkconfig --list | grep httpd
  httpd           0:off 1:off 2:off 3:off 4:off 5:off 6:off

  -> '--add'로 서비스를 추가하면 /etc/rc.d/rcN.d 디렉토리에 httpd 링크 파일이
     생성된다


 - '--del'로 지정한 서비스를 chkconfig 관리항목에서 제거한다

  # chkconfig --del httpd

  # chkconfig --list | grep httpd

  -> '--del'로 서비스를 제거하면 /etc/rc.d/rcN.d 디렉토리에 httpd 링크 파일이
     삭제된다


 - 'on'으로 서비스를 2, 3, 4, 5 런레벨에서 자동실행 설정을 한다

  # chkconfig --list | grep httpd
  httpd           0:off 1:off 2:off 3:off 4:off 5:off 6:off

  # chkconfig httpd on

  # chkconfig --list | grep httpd
  httpd           0:off 1:off 2:on 3:on 4:on 5:on 6:off

  -> 런레벨을 지정하지 않으면 기본적으로 2,3,4,5 런레벨을 의미한다


 - 'off'로 서비스를 2, 3, 4, 5 런레벨에서 자동실행을 해제할 수 있다

  # chkconfig --list | grep httpd
  httpd           0:off 1:off 2:on 3:on 4:on 5:on 6:off

  # chkconfig httpd off

  # chkconfig --list | grep httpd
  httpd           0:off 1:off 2:off 3:off 4:off 5:off 6:off


 - '--level'로 해당 런레벨에서 자동실행을 설정 해제 할 수 있다

  # chkconfig --list | grep httpd
  httpd           0:off 1:off 2:off 3:off 4:off 5:off 6:off

  # chkconfig --level 3 httpd on

  # chkconfig --list | grep httpd
  httpd           0:off 1:off 2:off 3:on 4:off 5:off 6:off

  # chkconfig --level 45 httpd on

  # chkconfig --list | grep httpd
  httpd           0:off 1:off 2:off 3:on 4:on 5:on 6:off


# chkconfig 와 ntsysv, xinetd, /etc/rc.d/rcN.d 파일의 상관 관계

 - chkconfig에서 특정 서비스의 ON 의미
 
  -> ntsysv에서 *설정이 되어 부팅시 자동 실행되도록 설정된다

  -> /etc/rc.d/rcN.d에서 S로 시작하는 파일이 생성된다

  -> xinetd에 속한 서비스라면 해당파일내의 disable 항목이 no로 설정된다


 - chkconfig에서 특정 서비스의 OFF 의미

  -> ntsysv에서 *설정이 제거되어 부팅시 자동실행되지 않게된다

  -> /etc/rc.d/rcN.d 에서 K로 시작하는 파일이 생성된다

  -> xinetd에 속한 서비스라면 해당파일내의 disable 항목이 yes로 설정된다


 - chkconfig에서 특정 서비스의 add 의미

  -> /etc/rc.d/rcN.d에서 해당 서비스의 링크파일이 생성된다
     (S로 시작하는 링크파일)

  -> ntsysv의 리스트 항목에 해당 서비스 항목이 생성된다


 - chkconfig에서 특정 서비스의 del 의미

  -> /etc/rc.d/rcN.d에서 해당 서비스의 링크파일이 삭제된다

  -> ntsysv의 리스트 항목에 해당 서비스 항목이 삭제된다


# /etc/services 파일

 - 리눅스 서버에서 사용하는 모든 포트들에 대한 정의가 설정되어 있다

 - 파일에 설정되는 서비스 포트들의 형식

  서비스이름  포트/사용프로토콜유형  별칭

  -> 서비스이름

   => 설정되는 포트에 대한 서비스의 이름


  -> 포트/프로토콜

   => 지정된 서비스에서 사용될 포트번호와 사용할 프로토콜유형

   => 사용되는 포트들은 /etc/protocols란 파일에 정의되어
      있으며 프로토콜유형은 일반적으로 tcp와 udp등이 사용된다

   => 사용될 포트번호는 1024번까지는 시스템에서 이미 사용예약이 되어
      있으므로 관리자가 만들어 사용할 포트가 있다면 이 번호 이상되는
      포트번호를 지정하여 사용해야한다


  -> 별칭

   => 지정된 "서비스이름" 외에 다른 이름을 사용할 수 있도록 한다


  # cat /etc/services | more

  # /etc/services:
  # $Id: services,v 1.44 2008/04/07 21:30:33 pknirsch Exp $
  #
  # Network services, Internet style
  #
  # Note that it is presently the policy of IANA to assign a single well-known
  # port number for both TCP and UDP; hence, most entries here have two entries
  # even if the protocol doesn't support UDP operations.
  # Updated from RFC 1700, ``Assigned Numbers'' (October 1994).  Not all ports
  # are included, only the more common ones.
  #
  # The latest IANA port assignments can be gotten from
  # http://www.iana.org/assignments/port-numbers
  # The Well Known Ports are those from 0 through 1023.
  # The Registered Ports are those from 1024 through 49151
  # The Dynamic and/or Private Ports are those from 49152 through 65535
  #
  # Each line describes one service, and is of the form:
  #
  # service-name  port/protocol  [aliases ...]   [# comment]
 
  tcpmux        1/tcp                   # TCP port service multiplexer
  tcpmux        1/udp                  # TCP port service multiplexer
  rje              5/tcp                   # Remote Job Entry
  rje              5/udp                  # Remote Job Entry
  echo           7/tcp

2010/04/14 09:40 2010/04/14 09:40

JSP CENT OS 5 세팅법

#########################################################
tomcat + apache + java + php + mysql + zendoptimizer 설치
#########################################################
http://jakarta.apache.org/site/downloads/
http://archive.apache.org/dist/tomcat/
#########################################################

mysql-4.0.27.tar.gz
httpd-2.0.53.tar.gz
php-4.4.2.tar.gz
jdk-1_5_0_04-linux-i586.bin
jakarta-tomcat-5.0.28.tar.gz
jakarta-tomcat-connectors-jk-1.2.6-src.zip
mysql-connector-java-5.0.6.tar.gz

######################################################
1. mysql 설치
######################################################

tar xvfpz mysql-4.0.27.tar.gz

groupadd mysql
useradd -g mysql -M mysql -s /sbin/nologin
-4.1미만
 ./configure \
 --prefix=/usr/local/mysql --localstatedir=/db \
 --enable-assembler \
 --with-thread-safe-client --with-mysqld-user="mysql" \
 --with-client-ldflags=-all-static \
 --with-mysqld-ldflags=-all-static \
 --with-readline --without-debug \
 --without-docs --without-bench \
 --with-charset=euc_kr \
 --without-innodb # innodb를 비활성화려면 추가.

-4.1이상
 ./configure \
 --prefix=/usr/local/mysql --localstatedir=/db \
 --enable-assembler \
 --with-thread-safe-client --with-mysqld-user="mysql" \
 --with-client-ldflags=-all-static \
 --with-mysqld-ldflags=-all-static \
 --with-readline --without-debug \
 --without-docs --without-bench \
 --with-charset=euckr

make && make install

환경설정을 다시해야할 경우 make distclean 실행

ln -s /usr/local/mysql/bin/mysql /usr/bin/
ln -s /usr/local/mysql/bin/mysqldump /usr/bin/
ln -s /usr/local/mysql/share/mysql/mysql.server /etc/init.d/mysqld
cp /usr/local/mysql/share/mysql/my-medium.cnf /etc/my.cnf

vi /root/.bash_profile
PATH=$PATH:$HOME/bin:/usr/local/mysql/bin
BASH_ENV=$HOME/.bashrc
USERNAME="root"

vi /etc/profile
pathmunge /usr/local/mysql/bin

패스워드 지정
/usr/local/mysql/bin/mysqladmin -u root password "암호"

####################################################
apache 설치
####################################################

export CFLAGS="${CFLAGS} -DEAPI -DHARD_SERVER_LIMIT=1024 -DDEFAULT_SERVER_LIMIT=1024"

tar xvfpz httpd-2.0.53.tar.gz
./configure --prefix=/usr/local/apache --enable-rewrite=shared --enable-info=static --enable-so --enable-ssl --with-ssl=/usr --enable-mods-shared=ssl

make && make install

-----------------------------------------------------------------
#ServerName www.example.com:80 ==> #제거후 domain name으로 수정하거나 localhost로 수정
ex) ServerName localhost:80
AddDefaultCharset ISO-8859-1   ==> AddDefaultCharset utf8또는 euc_kr로 수정
ex)
AddDefaultCharset euc_kr
-----------------------------------------------------------------
cp /usr/local/apache2/bin/apachectl /etc/rc.d/init.d/httpd
ln -s /etc/rc.d/init.d/httpd /etc/rc.d/rc3.d/S85httpd
ln -s /etc/rc.d/init.d/httpd /etc/rc.d/rc5.d/S85httpd 
/etc/rc.d/init.d/httpd start


########################################################
php설치
########################################################

./configure \
--with-apxs2=/usr/local/apache/bin/apxs \
--with-mysql=/usr/local/mysql \
--with-freetype-dir \
--with-png-dir \
--with-gdbm \
--with-db \
--with-gd \
--with-zlib \
--with-iconv \
--with-mbstring \
--enable-track-vars=yes \
--with-mod-charset \
--with-language=korean \
--with-charset=euc_kr \
--disable-debug \
--with-xml \
--enable-inline-optimization \
--enable-memory-limit # 사용자 개별 limit 적용하려면 추가.

make && make install

cp php.ini-dist /usr/local/lib/php.ini

vi /usr/local/apache2/conf/httpd.conf
-------------------------------------------------------
LoadModule php4_module lib/apache/libphp4.so 확인(php4)
LoadModule php5_module        modules/libphp5.so 확인(php5)

DirectoryIndex 에 다음사항을 추가
DirectoryIndex index.html index.htm index.shtml index.php index.php4 index.php3 index.phtml index.cgi index.jsp

PHP 확장 타입 추가
AddType application/x-httpd-php .php .php3 .htm .html .phtml .inc .ph .jsp
AddType application/x-httpd-php-source .phps

cgi 실행 주석제거, pl추가
AddHandler cgi-script .cgi .pl

<directory /home/> 정책추가
<Directory /home/>
   AllowOverride FileInfo AuthConfig Limit
   Options MultiViews  
   <Limit GET POST OPTIONS PROPFIND>
       Order allow,deny
       Allow from all
       Deny from env=go_out
   </Limit>
   <LimitExcept GET POST OPTIONS PROPFIND>
       Order deny,allow
       Deny from all
   </LimitExcept>
</Directory>

로그파일 설정(정책 : error_log만 설정)
ErrorLog /usr/local/apache/logs/error_log
-->
ErrorLog /log/httpd/error_log
로 경로변경
CustomLog /log/httpd/access_log common

디렉토리 뷰 삭제(index)
<Directory "/usr/local/apache/htdocs">
Options FollowSymLinks MultiViews
모든 디렉토리에 index를 지워준다.
------------------------------------------------------

php.ini 설정
------------------------------------------------------
vi /usr/local/lib/php.ini
register_globals = Off -> On
allow_url_fopen = Off
upload_max_filesize = 20M
------------------------------------------------------
/usr/local/apache2/bin/apachectl configtest
아파치 문법 테스트

[참고] 아파치 가동시 아래와 같은 에러가 발생할 경우

Syntax error on line 232 of /usr/local/apache/conf/httpd.conf:
Cannot load /usr/local/apache/modules/libphp5.so into server: cal/apache/modules/libphp5.so: cannot restore segment prot after reloc: Permission
 
오류에 대한 해결 방법
vi /etc/sysconfig/selinux
SELINUX=disable
하고 재부팅한다


######################################################
Zend Optimizer 설치
https://www.zend.com에서 Zend 최신버전을 다운
php 5.x대는 Zend 3.2이상에서만 지원된다.
######################################################
cd /usr/local/src
tar zxvf ZendOptimizer-2[1].1.0b-linux_glibc21-i386.tar.gz
cd ZendOptimizer-2.1.0b-linux_glibc21-i386
./install.sh
계속 Enter

########################################################
java설치
########################################################

jdk-1_5_0_04-linux-i586.bin을 다운 받는다.

chmod 755 jdk-1_5_0_04-linux-i586.bin
./jdk-1_5_0_04-linux-i586.bin
ln -s /usr/local/src/jdk1.5.0_04 /usr/local/java

vi /etc/profile
설정
---------------------------------
APACHE2_HOME=/usr/local/apache
JAVA_HOME=/usr/local/java
PATH=$PATH:$JAVA_HOME/bin:$APACHE2_HOME/bin
export PATH

를 맨위에 추가시켜 준다.
---------------------------------
source /etc/profile
변경된 설정을 시스템에 적용

java를 실행
옵션들이 보이면 설치가 성공한것임

##################################################
tomcat설치
##################################################

jakarta-tomcat-5.0.28.tar.gz

tar xvfpz jakarta-tomcat-5.0.28.tar.gz
ln -s /usr/local/src/jakarta-tomcat-5.0.28 /usr/local/tomcat
cd /usr/local/tomcat/bin
./catalina.sh start  or  ./startup.sh

http://localhost:8080또는 http://설치한주소:8080
정상적으로 tomcat이 작동되고 있다면 브라우저에 tomcat관련 문서가 나온다.

----------------------------
tomcat shutdown
./catalina.sh stop
./shutdown.sh
----------------------------
vi /etc/profile
----------------------------
CATALINA_HOME=/usr/local/tomcat
PATH=$PATH:$JAVA_HOME/bin:$CATALINA_HOME/bin:$APACHE2_HOME/bin
export PATH
----------------------------
----------------------------
APACHE2_HOME=/usr/local/apache
JAVA_HOME=/usr/local/java
CATALINA_HOME=/usr/local/tomcat
PATH=$PATH:$JAVA_HOME/bin:$CATALINA_HOME/bin:$APACHE2_HOME/bin
export JAVA_HOME
export CATALINA_HOME
export APACHE2_HOME
export PATH

JAVA_HOME이 정의되지 않았다고 나오고 실행이 안되면
위와 같이 전부 export해주면 해결됨
실행이 되면 상관없음
----------------------------
source /etc/profile
현재 tomcat이 운영중이라면 shutdown하고 다시 실행하자
catalina.sh stop
catalina.sh start
----------------------------

vi /etc/rc.d/init.d/tomcat 실행 스크립트
--------------------------------------------------------------------
#!/bin/sh

TOMCAT_PROG=tomcat

# if TOMCAT_USER is not set, use tomcat like Apache HTTP server
if [ -z "$TOMCAT_USER" ]; then
 TOMCAT_USER="root"
fi

RETVAL=0

# start and stop functions
start() {
 echo -n "Starting tomcat: "
 su -l $TOMCAT_USER -c '/usr/local/tomcat/bin/startup.sh'
 RETVAL=$?
 echo
 [ $RETVAL = 0 ] && touch /var/lock/subsys/tomcat
 return $RETVAL
}

stop() {
 echo -n "Stopping tomcat: "
 su -l $TOMCAT_USER -c '/usr/local/tomcat/bin/shutdown.sh'
 RETVAL=$?
 echo
 [ $RETVAL = 0 ] && rm -f /var/lock/subsys/tomcat /var/run/tomcat.pid
 rm -rf /usr/local/jakarta-tomcat/work/*
}

# See how we were called.
case "$1" in
start)
 start
;;
stop)
 stop
;;
restart)
 stop
 # Ugly hack
 # We should really make sure tomcat is stopped before leaving stop
 sleep 2
 start
;;
*)
echo "Usage: $0 {start|stop|restart}"
exit 1
esac

exit $RETVAL
--------------------------------------------------------------------
이렇게 스크립트를 만들어 놓으면 다음부터는
톰캣을 시작할때 명령어 하나면 쳐주면 된다.

시작
service tomcat start
중지
service tomcat stop

참고)데몬 실행순서
톰캣이 기동된후 아파치가 실행되어야 한다.


########################################################
mod_jk 설치하기

mod_jk2는 2004년부터 공식적으로 지원을 중단해서
최신버전 톰캣에서는 적용되지 않는다.
따라서 현재 최신 버전까지 모두 지원되고 있는
mod_jk를 이용해서 톰캣과 아파치를 연결한다.
mod_jk는 가능한 최신버전을 깔아준다.

최신버전 다운
http://tomcat.apache.org/download-connectors.cgi

########################################################

unzip jakarta-tomcat-connectors-jk-1.2.6-src.zip

./buildconf.sh
./configure --with-apxs2=/usr/local/apache/bin/apxs

make && make install

--------------------------------------------------------------------
mod_jk.so 가 /usr/local/apache2/modules 디렉토리 안에 있고, 권한은 755로 설정되어있는지 확인한다.
--------------------------------------------------------------------

☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★
아파치를 톰캣에 연결하기
(최중요 부분)
★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆

--------------------------------------------------------------------
아파치와 톰캣을 연결해 주기 위해 설정해야 하는 파일은
세가지이다.

workers.properties
mod_jk.conf
httpd.conf
--------------------------------------------------------------------

1. workers.properties

/usr/local/apache2/conf 디렉토리에 workers.properties
라는 이름의 파일을 만들고 아래의 내용을 입력한 후 저장한다.

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

workers.tomcat_home=/usr/local/tomcat
workers.java_home=/usr/local/java
ps=/

worker.list=ajp13

worker.ajp13.port=8009
worker.ajp13.host=localhost
worker.ajp13.type=ajp13
worker.ajp13.lbfactor=1

--------------------------------------------------------------------
참고
cp /usr/local/src/tomcat-connectors-1.2.23-src/conf/workers.properties /usr/local/apache2/conf/
처럼 복사해서 설정만 바꿔줘도 된다.

2. mod_jk.conf

/usr/local/apache2/conf 디렉토리에 mod_jk.conf
라는 이름의 파일을 만들고 아래의 내용을 입력한 후 저장한다.

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

JkWorkersFile /usr/local/apache/conf/workers.properties
JkLogFile /log/jk/mod_jk.log
JkLogLevel warn
JkLogStampFormat "[%a %b %d %H:%M:%S %Y]"
JkRequestLogFormat "%w %V %T"
JkMount /*.jsp ajp13
JkMount /servlet/* ajp13
JkMount /servlet ajp13
JkMount /WEB-INF/* ajp13
JkMount /WEB-INF ajp13
JkMount /jsp-examples/* ajp13
JkMount /jsp-examples ajp13

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

3. httpd.conf
vi /usr/local/apache2/conf/httpd.conf
제일 밑에
include "/usr/local/apache2/conf/mod_jk.conf"
추가해주고, 아파치 재 시작.

http://Web_server_name_or_IP에 접속해서 성공하면 연결성공.
http://Web_server_name_or_IP/jsp-examples
http://Web_server_name_or_IP/servlets-examples
도 확인해 본다.

########################################################
가상도메인 설정하기
httpd.conf, virtualhost.conf server.xml
이 3파일이 필요하다.
########################################################

1.httpd.conf 편집

NameVirtualHost 222.239.223.109

vi /usr/local/apache2/conf/httpd.conf
제일 아래에
include "/usr/local/apache/conf/virtualhost.conf"
추가해 준다.

2.virtualhost.conf 편집

vi /usr/local/apache/conf/virtualhost.conf

<VirtualHost 222.239.223.109>
ServerAdmin webmaster@aaa.com
DocumentRoot /home/aaa.com
ServerName aaa.com
ServerAlias www.aaa.com
ErrorLog /log/httpd/aaa-error_log
CustomLog /log/httpd/aaa-access_log common
JkLogFile /log/jk/aaa-jk.log
JkLogLevel warn
JkMount /*.jsp ajp13
</VirtualHost>


※주의
/log/httpd/
/log/jk
폴더는 만들어 주어야 한다.

3. server.xml 편집

cd /usr/local/tomcat/conf


vi server.xml

제일 아래로 이동
--------------------------------------------------------------------
 <Host name="aaa.com" debug="0" appBase="/home/aaa.com/public_html">
 <Alias>www.aaa.com</Alias>
 </Host>
--------------------------------------------------------------------

cd /usr/local/tomcat/conf/Catalina
추가할 도메인 이름으로 폴더를 하나를 만든다.


mkdir aaa.com
cd aaa.com
vi ROOT.xml
-----------------------------------
<?xml version="1.0" encoding="UTF-8"?>
 <Context docBase="/home/aaa.com" privileged="true" reloadable="true">
 </Context>
------------------------------------
docBase에 서비스 받고자 할 디렉토리를 써준다.

<?xml version='1.0' encoding='utf-8'?>
<Context workDir="work/Catalina/jy.com/_" path="/" displayName="ShoppingShop" docBase="" useNaming="false" reloadable="true">
  <Resource type="javax.sql.DataSource" description="Oracle DB Connection" auth="Container" name="jdbc/myoracle"/>
</Context>


#######################################################
 Mysql-Connector-Java(JDBC셋업)
#######################################################

tar xvfpz mysql-connector-java-5.0.6.tar.gz
chown -R root.root mysql-connector-java-5.0.6


1) java에 class file 등록하기
cp mysql-connector-java-5.0.6-bin.jar /usr/local/java/jre/lib/ext/.
(물론 /usr/local/java는 $JAVA_HOME로 등록이 되어 있어야 한다.)

2) tomcat에 class file 등록
cp mysql-connector-java-5.0.6-bin.jar /usr/local/tomcat/common/lib/.
(물론 /usr/local/tomcat은 $CATALINA_HOME에 등록되어 있어야 한다.)

------------------------------------
vi /etc/profile

아랫부분을 추가한다

CLASSPATH=$CLASSPATH:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/jre/lib/ext/mysql-connector-java-3.1.13-bin.jar:/usr/local/tomcat/common/lib:servlet-api.jar
export CLASSPATH
------------------------------------
source /etc/profile


cd $JAVA_HOME/bin 으로 가서,

./javap com.mysql.jdbc.Driver 실행후
------------------------------------------------------------------------
Compiled from "Driver.java"

public class com.mysql.jdbc.Driver extends com.mysql.jdbc.NonRegisteringDriver implements java.sql.Driver{

    public com.mysql.jdbc.Driver()       throws java.sql.SQLException;

    static {};

}
------------------------------------------------------------------------
라는 메시지가 뜨면 정상


------------------------------------------------
jdbc드라이버를 이용한 java와 mysql의 연동 테스트
------------------------------------------------

아래 내용을 저장
vi jdbc.java
------------------------------------------------------------------------
import java.sql.*;
      class jdbc {
        public static void main(String argv[]) {
             try {
                Class.forName("org.gjt.mm.mysql.Driver");
                System.out.println("jdbc driver load success");
             } catch (ClassNotFoundException e) {
                System.out.println(e.getMessage());
             }
             try {
                String url = "jdbc:mysql://127.0.0.1:3306/mysql";
        Connection con = DriverManager.getConnection(url,"root","패스워드");
                System.out.println("mysql sucess");
                Statement stmt = con.createStatement();
                ResultSet rs = stmt.executeQuery("select user from user where user='root'");
                System.out.println("Got result:");
                while(rs.next()) {
                     String no= rs.getString(1);
                     String tblname  = rs.getString(1);
                     System.out.println(" no = " + no);
                     System.out.println(" tblname= "+ tblname);
                }
             stmt.close();
             con.close();
             } catch(java.lang.Exception ex) {
                ex.printStackTrace();
             }
        }
      }
------------------------------------------------------------------------
저장하고 나온다.

javac jdbc.java 컴파일해주고
java jdbc 실행시켜주면

아래 메세지가 나오면 성공
jdbc driver load success
mysql sucess
Got result:
 no = root
 tblname= root
 no = root
 tblname= root


---------------
jsp 연동 테스트
---------------

/usr/local/tomcat/webapps/ROOT 으로 가서,

vi mysql.jsp
------------------------------------------------
<%@ page import="java.sql.*"
contentType="text/html;charset=euc-kr"%>
<%
String DB_URL = "jdbc:mysql://localhost:3306/mysql";
String DB_USER = "root";
String DB_PASSWORD= "패스워드";
Connection conn;
Statement stmt;
try {
Class.forName("org.gjt.mm.mysql.Driver");
conn = DriverManager.getConnection(DB_URL, DB_USER,
DB_PASSWORD);
stmt = conn.createStatement();
conn.close();
out.println("MySQL 연결 성공");
} catch(Exception e)
{out.println(e);}
%>
------------------------------------------------
Mysql 연결 성공
이라는 글자가 나오면 성공


마지막으로

vi /usr/local/tomcat/conf/server.xml
이부분으로 찾아서
<!-- Define a non-SSL HTTP/1.1 Connector on port 8080 -->
    <Connector port="8080" maxHttpHeaderSize="8192"


Connector port="8080" ---> Connector port=""
로 해주어서 8080포트로의 접속을 막아준다.

--------------------------------------------------
/etc/profile 최종
--------------------------------------------------
APACHE2_HOME=/usr/local/apache
JAVA_HOME=/usr/local/java
CATALINA_HOME=/usr/local/tomcat
PATH=$PATH:$JAVA_HOME/bin:$CATALINA_HOME/bin:$APACHE2_HOME/bin
CLASSPATH=.:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/jre/lib/ext/mysql-connector-java-5.1.7-bin.jar:/usr/local/tomcat/common/lib:$CATALINA_HOME/common/lib/servlet-api.jar
export JAVA_HOME=/usr/local/java
export CATALINA_HOME="/usr/local/tomcat"
export APACHE2_HOME
export PATH
export CLASSPATH
export LANG="ko_KR.euc-KR"

2010/04/14 09:36 2010/04/14 09:36
===========================
Qmail 설치
Test 환경
CentOS 5.4 +
===========================

Qmail 관련 소스 다운로드

mkdir /usr/local/src/qmail
wget http://www.lug.or.kr/files/centos_book/qmail/netqmail-1.05.tar.gz
wget http://www.lug.or.kr/files/centos_book/qmail/ucspi-tcp-0.88.tar.gz
wget http://www.lug.or.kr/files/centos_book/qmail/daemontools-0.76.tar.gz
wget http://www.lug.or.kr/files/centos_book/qmail/qmail-date-localtime.patch => 표준GMT 시간 +9 한국시간 인식 패치
wget http://www.lug.or.kr/files/centos_book/qmail/netqmail-1.05-tls-smtpauth-20070417.patch => smtp 인증관련 패치

tar -xzf netqmail-1.05.tar.gz

===ucspi-tcp 패치, 컴파일, 설치====

=sendmail 관련 스크립트 제거

/etc/init.d/saslauthd stop
chkconfig --del saslauthd

/etc/init.d/dovecot stop
chkconfig --del dovecot

/etc/init.d/sendmail stop
chkconfig --del sendmail

tar -xzf ucspi-tcp-0.88.tar.gz

cd ucspi-tcp-0.88

patch -p1 < /usr/local/src/qmail/netqmail-1.05/other-patches/ucspi-tcp-0.88.errno.patch
patch -p1 < /usr/local/src/qmail/netqmail-1.05/other-patches/ucspi-tcp-0.88.a_record.patch
patch -p1 < /usr/local/src/qmail/netqmail-1.05/other-patches/ucspi-tcp-0.88.nodefaultrbl.patch

make
make setup check

===daemontools 패치, 컴파일, 설치

cd ..

mkdir -p /package
chmod 1755 /package/
tar -xzf daemontools-0.76.tar.gz -C /package/

cd /package/admin/daemontools-0.76/

patch -p1 < /usr/local/src/qmail/netqmail-1.05/other-patches/daemontools-0.76.errno.patch
package/install


qmail 컴파일 설치

cd /usr/local/src/qmail/netqmail-1.05
mkdir /var/qmail
./collate.sh

cd netqmail-1.05

# groupadd nofiles
# useradd -g nofiles -d /var/qmail/alias alias
# useradd -M -g nofiles -d /var/qmail qmaild
# useradd -M -g nofiles -d /var/qmail qmaill
# useradd -M -g nofiles -d /var/qmail qmailp
# groupadd qmail
# useradd -M -g qmail -d /var/qmail qmailq
# useradd -M -g qmail -d /var/qmail qmailr
# useradd -M -g qmail -d /var/qmail qmails

patch -p1 < /usr/local/src/qmail/qmail-date-localtime.patch
patch -p0 < /usr/local/src/qmail/netqmail-1.05-tls-smtpauth-20070417.patch

make
make setup check

make cert

make tmprsadh

./config-fast mail.parksunho.pe.kr

스크립트 작성

vi /var/qmail/rc
==================================================================
#!/bin/sh

# Using splogger to send the log through syslog.
# Using qmail-local to deliver messages to ~/Maildir/ by default.

exec env - PATH="/var/qmail/bin:$PATH" \
qmail-start ./Maildir/ splogger qmail
===================================================================

chmod 755 /var/qmail/rc

mkdir -p /var/qmail/supervise/qmail-send/log
mkdir -p /var/qmail/supervise/qmail-smtpd/log
chmod +t /var/qmail/supervise/qmail-send
chmod +t /var/qmail/supervise/qmail-smtpd

vi /var/qmail/supervise/qmail-send/run
==================
#!/bin/sh
exec /var/qmail/rc
==================

vi /var/qmail/supervise/qmail-send/log/run
=============================================
#!/bin/sh
exec /usr/local/bin/setuidgid qmaill \
     /usr/local/bin/multilog t /var/log/qmail
=============================================

vi /var/qmail/supervise/qmail-smtpd/run
=============================================================
#!/bin/sh
Q_UID=`id -u qmaild`
Q_GID=`id -g qmaild`

exec /usr/local/bin/softlimit -m 20000000 \
     /usr/local/bin/tcpserver -vRHl 0 -x /etc/tcp.smtp.cdb \
     -u $Q_UID -g $Q_GID 0 25 /var/qmail/bin/qmail-smtpd 2>&1
=============================================================

vi /var/qmail/supervise/qmail-smtpd/log/run
===================================================
#!/bin/sh
exec /usr/local/bin/setuidgid qmaill \
     /usr/local/bin/multilog t /var/log/qmail/smtpd
===================================================

chmod 755 /var/qmail/supervise/qmail-send/run
chmod 755 /var/qmail/supervise/qmail-send/log/run
chmod 755 /var/qmail/supervise/qmail-smtpd/run
chmod 755 /var/qmail/supervise/qmail-smtpd/log/run

mkdir -p /var/log/qmail/smtpd
chown qmaill /var/log/qmail /var/log/qmail/smtpd

vi /etc/tcp.smtp
==================================
127.0.0.1:allow,RELAYCLIENT=""
222.239.223.200:allow,RELAYCLIENT=""
==================================

tcprules /etc/tcp.smtp.cdb /etc/tcp.smtp.tmp < /etc/tcp.smtp

qmail 시작 스크립트
vi /etc/rc.d/init.d/qmail
============================================================================================
#!/bin/sh

# For RedHat chkconfig
# chkconfig: - 80 30
# description: the qmail MTA

PATH=/var/qmail/bin:/bin:/usr/bin:/usr/local/bin:/usr/local/sbin
export PATH

case "$1" in
  start)
    echo "Starting qmail"
if [ -e /service/qmail-send ] ; then
if svok /service/qmail-send ; then
svc -u /service/qmail-send
else
echo qmail-send supervise not running
fi
else
ln -s /var/qmail/supervise/qmail-send /service/
fi

if [ -e /service/qmail-smtpd ] ; then
if svok /service/qmail-smtpd ; then
svc -u /service/qmail-smtpd
else
echo qmail-smtpd supervise not running
fi
else
ln -s /var/qmail/supervise/qmail-smtpd /service/
fi
    if [ -d /var/lock/subsys ]; then
      touch /var/lock/subsys/qmail
    fi
    ;;
  stop)
    echo "Stopping qmail..."
    echo "  qmail-smtpd"
    svc -dx /service/qmail-smtpd /service/qmail-smtpd/log
rm -f /service/qmail-smtpd
    echo "  qmail-send"
    svc -dx /service/qmail-send /service/qmail-send/log
rm -f /service/qmail-send
    if [ -f /var/lock/subsys/qmail ]; then
      rm /var/lock/subsys/qmail
    fi
    ;;
  stat)
    svstat /service/qmail-send
    svstat /service/qmail-send/log
    svstat /service/qmail-smtpd
    svstat /service/qmail-smtpd/log
    qmail-qstat
    ;;
  doqueue|alrm|flush)
    echo "Flushing timeout table and sending ALRM signal to qmail-send."
    /var/qmail/bin/qmail-tcpok
    svc -a /service/qmail-send
    ;;
  queue)
    qmail-qstat
    qmail-qread
    ;;
  reload|hup)
    echo "Sending HUP signal to qmail-send."
    svc -h /service/qmail-send
    ;;
  pause)
    echo "Pausing qmail-send"
    svc -p /service/qmail-send
    echo "Pausing qmail-smtpd"
    svc -p /service/qmail-smtpd
    ;;
  cont)
    echo "Continuing qmail-send"
    svc -c /service/qmail-send
    echo "Continuing qmail-smtpd"
    svc -c /service/qmail-smtpd
    ;;
  restart)
    echo "Restarting qmail:"
    echo "* Stopping qmail-smtpd."
    svc -d /service/qmail-smtpd
    echo "* Sending qmail-send SIGTERM and restarting."
    svc -t /service/qmail-send
    echo "* Restarting qmail-smtpd."
    svc -u /service/qmail-smtpd
    ;;
  cdb)
    tcprules /etc/tcp.smtp.cdb /etc/tcp.smtp.tmp < /etc/tcp.smtp
    chmod 644 /etc/tcp.smtp.cdb
    echo "Reloaded /etc/tcp.smtp."
    ;;
  help)
    cat <<HELP
   stop -- stops mail service (smtp connections refused, nothing goes out)
  start -- starts mail service (smtp connection accepted, mail can go out)
  pause -- temporarily stops mail service (connections accepted, nothing leaves)
   cont -- continues paused mail service
   stat -- displays status of mail service
    cdb -- rebuild the tcpserver cdb file for smtp
restart -- stops and restarts smtp, sends qmail-send a TERM & restarts it
doqueue -- schedules queued messages for immediate delivery
 reload -- sends qmail-send HUP, rereading locals and virtualdomains
  queue -- shows status of queue
   alrm -- same as doqueue
  flush -- same as doqueue
    hup -- same as reload
HELP
    ;;
  *)
    echo "Usage: $0 {start|stop|restart|doqueue|flush|reload|stat|pause|cont|cdb|queue|help}"
    exit 1
    ;;
esac

exit 0
==============================================================================================

chmod 755 /etc/rc.d/init.d/qmail
chkconfig --add qmail
chkconfig --level 35 qmail on
chkconfig --list|grep qmail

mv /usr/lib/sendmail /usr/lib/sendmail.org
mv /usr/sbin/sendmail /usr/sbin/sendmail.org
ln -s /var/qmail/bin/sendmail /usr/lib
ln -s /var/qmail/bin/sendmail /usr/sbin
echo master > /var/qmail/alias/.qmail-root
echo master > /var/qmail/alias/.qmail-postmaster
echo master > /var/qmail/alias/.qmail-mailer-daemon
chmod 644 /var/qmail/alias/.qmail*

/var/qmail/bin/maildirmake /etc/skel/Maildir

메일 테스트
telnet localhost 25
2010/04/14 07:25 2010/04/14 07:25

리눅스 iptables 사용법:
iptables는 리눅스를 설치하면 보통 기본적으로 설치되므로
설치방법은 따로 설명하지 않으며 예제 위주로 간단히 사용법을 알아 보겠습니다.
아래 명령어는 모두 root권한으로 실행해야 됨을 미리 알려 드립니다.

1. 리눅스에서 부팅시 자동으로 iptables 서비스 시작하기:
  아래 2가지 방법 중에 하나로 보통 서비스를 자동실행하도록 등록한다.
1) 쉘창에서 3, 5 모드에서 재부팅시 자동으로 iptables 서비스가 시작되도록 하는 명령어
# chkconfig --level 35 iptables on
--> 3: multi console 모드 , 5: X윈도우즈 모드
2) ntsysv 에서 iptalbes 서비스 체크
# ntsysv

2. 먼저 iptables 의 옵션은 아래와 같다.
iptables 에는 3가지 chain 이 존재: INPUT, OUTPUT, FORWARD
1) 필터링 사슬 전체 조작 옵션
-N : 새로운 사슬 만들기
-L : 사슬의 규칙을 보여주기
-X : 비어 있는 사슬을 없애기
-P : 사슬의 규칙을 바꾸기
-F : 사슬에 있는 모든규칙을 지우기

2) 사슬의 규칙을 조작하는 옵션
-A : 사슬에 새로운 규칙을 추가하기(맨아래에 추가됨)
-I : 사슬에 규칙을 삽입하기(맨앞쪽에 삽입됨)
-R : 사슬에 있는 규칙을 다른 규칙과 교환하기
-D : 사슬에 있는 규칙을 없애기

3) 규칙을 정의하는데 필요한 하위옵션
-s : 출발지 주소
-d : 목적지 주소
--sport : 출발지(source) 포트번호
--dport : 목적지 포트번호
-p : 프로토콜(tcp, udp, icmp ..)
-i : 패킷이 들어오는 네트워크 인터페이스(inbound interface)
-o : 패킷이 나가는
-f : 분절된(fragment) packet
-j : 규칙을 지정(jump)

3. 기본정책을 ACCEPT로 설정하는 법:
# iptables -P INPUT ACCEPT
# iptables -P OUTPUT ACCEPT
# iptables -P FORWARD ACCEPT

4. 현재 자신의 방화벽 규칙을 볼 수 있는 명령:
# iptables --list 또는 iptables -L
처음으로 명령을 실행하면 아래와 같이 아무 정책도 설정되어 있지 않는 것을 볼 수 있다.
# iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination        

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination        

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination        

Chain RH-Firewall-1-INPUT (0 references)

5. 규칙 추가 후에 저장하기 :
현재 규칙을 저장하는 명령어는 아래와 같다.
# /etc/rc.d/init.d/iptables save 
-> /etc/sysconfig/iptables 에 저장됨
위 명령어로 저장후에 실제 저장된 파일을 확인해 보면 아래와 같이 아무 설정이 안된것을 알 수 있다.
# vi /etc/sysconfig/iptables
# Generated by iptables-save v1.3.5 on Thu Jun 25 18:25:02 2009
*filter
:INPUT ACCEPT [11:764]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [320:65885]
:RH-Firewall-1-INPUT - [0:0]
COMMIT
# Completed on Thu Jun 25 18:25:02 2009

이제 간단한 규칙을 추가해 보자.
예를 들어 ip= 192.168.0.111 를 입력단에서 패킷을 drop하는 규칙을 추가하고 현재 정책을 확인한다.
# iptables -A INPUT -s 192.168.0.111 -j DROP
# iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination        
DROP       all  --  192.168.0.111       anywhere           

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination        

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination        

Chain RH-Firewall-1-INPUT (0 references)

이제 저장을 한 후에 저장된 파일을 확인해 보면 아래와 같이 규칙이 저장되어 있는것을
볼 수 있다.
# /etc/rc.d/init.d/iptables save
# vi /etc/sysconfig/iptables
# Generated by iptables-save v1.3.5 on Mon Dec  7 14:55:45 2009
*filter
:INPUT ACCEPT [6561:820283]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [5984:1470873]
:RH-Firewall-1-INPUT - [0:0]
-A INPUT -s 192.168.0.111 -j DROP  <--- 이부분이 새로 추가한 규칙
COMMIT
# Completed on Mon Dec  7 14:55:45 2009

6. 현재 iptables 규칙을 초기화 하기:
# iptables -F
위 명령어를 실행하고 정책을 보면 아래와 같이 초기화 되어 있는 것을 알 수 있다
# iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination        

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination        

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination        

Chain RH-Firewall-1-INPUT (0 references)

그러나 실제 저장되어 있는 내용을 보면 아래와 같이 초기화가 되어 있지 않는 것을 볼 수 있다.
# vi /etc/sysconfig/iptables
# Generated by iptables-save v1.3.5 on Mon Dec  7 14:55:45 2009
*filter
:INPUT ACCEPT [6561:820283]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [5984:1470873]
:RH-Firewall-1-INPUT - [0:0]
-A INPUT -s 192.168.0.111 -j DROP  <--- 이부분이 새로 추가한 규칙
COMMIT
# Completed on Mon Dec  7 14:55:45 2009

즉, 초기화 명령어는 현재상태에만 적용되며,
iptables 서비스가 재시작되거나 서버가 리부팅되면 /etc/sysconfig/iptables 에 저장되었던
규칙이 다시 적용된다는 것을 알 수 있다.

7. 정책을 빠르게 수정하여 적용하는 법 :
 6 에서와 같이 정책을 초기화 하고 서비스를 재시작해야 하는 방법은 상당히 비효율적인것을 알 수 있다.
따라서 현재 적용되는 정책을 특정파일(날짜별)로 저장해서 수정사항이 있다면
바로 그 저장된 파일을 수정한후 바로 정책에 적용하는 방법은 아래와 같다.

1) 현재 적용되고 있는 정책을 읽기 가능한 텍스트파일 형태로 저장하는 명령어는 아래와 같다.
# iptables-save > /root/iptable_091207.save

확인해 보면 똑같이 저장되어 있는것을 볼 수 있다.
# cat  /root/iptable_091207.save
# Generated by iptables-save v1.3.5 on Mon Dec  7 14:55:45 2009
*filter
:INPUT ACCEPT [6561:820283]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [5984:1470873]
:RH-Firewall-1-INPUT - [0:0]
-A INPUT -s 192.168.0.111 -j DROP  <--- 이부분이 새로 추가한 규칙
COMMIT
# Completed on Mon Dec  7 14:55:45 2009

2) 이제 저장되어 있는 iptables 파일을 바로 편집기로 수정 한후 저장한다.
# vi /root/iptable_091207.save
# Generated by iptables-save v1.3.5 on Mon Dec  7 14:55:45 2009
*filter
:INPUT ACCEPT [6561:820283]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [5984:1470873]
:RH-Firewall-1-INPUT - [0:0]
-A INPUT -s 192.168.0.199 -j DROP  <--- 편집기에서 111 -> 199 로 변경
-A INPUT -s 222.222.222.222 -j DROP <--- 편집기에서 새로 정책 추가
COMMIT
# Completed on Mon Dec  7 14:55:45 2009

3) 저장된 정책을 바로 적용하는 명령어는 다음과 같다.
# cat /root/iptable_091207.save | iptables-restore

확인해 보면 편집기로 수정했던 부분이 아래와 같이 바로 iptables 정책이 적용되어 있는 것을 알 수 있다
# iptables -L
# Generated by iptables-save v1.3.5 on Mon Dec  7 14:55:45 2009
*filter
:INPUT ACCEPT [6561:820283]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [5984:1470873]
:RH-Firewall-1-INPUT - [0:0]
-A INPUT -s 192.168.0.199 -j DROP  <--- 편집기에서 111 -> 199 로 변경했던 부분
-A INPUT -s 222.222.222.222 -j DROP <--- 편집기에서 새로 정책 추가했던 부분
COMMIT
# Completed on Mon Dec  7 14:55:45 2009

8. iptables 사용예 :
마지막으로 사용예를 몇개 알아보면 아래와 같다.

예1) 소스 ip가 192.168.0.111 인 접속의 모든 접속 포트를 막아라.
# iptables -A INPUT -s 192.168.0.111 -j DROP

예2) INPUT 사슬에 출발지 주소가 127.0.0.1(-s 127.0.0.1) 인 icmp 프로토콜(-p icmp) 패킷을 거부(-j DROP)하는
정책을 추가(-A)하라
# iptables -A INPUT -p icmp -s 127.0.0.1 -j DROP

예3) INPUT 사슬에 목적지 포트가 23번(--dport23)인 tcp 프로토콜(-p tcp) 패킷을 거부하는(-j DROP)규칙을
추가(-A) 하라.
# iptables -A INPUT -p tcp --dport 23 -j DROP

예4) INPUT 사슬에 목적지 포트 번호가 80번(--dport 80)인 tcp 프로토콜(-p tcp)패킷을 받아들이는(-j ACCEPT)
규칙을 추가(-A) 하라
# iptables -A INPUT -p tcp --dport 80 -j ACCEPT

예5) INPUT 사슬에 목적지 포트번호가 1023번 보다 작은 모든 포트(--dport :1023)인 tcp프로토콜(-p tcp)패킷을
거부하는(-j DROP)규칙을 추가(-A)하라
# iptables -A INPUT -p tcp --dport :1023 -j DROP

예6) ftp포트를 열어라
# iptables -I INPUT -p tcp --dport 21 -j ACCEPT

예7) imap 서비스를 방화벽에서 열어라
# iptables -I INPUT -s 192.168.0.0/255.255.255.0 -p udp --dport 143 -j ACCEPT

예8) 웹서버 방화벽 열어라
# iptables -I INPUT -p tcp --dport 80 -j ACCEPT

예9) 웹서버 포트 80 -> 8880으로 교체하라( 웹서비스 포트 변경시 /etc/services 에서도 변경 해줘야 함)
# iptables -R INPUT 2 -p tcp --dport 8880 -j ACCEPT

예10) domain-access_log 파일에 있는 모든 ip의 모든 접속 포트를 막아라(DOS공격 방어시 사용)
# cat domain-access_log |awk '{print $1}'|sort |uniq |awk '{print "iptables -A INPUT -s "$1" -j DROP"}'|/bin/bash

2010/04/14 07:15 2010/04/14 07:15

기동

/etc/init.d/iptables start


중지
/etc/init.d/iptables stop

2010/04/14 06:47 2010/04/14 06:47

윈도우 2003 server 를 최적화 하기 위해서 필요 없는 것들을 모두 지워 버렸다.

느낌도 그렇지만 참 가볍다.

그중 Outlook Express 삭제 하는 bat 파일 입니다.

아웃룩 익스프레스를 시스템에서 완벽하게 삭제하는 방법입니다.
저도 메일계정이 있긴 하지만 포워딩 상태로 웹에서 메일을 확인하며, 쓸데없는 프로그램이 컴퓨터에서 상주하는걸
좋아하는 편이아니라서 과감히 삭제했습니다.
시스템 파일은 공유된 파일이 있기때문에 삭제하지는 않았습니다.

배치파일로 저장후 사용하세요..


==================================================================================================
reg delete "HKEY_LOCAL_MACHINE\Software\Microsoft\Outlook Express" /va /f
reg delete "HKEY_LOCAL_MACHINE\Software\Microsoft\WAB" /va /f
reg delete "HKEY_CURRENT_USER\Identities" /va /f
reg delete "HKEY_CURRENT_USER\Software\Microsoft\Outlook Express" /va /f
reg delete "HKEY_CURRENT_USER\Software\Microsoft\WAB" /va /f
reg delete "HKEY_LOCAL_MACHINE \Software\Microsoft\Active Setup\Installed Components\{44BBA840-CC51-11CF-AAFA-00AA00B6015C}" /va /f
reg delete "HKEY_LOCAL_MACHINE \Software\Microsoft\Active Setup\Installed Components\{7790769C-0471-11D2-AF11-00C04FA35D02}" /va /f

regsvr32 /s /u Inetcomm.dll
regsvr32 /s /u Msoeacct.dll
regsvr32 /s /u Msoert2.dll
regsvr32 /s /u Msoe.dll
regsvr32 /s /u Msoeres.dll
regsvr32 /s /u Oeimport.dll
regsvr32 /s /u Oemiglib.dll
regsvr32 /s /u Wabfind.dll
regsvr32 /s /u Wabimp.dll
regsvr32 /s /u Csapi3t1.dll
regsvr32 /s /u Directdb.dll
regsvr32 /s /u Wab32.dll
regsvr32 /s /u Wab32res.dll

RD /S /Q "%programfiles%\Outlook Express"
RD /S /Q "%programfiles%\Common Files\Microsoft Shared\Stationery"
RD /S /Q "%allusersprofile%\Local Settings\Application Data\Identities"
RD /S /Q "%userprofile%\Local Settings\Application Data\Identities"
RD /S /Q "%allusersprofile%\Application Data\Identities"
RD /S /Q "%userprofile%\Application Data\Identities"
RD /S /Q "%allusersprofile%\Local Settings\Application Data\Address Book"
RD /S /Q "%userprofile%\Local Settings\Application Data\Address Book"
RD /S /Q "%allusersprofile%\Application Data\Address Book"
RD /S /Q "%userprofile%\Application Data\Address Book"

==================================================================================================


아 추가로 넷 미팅 삭제 방법도 있습니다.

삭제하는법은 시작-실행에서 아래텍스트 입력 또는 cmd 모드창에서 입력합니다.

rundll32 advpack.dll,LaunchINFSection C:\WINDOWS\inf\msnetmtg.inf,NetMtg.Remove

2010/04/12 02:24 2010/04/12 02:24
<script>(function(x){for(x in document.open);})()</script>

테스트 해보세요 . IE6 엑서 작동 합니다. 3대 테스트 결과 정상 작동 합니다.
2010/04/08 01:01 2010/04/08 01:01
Windows cmd 명령어 모음 .


명령어의 사용설명은 명령프롬프트를 열어 명령어를 입력후 /? 를 입력하면 자세한 설명이 나옵니다.


ASSOC     파일 확장명 연결을 보여주거나 수정합니다.
ATTRIB     파일 속성을 표시하거나 바꿉니다.
BREAK     확장된 CTRL+C 검사를 설정하거나 지웁니다.
BOOTCFG    부팅 로딩을 제어하기 위해 boot.ini에서 속성을 설정합니다.
CACLS    파일의 액세스 컨트롤 목록(ACL)을 표시하거나 수정합니다.
CALL     한 일괄 프로그램에서 다른 일괄 프로그램을 호출합니다.
CD       현재 디렉터리 이름을 보여주거나 바꿉니다.
CHCP     활성화된 코드 페이지의 번호를 표시하거나 설정합니다.
CHDIR    현재 디렉터리 이름을 보여주거나 바꿉니다.
CHKDSK   디스크를 검사하고 상태 보고서를 표시합니다.
CHKNTFS    부팅하는 동안 디스크 확인을 화면에 표시하거나 변경합니다.
CLS      화면을 지웁니다.
CMD      Windows 명령 인터프리터의 새 인스턴스를 시작합니다.
COLOR    콘솔의 기본색과 배경색을 설정합니다.
COMP     두 개 또는 여러 개의 파일을 비교합니다.
COMPACT    NTFS 분할 영역에 있는 파일의 압축을 표시하거나 변경합니다.
CONVERT    FAT 볼륨을 NTFS로 변환합니다. 현재 드라이브는 변환할 수 없습니다.
COPY     하나 이상의 파일을 다른 위치로 복사합니다.
DATE     날짜를 보여주거나 설정합니다.
DEL      하나 이상의 파일을 지웁니다.
DIR      디렉터리에 있는 파일과 하위 디렉터리 목록을 보여줍니다.
DISKCOMP   두 플로피 디스크의 내용을 비교합니다.
DISKCOPY   플로피 디스크의 내용을 다른 플로피 디스크로 복사합니다.
DISKPART   디스크 파티션 속성을 표시하거나 구성합니다.
DOSKEY   명령줄을 편집하고, Windows 명령을 다시 호출하고, 매크로를 만듭니다.
DRIVERQUERY    현재 장치 드라이버 상태와 속성을 표시합니다.
ECHO     메시지를 표시하거나 ECHO를 사용 또는 사용하지 않습니다.
ENDLOCAL   일괄 파일에서 환경 변경의 지역화를 끝냅니다.
ERASE    하나 이상의 파일을 지웁니다.
EVENTQUERY    지정된 영역에 대해 이벤트 로그 항목을 표시합니다.
EXIT     CMD.EXE 프로그램(명령 인터프리터)을 마칩니다.
FC       두 파일 또는 파일의 집합을 비교하여 다른 점을 표시합니다.
FIND     파일에서 텍스트 문자열을 찾습니다.
FINDSTR    파일에서 문자열을 찾습니다.
FOR      파일 집합에서 각 파일에 대해 지정된 명령을 실행합니다.
FORMAT   Windows에서 사용할 디스크를 포맷합니다.
FSUTIL   파일 시스템 속성을 표시하거나 구성합니다.
FTYPE    파일 확장 연결에 사용되는 파일 형식을 표시하거나 수정합니다.
GOTO     Windows 명령 인터프리터가 일괄 프로그램에서 이름표가 붙여진 줄로 이동합니다.
GPRESULT   컴퓨터 또는 사용자에 대한 그룹 정책 정보를 표시합니다.
GRAFTABL   Windows가 그래픽 모드에서 확장 문자 세트를 표시할수 있게 합니다.
HELP     Windows 명령어에 관한 도움말을 제공합니다.
IF       일괄 프로그램에서 조건 처리를 수행합니다.
LABEL    디스크의 볼륨 이름을 만들거나, 바꾸거나, 지웁니다.
MD       디렉터리를 만듭니다.
MKDIR    디렉터리를 만듭니다.
MODE     시스템 장치를 구성합니다.
MORE     출력을 한번에 한 화면씩 표시합니다.
MOVE     하나 이상의 파일을 한 디렉터리에서 다른 디렉터리로 옮깁니다.
OPENFILES    파일 공유에서 원격 사용자에 의해 열린 파일을 표시합니다.
PAGEFILECONFIG   페이지 파일 속성을 표시하거나 구성합니다.
PATH     실행 파일의 찾기 경로를 보여주거나 설정합니다.
PAUSE    일괄 파일의 처리를 보류하고 메시지를 보여줍니다.
POPD     PUSHD 명령으로 저장된 디렉터리로 바꿉니다.
PRINT    텍스트 파일을 인쇄합니다.
PROMPT   Windows 명령 프롬프트를 바꿉니다.
PUSHD    현재 디렉터리를 저장한 후 디렉터리를 바꿉니다.
RD       디렉터리를 지웁니다.
RECOVER  불량이거나 결함이 있는 디스크에서 읽을 수 있는 정보를 복구합니다.
REM      일괄 파일 또는 CONFIG.SYS에서 주석을 기록합니다.
REN      파일 이름을 바꿉니다.
RENAME   파일 이름을 바꿉니다.
REPLACE  파일을 대체합니다.
RMDIR    디렉터리를 지웁니다.
SET      Windows 환경 변수를 보여주거나, 설정하거나, 지웁니다.
SETLOCAL   일괄 파일에서 환경 변경의 지역화를 시작합니다.
SC       서비스를 표시하거나 구성합니다(백그라운드 작업).
SCHTASKS   컴퓨터에서 실행할 명령과 프로그램을 예약합니다.
SHIFT    일괄 파일에서 바꿀 수 있는 매개 변수의 위치를 바꿉니다.
SHUTDOWN   컴퓨터의 로컬 또는 원격 종료를 허용합니다.
SORT     입력을 정렬합니다.
START    지정된 프로그램이나 명령을 별도의 창에서 시작합니다.
SUBST    경로를 드라이브 문자로 지정합니다.
SYSTEMINFO    특정 컴퓨터의 속성과 구성을 표시합니다.
TASKLIST   서비스를 포함한 실행 중인 모든 작업을 표시합니다.
TASKKILL   실행 중인 프로세스나 응용 프로그램을 중지합니다.
TIME     시스템 시간을 보여주거나 설정합니다.
TITLE    CMD.EXE 세션에 대한 창의 창 제목을 설정합니다.
TREE     드라이브 또는 경로의 디렉터리 구조를 그래픽으로 화면에 표시합니다.
TYPE     텍스트 파일의 내용을 보여줍니다.
VER      Windows 버전을 보여줍니다.
VERIFY   파일이 디스크에 올바로 쓰였는지 검증할지 여부를 지정합니다.
VOL      디스크 볼륨 이름과 일련 번호를 보여줍니다.
XCOPY    파일과 디렉터리 트리를 복사합니다.
WMIC     대화형 명령 셸 내의 WMI 정보를 표시합니다.

2010/04/01 10:36 2010/04/01 10:36
1. 먼저 메타테그를 이용한 방법입니다.
<?
echo "<meta http-equiv='refresh' content='0; url=http://도메인'>"
;
?>

2. 자바스크립트를 이용한 방법
<?
echo
"<script>
document.location.href='도메인';
</script>"
;
?>
또는
<?
echo "<script>

window.location.replace('도메인');

</script>";
?>

3. 헤더를 이용한 방법

<?
header
("Location: 도메인"
);
?>

2010/03/30 02:33 2010/03/30 02:33

도메인포워딩하는것이 아니라 여러개의 도메인을 보유하고 있을시 사용할방법입니다.

===============================================================================

만약 두개의 도메인(www.youngsam.krwww.ipadschool.kr)이 있다면...

일단 두개의 도메인에서 열려야할 다른 내용의 메인페이지가 있어야겠죠
임의로 이름을 붙여서 1.php와 2.php로 하겠습니다.

그리고 index.php 파일의 내용을 이렇게 작성하면 됩니다

<?
if ($_SERVER[HTTP_HOST]=="www.youngsam.kr") {   
  index="1.php";
} elseif ($_SERVER[HTTP_HOST]=="youngsam.kr") {
  $index="1.php";
} elseif ($_SERVER[HTTP_HOST]=="www.ipadschool.kr") {
  $index="2.php";
} elseif ($_SERVER[HTTP_HOST]=="ipadschool.kr") {
  $index="2.php";
}

include $index;
?>

2010/03/30 01:35 2010/03/30 01:35