CVS Commit 로그를 남겨보자

it/etc 2011/05/04 13:17 Posted by newtype
-. 요구사항 파악 및 설계

적용 패키지 작성을 위해 수정된 파일 목록을 추출 할 방법을 찾아 보기로 했다.
업무 때문에 소스 관리를 CVS 로 하고 있다. CVS의 단점은 개별 파일이력은 확인 할 수 있는데, 
수정된 파일 목록을 뽑기가 쉽지 않다는 것이다.

구글링을 해보니 CVS에서 Commit 시점에 뭔가 처리할 수 있다는 것을 알았다.

먼저, CVS 서버에 접속해서 저장소의 CVSROOT 디렉토리를 보자

-rwxrwxr-- 1 cvs cvs       544  4월 22 09:23 checkoutlist

-rwxrwxr-- 1 cvs cvs       694  3월 21  2009 checkoutlist,v

-rwxrwxr-- 1 cvs cvs       882  4월 26 16:03 commitinfo

-rwxrwxr-- 1 cvs cvs       959  3월 21  2009 commitinfo,v

-rwxrwxr-- 1 cvs cvs       993  3월 21  2009 config

-rwxrwxr-- 1 cvs cvs      1192  3월 21  2009 config,v

-rwxrwxr-- 1 cvs cvs       602  2월  8 16:32 cvswrappers

-rwxrwxr-- 1 cvs cvs       801  3월 21  2009 cvswrappers,v

-rwxrwxr-- 1 cvs cvs      1025  3월 21  2009 editinfo

-rwxrwxr-- 1 cvs cvs      1224  3월 21  2009 editinfo,v

-rwxrwxr-- 1 cvs cvs 292081967  4월 29 18:14 history

-rwxrwxr-- 1 cvs cvs      1245  4월 21 11:32 loginfo

-rwxrwxr-- 1 cvs cvs      1367  3월 21  2009 loginfo,v

-rwxrwxr-- 1 cvs cvs      1151  3월 21  2009 modules

-rwxrwxr-- 1 cvs cvs      1350  3월 21  2009 modules,v

-rwxrwxr-- 1 cvs cvs       564  3월 21  2009 notify

-rwxrwxr-- 1 cvs cvs       763  3월 21  2009 notify,v

-rwxrwxr-- 1 cvs cvs       640  4월 25 12:43 passwd

-rwxrwxr-- 1 cvs cvs       649  3월 21  2009 rcsinfo

-rwxrwxr-- 1 cvs cvs       848  3월 21  2009 rcsinfo,v

-rwxrwxr-- 1 cvs cvs       879  3월 21  2009 taginfo

-rwxrwxr-- 1 cvs cvs      1078  3월 21  2009 taginfo,v

-rwxrwxrw- 1 cvs cvs       187 11월 10 17:15 val-tags

-rwxrwxr-- 1 cvs cvs      1026  3월 21  2009 verifymsg

-rwxrwxr-- 1 cvs cvs      1225  3월 21  2009 verifymsg,v


위와 같은 파일들을 볼 수 있는데.. 
여기서 commitinfo 란 파일이 CVS에서 Commit 하기 바로전에 실행되는 파일이다.

방향은 정해졌다. 
작업 구성은 아래와 같은 순서로 하기로 했다.

     1. CVS가 Commit 되는 시점에 파일명을 DB에 저장한다.
         -> CVSROOT/commitinfo에 등록할 쉘 스크립트를 작성.
     2.  저장된 DB를 조회할 간단한 WEB Page 제작
         -> 평소 관심을 갖고 있던, jQuery를 이용.

[ 1. CVS가 Commit 되는 시점에 파일명을 DB에 저장한다 ]

commitinfo 파일에 아래와 같이 내용을 추가 한다.

$ vi CVSROOT/commitinfo 

ALL /home/cvs/myproject/CVSROOT/cvscommitlog.sh 


DB에 테이블을 생성 한다.

CREATE TABLE CVS_COMMIT
(
   SEQ              NUMBER(10) NOT NULL,
   USERID           VARCHAR2(20) NOT NULL,
   REG_DATE         DATE DEFAULT SYSDATE,
   PROJECT          VARCHAR2(50) NOT NULL,
   FILENAME         VARCHAR2(500) NOT NULL
);

* index는 REG_DATE, TO_CHAR(reg_date, 'YYYY/MM/DDHH24:MI'), USERID, PROJECT 를 걸었다.

commitinfo 파일이 실행할 쉘스크립트를 작성한다.

#!/bin/sh
export ORACLE_BASE=/oracle
export ORACLE_HOME=$ORACLE_BASE/product/10.2.0/db_1
export ORACLE_SID=ORACLE_SID
export PATH=$PATH:$ORACLE_HOME/bin
export ORACLE_OWNER=oracle
export LANG=c
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$ORACLE_HOME/lib;

DATE=`date "+%Y-%m-%d %H:%M:%S"`
DT=`date "+%Y%m%d"`
LOG_FILE="/home/cvs/cvs_log/commit.$DT.log"
DIR=$1
USER=$USER
PROJECT=`echo $DIR | cut -d/ -f4`
#(echo ""; id;) >> $LOG_FILE
shift
for file in $*
do
    echo "$PROJECT, $USER, $DATE, $DIR/$file" >> $LOG_FILE
        result=`$ORACLE_HOME/bin/sqlplus oracle_user/oracle_pwd@oracledb <<EOF 
        INSERT INTO CVS_COMMIT 
        VALUES ( (SELECT NVL(MAX(SEQ), 0) +1 FROM CVS_COMMIT), 
                       '$USER', TO_DATE('$DATE', 'YYYY-MM-DD hh24:mi:ss'), 
                       '$PROJECT', '$DIR/$file');
        COMMIT;
        EOF
        `
done



[ 2.  저장된 DB를 조회할 간단한 WEB Page 제작 ]
jsp 파일 하나와 html파일 하나로 이루어졌고, jQuery와 JSON을 이용 했다.
DATE Picker는 jQuery Plugin 중에 하나를 이용했다.

html 내용 보기


jsp 내용 보기



iTunes 없이 iPhone에 음악 전송

it/etc 2010/09/28 17:36 Posted by newtype

나같은 경우 MacBook, 업무용 Notebook, 집 Desktop 이렇게 3개의 컴퓨터를 사용하고 있다.

MacBook에는 주소록과 사진, 집 Desktop에는 동영상, 업무용 Notebook에는 음악들을 
iPhone과 동기화 하고 싶은데, 이런xx!! iPhone은 하나의 iTunes에만 동기화가 가능하다.
( 시도 했다가, iPhone의 음악과 Apps를 몽창 말아 먹었다 ㅡㅡ; )

아직은 iTunes에 적응을 못해서 인지, 불편하기만 하다.

웹 서핑중 iTunes 없이 iPhone에 음악을 전송할 수 있는 어플이 있어서 소개 한다.


CopyTransManager라는 프로그램으로 무료다!

설치시 기본언어로 설치하면, 한글도 지원된다.

일단 업무용 Notebook을 이용하여, 앨범 생성도 해보고, 음악도 전송하여 봤는데.. 잘 된다. ^^
( iPhone 버전 4.1(8B117), iTunes 버전 10.0.1.22, CopyTransManager(Free) 버전 v0.924 )

웹을 통해 사용기를 훑어 보니, 이 어플을 사용했다가 iPhone을 초기화 했다는 글들이 보이는 걸로 봐서는 아직은 불안한 어플인것 같기도 하다. 



: no such repository

it/etc 2009/10/09 17:59 Posted by newtype
cygwin은 이제 필수 설치 툴이 되어 버렸다.

업무를 하면서 자연 스럽게 cvs, cygwin, Eclipse 조합을 사용하게 되었는데,
Eclipse에서 cvs로 프로젝트를 내려 받은 것은 cygwin에서 cvs가 정상적으로 동작하지 않았다.

로긴 시도를 하면 아래와 같이 에러가 발생하는 것이다.
newtype@newtype-PC ~/test
$ cvs login
Logging in to :pserver:newtype@127.0.0.1:2401/project/test
CVS password:
: no such repository

에러 발생 이유에 대해 구글링을 해보니
CVS를 내려 받을때 생기는 세가지 파일 Entries, Root, Repository 들이
Unix 형식이 아닌, Windows 형식으로 생성되기 때문이란다.

cygwin에서 아래와 명령을 내리면 간단히 해결된다.
newtype@newtype-PC ~
$ find . \( -name Entries -o -name Root -o -name Repository \) -exec dos2unix {} \;

명령을 내리면 현재 디렉토리 및 모든 서브 디렉토리를 검색하여 CVS 관련 3가지 파일을 Unix 형식으로 바꾸어 준다. (정확히 말하자면 Windows 형식의 개행문자 "\r\n"을 Unix형식의 개행문자 "\n"으로 치환 해준다)

이제, cygwin cvs에서도 정상적으로 로긴이 되고,
Eclipse 에서도 아무런 부작용없이 정상적으로 cvs 관련 명령을 사용할 수 있다.

ssh socks 터널링을 이용한 방화벽 탈출

it/etc 2008/08/26 03:22 Posted by newtype
이곳 저곳 파견을 다니다 보니 네트웍 환경에 따라 메신져를 사용할 수 없다던가,
WEB 서핑을 할 수 없다던가 하는 불편한 점이 있다.

ssh socks 터널링을 이용해 방화벽에 구애 받지 않고, 메신져나 웹서핑을 자유롭게 할 수 있다.

단, 이 방법은 아래와 같은 제약이 있다.


[ 제약 ]
1)  ssh 접속이 가능해야 한다.

2) 접속 가능한 ssh 계정이 있어야 한다.

ssh socks 터널링을 이용한 방법으므로 당연한 얘기다 ^^


[ 적용 방법 ]

1. http://nemesis2.qx.net/software-myentunnel.php 에서 프로그램을 다운 받아 설치한다.
   이 프로그램은 ssh socks 터널링을 간단하게 도와주는 프로그램이다.


2. MyEntunnel 설정

사용자 삽입 이미지

  여기서 [Enable Dynamic SOCKS Port] 설정을 꼭 해주어야 한다.
  설정을 마치고, 접속 한 후 [ Hide ] 버튼을 누르면 TrayBox로 보낼 수 있다.


3. WEB 설정
   Internet Explorer의 경우 [도구] / [인터넷 옵션] / [연결] / [LAN 설정] 화면을 열어 [프록시 서버] 항목을 체크하고, 활성화된 [고급] 버튼을 누르면 프록시 설정을 할 수 있다. 여기서 Socks 항목의 서버 주소를 "localhost"로, 포트를 MyEntunnel에서 지정한 "7070" 포트로 설정 한다.


4. NATEON 설정
   [설정] / [연결(방화벽)] 메뉴에서 [프록시 서버 사용]을 체크하고 아래와 같이 설정한다.
    종류: SOCKS 버전 4
    서버: localhost
    포트: 7070



이렇게만 해주면 해당 네트웍의 방화벽 설정에 상관없이 웹서핑과 메신져 활동을 누릴 수 있다.

이 방법은 장점은 또 있다.
ssh 프로토콜을 이용해 암호화 되어 패킷이 전송되기 때문에 패킷 감시를 할 수 없다는 점이다.

패킷 캡쳐 프로그램을 이용해 네이트온 로긴을 했을때 패킷을 잡아 봤다.

먼저, 평소 로긴을 하게 되면 아래 그림과 같은 패킷이 잡힌다.

사용자 삽입 이미지

그림과 같이 전송 되는 패킷 내용을 눈으로 확인할 수 있다.
(색칠된 부분은 필자의 친구 목록이다)

이제 ssh socks 터널링을 설정한 후의 패킷을 잡아보자
사용자 삽입 이미지

보는 것처럼 패킷이 암호화 되어 눈으로는 확인이 불가능 해진다.
물론 ssh 프로토콜을 사용하기 때문에 눈으로만 확인 불가능 한것이 아니다. ^^

ssh 서버를 거치게 되므로 속도가 느릴 수 있고, 서버 부하에 일조하게 되지만
방화벽 탈출이라는 혜택(?)을 누리게 된다.
하지만, 기업에서 보안 정책상 정해 놓은 룰을 어기는 것은 당연히 좋은 않다.
너무 남용하지는 말고 꼭 필요할 때만 사용 할 것이다.

Vista 에서 볼륨 조절

it/etc 2008/07/30 20:46 Posted by newtype
사용자 삽입 이미지

Vista 에서 볼륨 믹서를 열면 Application 별로 볼륨을 조절 할 수 있다는 사실을 알았다.
멋진 기능이다

아, vista에서는 볼륨 크기를 [Windows] + [+] 키로 키우거나, [Windows] + [+] 키로 줄일 수 있다.

오늘따라 Vista가 멋저 보인다 ^^

3G iPhone 에는 한글 키보드가 기본으로??

it/etc 2008/07/11 18:06 Posted by newtype
3G iPhone 개봉 UCC가 올라왔길래 보는데..
한글 키보드가 들어가 있네요 @.@
한국 출시 기대해도 될까봐요.

아래 인증 샷 입니다.
사용자 삽입 이미지

아.. 뽐뿌가.. ㅡㅡ;

core 파일 분석

it/etc 2008/07/09 11:17 Posted by newtype

- 생성 정보 확인
$ file core


- callstack 정보 확인
$ pstack core


- 전체 메모리 맵 확인
$ pmap core


- 시그널 정보 확인
$ pflags core


- core 발생 Lib 확인
$ mdb core
>
$C
> $q


- 링크한 동적 Lib 확인
$ pldd core


- process id: effective, real, saved (u/g) 확인
$ pcred core


sun 장비에서 확인 한 내용입니다.
TAG core, Solaris, SUN

Visual Studio 2008 설치

it/etc 2008/07/08 00:00 Posted by newtype
Visual Studio 로 개발 할 일이 없다보니,
이제야 2008 버전을 설치해봤다.

설치하면서 엄청난 삽질을 했다. ㅎㅎ

먼저, Visual Studio 2008 RTM 설치를 시도했다.
일단, iso를 zip+ v6.99 로 풀었다.

zip+ 는 데몬이나 알콜을 설치하지 않아도 간단하게 가상 CD를 잡을 수 있어서 애용 중이다.
그런데, 이상하게도 Visual Studio 2008 RTM 버전은 가상 CD로 잡히지를 않는다.

iso를 직접 풀어서 설치를 하니,
"baseline 데이터를 찾을 수 없습니다"라는 오류가 발생하면서 설치가 되지 않는다.
여러 가지 방법으로 시도를 해보았지만, 결국 포기..

하지만, 마음속에 불길은 벌써 걷잡을 수 없이 번져 버렸다.
불길을 잡기 위해서는, Visual Studio 2008 설치 뿐!

Visual Studio 2008 평가판을 다운 받았다.
젠장, 용량이 크다고 파일이 7개로 나눠 져있다.
rar로 묶어서 exe로 만들어 놓은 배포본 이다.
전부 받아 압축을 풀어보니 또 iso 파일..
왠지 불안하다..

역시, 가상 CD로는 잡히지 않고...
iso를 풀어 설치를 시도 했지만.. 역시 설치 실패..
이번엔 무슨 파일이 존재하지 않는단다.
엇, 그런데!!
iso 파일 용량은 4기가 넘는데, 풀어 놓은 전체 용량이 더 작은 것이 아닌가!!
혹시 zip+에서 iso 파일을 제대로 지원하지 않는 것일까??
이제까진 이런 경우가 없었는데... 워낙 용량이 크다보니 그럴수도 있겠다는 생각이 들었다.

하드를 뒤져보니, WinRAR 3.4 버전이 있다.
이걸로 풀어서 설치를 해보니, 역시 설치가 제대로 되질 않는다.
이번엔 무슨 파일이 손상되었단다..

웹을 뒤져보니, 영문 버전은 WinRAR 3.8까지, 한글 버전은 WinRAR 3.6까지 있는 듯 하다.
3.6 버전 평가판을 다운로드 받아 설치하고, iso 파일을 풀어서 설치하니..

설치가 잘된다!!

이렇게 Visual Studio 2008 RTM 버전을 무사히 설치했다 ㅡㅡ;


세줄 요약
1. Zip+ v6.99를 이용 Visual Studio 2008 설치 실패.
2. WinRAR 3.4를 이용한 Visual Studio 2008 설치 실패.
3. WinRAR 3.6를 이용한 Visual Studio 2008 설치 성공.

교훈.
압축 프로그램은 인지도 있고 믿을만한 것으로 최신버전을 사용해야 한다.

SUN 장비 route 조회/추가/삭제

it/etc 2008/06/11 16:28 Posted by newtype
Sun 솔라리스 에서 Route 테이블 조회 / 추가 / 삭제 방법

- route 조회
netstat -r


- default Gateway 지정
route add default 192.168.10.1


- 특정 IP(61.211.7.4)에 대한 Gateway 지정
route add 61.211.7.4 192.168.10.1


- class 전체에 대한 Gateway 지정
route add net 61.211.7.0 192.168.10.1


- route 삭제
route delete 61.211.7.4 192.168.10.1
route delete net 61.211.7.0 192.168.10.1





grep로 특수문자 찾기

it/etc 2008/05/14 15:02 Posted by newtype
grep으로 특수문자를 찾고자 한다.

1. 특수문자를 변수로 설정한다.
찾고하 하는 특수문자를 변수로 저장한다.
$ export ht=$'\t'


2. 찾는다
TAB문자 다음에 "AFTER" 문장을 찾기 위해서 아래와 같이 입력한다.
$ grep "${ht}AFTER" my.log


덧글.
bash에서는 되는데,
ksh에서는 안되는 군요.

crontab

it/etc 2007/10/06 01:32 Posted by newtype

일정 주기로 처리하는 배치 프로세스의 경우 시스템 crontab에 등록 하여 자동화 시킬 수 있다.


* crontab 명령
$ crontab [-e | -l | -r]

-e: 등록된 crontab을 편집한다.
-l: 등록된 crontab명령을 출력한다.
-r: 등록된 crontab을 삭제한다.


 * crontab 편집
$ crontab -e

위 명령을 입력하면 vi 환경에서 crontab 편집이 된다

20 13 * * 7 /home/batch/script/backup.sh
0 6 1 3 * /home/batch/script/logdel.sh
0 0 * * * /home/batch/script/daybatch.sh
30 * * * * /home/batch/script/hourbatch.sh
0,5,10,15,20,25,30,35,40,45,50,55 * * * * /home/batch/script/checksys.sh

위 내용은 vi 환경에서 crontab 샘플이다.
구분자는 공백으로 앞에서 부터 분(0~59), 시(0~23), 일(1~31), 월(1~12), 주(1:월~7:일),  실행명령을 의미한다.  ","(컴마)를 구분자로 복수 시간을 지정할 수 있다.

backup.sh는 매주 일요일 13:20에 기상시간을 알리며 실행된다.
logdel.sh는 매년 3월 1일 06:00에 삼일절을 기념으로 실행된다.
daybatch.sh는 매일 00시 00분에 퇴근시간을 알리며 실행된다.
hourbatch.sh는 매시간 30분에 실행된다.
checksys.sh는 5분마다 실행된다.


* crontab 사용시 주의 사항

crontab 으로 명령이 수행되면 기존 환경변수를 인식 하지 못한다.

crontab에 아래의 프로세스가 등록되어 있다고 가정하자.
0 * * * * /home/batch/bin/run_hourbatch

run_hourbatch는 오라클을 연동하는 Pro-C로 만들어져 있다고 가정하자.
이 프로세스는 1시간 간격으로 수행되는 배치 프로세스이다.

하지만, 이렇게 프로세스를 직접 실행을 하면 수행에 실패한다.
Error while trying to retrieve text for error ORA-12154
로그를 확인해 보면 위와 같은 메시지와 함께 DB 커넥션을 하지 못한다.

이는 crontab에 등록된 프로세스가 실행되면서 .profile에 등록된 오라클 환경변수를 읽어 들이지 않기 때문에 발생하는 것이다.

crontab의 내용을 아래와 같이 수정하자
30 * * * * /home/batch/script/hourbatch.sh

그리고 아래와 같은 hourbatch.sh라는 shell script를 생성한다.
$ vi /home/batch/script/hourbatch.sh
#!/bin/ksh
# 오라클 환경 변수 설정
ORACLE_SID=TESTDB;
export ORACLE_SID
ORACLE_BASE=/home/oracle/app/oracle;
export ORACLE_BASE
ORACLE_HOME=$ORACLE_BASE/product/9.1.1;
export ORACLE_HOME
ORA_NLS33=$ORACLE_HOME/ocommon/nls/admin/data;
export ORA_NLS33
ORACLE_TERM=vt100;
export ORACLE_TERM
NLS_LANG=American_America.KO16KSC5601;
export NLS_LANG
PATH=$ORACLE_HOME/bin:$PATH;
export PATH
TNS_ADMIN=$ORACLE_HOME/network/admin;
export TNS_ADMIN

# batch 기동 로그 파일
BATCHLOG=`date '+%y%m%d_batch.log'`

# 시간 배치 실행
echo `date '+%H:%M'` + "^Hour Batch START" >> "/home/batch/log/"$BATCHLOG
/home/batch/bin/run_hourbatch
echo `date '+%H:%M'` + "^Hour Batch END" >> "/home/batch/log/"$BATCHLOG

이렇게 하고 hourbatch.sh에 실행 권한을 주면
매시간 30분이 되면 run_hourbatch가 정상적으로 실행된다.




find를 이용해 파일찾기

it/etc 2007/09/05 15:15 Posted by newtype

find 명령을 사용하여 특정 조건에 맞는 파일을 디렉토리와 그 하위 디렉토리에서 찾을 수 있습니다. 찾은 파일에서 명령을 수행할 수 있습니다.

패턴이 일치하는 파일 찾기

find구문이 복잡하기는 하지만, HP-UX를 더욱 생산적으로 사용할 수 있습니다. 강력하고 융통성있는 명령입니다. 그러나, 디렉토리가 많을 경우에는 느리게 실행될 수 있습니다.

현재 디렉토리와 하위 디렉토리에서 d로 시작하는 모든 파일을 찾으려면 다음을 입력하십시오.

find(1)

$ find . -name 'd*'

점(.)은 find 가 현재 디렉토리와 하위 디렉토리를 찾도록 합니다. -name 선택사항 뒤에는 파일 이름이나 파일 이름 패턴(이 경우에는 d*)이 오는데, 패턴이 일치하는 모든 파일의 이름을 찾습니다. 이 보기에서 findd로 시작하는 모든 파일 이름을 찾습니다.

d*는 작은 따옴표 'd*'로 묶습니다 . find 명령에서 파일 이름 패턴을 사용할 경우에는 쉘이 정확하게 해석할 수 있도록 따옴표로 묶어야 합니다.

특정 파일보다 새로운 파일 찾기

특정 파일 이후에 수정된 모든 파일을 찾는다고 가정합시다. /home/leslie디렉토리와 그 하위 디렉토리에 있는 myfile보다 새로운 파일을 나타내려면, 다음을 입력하십시오.

$ find /home/leslie -newer myfile

이 보기는 /home/Lee 디렉토리와 그 하위 디렉토리에서 myfile이후에 수정된 모든 파일을 찾아서 화면에 모두 출력하라는 의미입니다. (파일이 마지막으로 수정된 일자와 시간을 알려면, ll명령을 사용하십시오.)

파일에서 명령 수행

find 명령을 받는 파일에서 다른 명령을 수행할 수 있습니다. 현재 디렉토리와 하위 디렉토리에서 .tmp라는 확장 이름을 가진 모든 파일을 삭제하려면, 다음을 입력하십시오.

$ find . -name '*.tmp' -exec rm {} \;

현재 디렉토리와 하위 디렉토리에서 .tmp로 끝나는 모든 파일을 찾아서 화면에 나타내고 그 파일을 모두 삭제합니다. -exec 선택사항은 다음 명령 (rm)을 실행합니다. { } 는 find 명령이 찾은 파일을 의미합니다. 명령 문자열을 끝내는 세미콜론 (;) 앞에
ESC 문자로 역빗금(\)을 붙입니다.

논리 연산자 사용

find 구문에 NOT, AND, OR같은 논리 연산자를 사용할 수 있습니다.

특정 형식에 일치하지 않는 파일을 찾으려면, 논리 연산자 NOT을 나타내는 !선택사항을 사용하십시오. 이 선택사항 뒤에는 파일 이름과 같이 파일 속성을 정의하는 선택사항을 사용하여야 합니다. 그러면, 지정된 속성이 없는 파일을 찾습니다.

예를 들면, /tmp에서 leslie없는 모든 파일을 찾으려면, 다음 명령을 사용합니다.

$ find /tmp \( ! -user leslie \)

쉘이 괄호를 특수 문자로 해석하지 않도록 ESC 문자인 \을 앞에 붙입니다.

두 개의 속성이 있는 파일을 찾으려면, 논리 연산자 AND인 expression -a
expression
선택사항을 사용하십시오. 예를 들어, /에서 Lee에 있는 모든 디렉토리를 찾으려면 다음 명령을 사용합니다.

$ find / \( -type d -a -user Lee \)

둘 중에서 한 개의 속성이 있는 파일을 찾으려면, 논리 연산자 OR인 expression -o expression 선택사항을 사용하십시오. 예를 들어, 일주일 동안 사용하지 않은 a.out이나 .o인 파일을 삭제하려면 다음 명령을 사용하십시오.

$find / \(-name a.out -o -name '*.o' \)-atime +7 -exec rm {}\;



특정 날짜 이후의 파일 찾기


$ touch -t 200802051720 bingo.tmp
$ find . -newer ./bingo.tmp -name "*.c"

touch를 이용 원하는 시간의 파일을 생성 한다. 생성한 파일보다 나중에 생성된 "*.c" 파일을 찾는다.



특정 날짜 사이에 파일 찾기


$ touch -t 200801010000 start.tmp
$ touch -t 200802050000 end.tmp
$ find . -newer start.tmp -a ! -newer end.tmp

touch를 이용 원하는 시간의 파일을 생성 한다. find의 -newer 옵션과 비교 연산자, 무정 연산자를 이용하여 생성한 임시파일 사이의 파일을 구한다.


특정 크기 이상의 파일 찾기


$ find . -size +10000k -exec ls -al {} \;

10M 이상의 파일을 화면에 찾아 출력 한다..


[출처]
http://docs.hp.com/ko/B2355-90167/ch02s18.html

TAG find, unix, 찾기

console 끊어지지 않게 하기

it/etc 2007/05/02 15:23 Posted by newtype
원격지 console에 접속해서 작업을 하다가
잠깐 다른 생각을 하면 접속이 끊어 집니다.

서버 설정에 따라 Timeout 되어 접속 이끊어지는 것인데,

$ export TMOUT=


이렇게만 해주면 접속이 끊어지지 않네요.

/etc/profile

이란 파일에 보면 TMOUT 값이 설정되어 있는데..
이 내용을 변경하는 재설정하는 명령입니다.

영구적으로 변경하려면, 위 파일의 내용을 수정하면 됩니다.

HP 장비에서 확인했습니다.

vista 설치

it/etc 2007/03/28 22:21 Posted by newtype
Windows Vista를 이제야 설치해 봤네요.
4년전에 장만한 컴퓨터라 사양이 안될까봐 미루다가..
결국엔 별도 파티션을 만들고 설치를 했습니다.

생각만큼 버벅되지 않네요.
오히려 깔끔하고 맘에 듭니다.

펜포 2.4,
램 1G,
80G 하드에 설치 했습니다.
RADEON 9550 드라이버는 자동으로 잡고
MAYA 5.1 사운드 카드 드라이버도 있네요.
못잡는 드라이버가 하나 있는데,
SIGMA FOMU라는 USB 무선 리모콘인데, 홈페이지에는
(윈도우 비스타 32bit,64bit에서 리모콘 설치문제) -현재 지원예정이던 리모콘 드라이버 프로그램에서 윈도우 비스타 32bit/64bit 모두에서 인식 못하는 문제를 확인하였습니다.-
 
*현재 64비트용은 추가 개발이 필요한 상태이며 32비트는 추가 수정을 해야할 것으로 보입니다.

*사용에 불편을 드려 죄송하며 빠른 시일내로 32비트용은 수정하여 배포 하도록 노력하겠습니다.

이런 말만 있네요.

설치한 버전은 Ultimate K 버전이고
OEM 인증 방식으로 영구 인증도 받았습니다.

사용자 삽입 이미지


마음에 드는 몇가지를 말하자면..

웹서핑 속도가 빨라졌습니다.
XP에서 IE7는 엄청 버벅되었는데..
Vista에서는 쌩쌩 날라다닙니다. FF보다 빠르네요.

트레이 아이콘에 시간을 클릭하면
사용자 삽입 이미지
요런 넘이 나옵니다.
이거 정말맘에 드네요.
항상 달력을 보기 위해 LClock을 설치할 필요가 없어졌습니다.
한가지 아쉬운 점은 Vista에는 Office를 설치하지 않아도 기본으로 제공하는
일정관리 툴이 있는데, 여기에 일정을 추가해도 달력엔 표시가 되지 않는군요.

서든 어택 랙이 줄었습니다.
아무것도 설치한 것이 없어서 인지는 몰라도 XP에서보다 랙이 눈에 띄게 없네요.

그런데, 3D로 작업전환을 한다든지 하는등의 다른 Vista 리뷰에서 볼 수 있는 걸
어떻게 하는지 모르겠네요. 체스 게임 말고는 3D가 보이지 않습니다. ^^;

당분간 불필요한 프로그램은 일절 설치하지 않고 사용해 볼랍니다.
아직까진 맘에 듭니다. ^^
TAG Vista

로그파일에서 문자열 검색 쉘스크립트

it/etc 2007/03/15 17:39 Posted by newtype

*.20070315*
같은 형식의 로그 파일들이 많이 있다고 하면,
어제 로그들 중에서 특정 문자열을 검색해 갯수를 카운트 하는
스크립트 입니다.

#!/bin/ksh
 
TZ=KST+15
sDATE="`date +%Y%m%d`"
 
if [ "$1" = "" ]; then
    echo " ";
    echo "   View Counter";
    echo " ";
    echo "   usage> vc.sh [PageString]";
    echo " ";
else
        grep $1 *.${sDATE}* | wc -l
fi

간단히 설명하자면

1. 타임존 설정에서 울나라가 -9니까   +24 해서 +15로 설정하여 어제 날짜를 계산합니다.
2. 날짜 문자열 구합니다.
3. 파라미터 검사해서 검색할 문자열이 없으면 에러
4. grep으로 문자열 찾고, wc -l로 line을 count 합니다.

이상입니다.

Google 워드프로세서 & 스프레드쉬트

it/etc 2007/02/08 17:39 Posted by newtype
사용자 삽입 이미지

얼마전 집 PC에 OS를 새로 설치 했습니다.
가볍고 쾌적한 윈도우를 경험 하며 다짐한 것이 있습니다.
최대한 불필요한 S/W는 설치하지 않겠다는 것이죠.

구글에서 제공하는 웹서비스 중에
Google 워드프로세서 & 스프레드쉬트가 한글화 되었군요 +_+

엑셀과 워드 파일을 지원하고,
작업 내용을 웹에 저장해 놓을 수가 있습니다.
작성한 문서를 PDF로 변환도 할 수 있네요.

제법 데스크탑 S/W 흉내를 냈습니다.
마우스 오른 버튼을 누르니 자체 팝업 메뉴가 뜨네요 ㅎㅎ

당분간은 오피스도 설치 하지 않으렵니다.

부팅시 자동 실행 하기

it/etc 2007/01/09 16:37 Posted by newtype
부팅시 자동 실행 하기




테스트 장비 : HP-UX B.11.11 U 9000/800 (tm)

root 권한으로

1. 실행할 데몬 이나 스크립트를 만든다.

/sbin/init.d 디렉토리 밑에
실행할 데몬이나 스크립트를 넣어둔다.
스크립트인 경우 내용은 아래와 같다.

case "$1" in
start_msg)
        export dname; ewritemsg -M vras.mesg:2409 "VVR - Starting $dname daemon"
        ;;
'start')
        # start 할때 실행할 것
        su - tesuser -c /disk4/home/tesuser/test.sh
    ;;
'stop')
        # kill 할때 실행할 것
    ;;
*)
        export progname; ewritemsg -M vras.mesg:2408 \
                "Usage: $progname { start | stop }"
    exit 1
    ;;
esac
 
exit 0

쉘의 경우 이때 실행 owner는 root이다.
이 경우 환경 변수를 제대로 읽지 못할 수 있다.

실행할때 특정 권한으로 실행하므로 문제를 해결 할 수 있다.
su - 사용자계정 -c 실행명령
su - oracle -c /user/oracle/app/product805/bin/dbstart

아니면 쉘 안에 환경 변수를 지정해 줄 수 도 있다.
export 적용할 환경변수
export TEST_HOME=/disk4/home/test/temp
export CONFIG_HOME=/disk4/home/test/config
export LOGHOME=/disk4/home/test/log




2. 링크 파일을 생성한다.

/sbin/rc2.d 디렉트로 밑에
위에서 만든 실행할 파일의 링크를 만들어 넣어둔다.
ln -s /sbin/init.d/test.sh S999test

링크 파일명은 [S + 고유ID + 이름] 으로 한다.
S는 Start를 의미 K는 Kill을 의미 한다.

TAG init, Shell, 부팅
- VC++을 열고 Win32 Console Application 으로 project 생성

- project -> Add to project -> Files -> 모든 파일들을 첨부

- save



- Rational rose enterprise edition 열고 cancel한다.

- Tools -> options의 General tab에서 Miscellaneous tab에서 'save settings on exit'체크제거

- Tools -> Visual C++ -> Properties -> Code Update tab의 모든 체크제거, Model Update tab의 가운데거 제외한 나머지 체크제거

- Tools -> Visual C++ -> Update model from code -> Add Component -> Existing에서 dsw선택
TAG rose, 로즈

FireFox 팁 하나..

it/etc 2006/12/12 15:04 Posted by newtype
사용자 삽입 이미지


회사에서 사용하는 PC가 한대 있고, 집에서 사용하는 PC가 한대 있습니다.
둘다 FireFox를 사용하고 있는데.
회사에서 이것저것 설정을 바꾸거나, 플러그인을 설치하게 되면
FireFox환경이 집과 틀려서 혼란 스럽네요.
플러그인이 한두개 일때는 각각 따로 설치를 했는데, 설치하는 플러그인이 많아지다 보니
이것도 보통 작업이 아니더군요.

그래서 방법을 찾아봤는데.. 방법이 있군요. ^^

C:\Program Files\Mozilla Firefox
C:\Documents and Settings\사용자계정\Application Data\Mozilla\Firefox

이렇게 두개의 디렉토리를 복사해 넣으니 되네요.
간단 하군요.

-=-=--=-=-=-=-=-=-=-=-=-=-=-==-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=--=-=-=-=-=-

2007년 2월 9일 덧붙입니다.

이번에 OS를 새로 설치하면서 테스트 해보았습니다.
밑에 종비스님 덧글 대로
C:\Documents and Settings\사용자계정\Application Data\Mozilla\Firefox
내용만 복사해 주니 환경이 잡히네요.
종비스님 좋은 정보 감사합니다. ^^

TAG Firefox

TCP 패킷 캡쳐 프로그램..

it/etc 2006/10/09 14:38 Posted by newtype
TCP 패킷을 캡쳐하는 프로그램은 여러가지가 있는데..
windows에서는 winpcap 설치가 필요없는 SmartSniff을 써왔습니다.

그런데, unix 계열로 넘어 오면서 다양한 플랫폼을 지원하는 ethereal을 쓰게 되네요.
windows용도 있는데, winpcap를 사용한다는 단점이 있지만, SmartSniff와는 비교할 수 없을 정도로 기능이 막강하네요.

제일 마음에 드는 기능은 unix에서 패킷을 캡쳐해서 파일로 저장하고,
그 파일을 windows용 ehtereal에서 열어 보면 TCP패킷에 대한 기본적인 분석까지 됩니다.



unix에서 tcpdump를 이용해 파일을 만드는 예제

tcpdump -nns 1514 -w weird_traffic.cap 'dst host 192.168.10.25 and tcp and port 42'

/usr/local/sbin/tcpdump -nns 1514 -w packet_err.cap 'host 192.168.10.25 and tcp and port 80'

/usr/local/sbin/tcpdump -nns 1514 -w packet_perr.cap 'host 192.168.10.25 and tcp'

TCP 기본 연결, 종료 과정

it/etc 2006/08/18 16:53 Posted by newtype

netstat의 State 필드에 표시되는 TCP 상태표시가 갖는 의미를 알아봅시다.
RFC 793 문서에 있는 TCP 기본 연결, 종료 과정을 보면 이해가 더 빠를 거라 생각한다.
 
-----------------------------------------------------------
# netstat -atn
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address     Foreign Address    State
... 생략 ...
tcp    0   0 0.0.0.0:25       0.0.0.0:*       LISTEN   <-- 포트가 열렸음
tcp    0   0 192.168.123.10:32799  207.46.106.141:1863  ESTABLISHED <-- 서로 연결중
tcp    0   0 192.168.123.10:32794  218.xxx.xx.xx:22   ESTABLISHED
tcp    0   0 192.168.123.10:32802  207.46.108.46:1863  CLOSE_WAIT <-- 종료 대기중
tcp    0   0 192.168.123.10:33244  211.xxx.xx.x:80    ESTABLISHED
... 생략 ...
-----------------------------------------------------------
 
1) TCP 연결관련 상태
 
* RFC 793문서에 나온 기본적인 TCP 연결 과정

   TCP A                           TCP B

 1. CLOSED                           LISTEN
 2. SYN-SENT  --> < SEQ=100>< CTL=SYN>          --> SYN-RECEIVED
 3. ESTABLISHED <-- < SEQ=300>< ACK=101>< CTL=SYN,ACK>   <-- SYN-RECEIVED
 4. ESTABLISHED --> < SEQ=101>< ACK=301>< CTL=ACK>     --> ESTABLISHED
 5. ESTABLISHED --> < SEQ=101>< ACK=301>< CTL=ACK>< DATA> --> ESTABLISHED

LISTEN   : 데몬이 요청을 발을 수 있도록 연결 요구를 기다리는 상태.
            즉, 포트가 열려있음을 의미. http(80), mail(25), ftp(21), telnet(23) 등 위에서 포트 25(mail)이 메일을 받을 수 있도록 열려 있는 상태.
            윈도우즈에서는 LISTENING으로 표시
SYN_SENT  : 로컬에서 원격으로 연결 요청(SYN 신호를 보냄)을 시도한 상태
SYN_RECV  : 원격으로 부터 연결 요청을 받은 상태.
            요청을 받아 SYN+ACK 신호로 응답은 한 상태이지만 ACK는 받지 못했다.
           netstat로 확인할 때 SYN_RECV가 상당히 많다면 TCP SYN 플러딩(Flooding) 공격일 가능성이 있다.
           윈도우즈와 솔라리스에서는 SYN_RECEIVED으로, FreeBSD는 SYN_RCVD으로 표시
ESTABLISHED : 서로 연결이 되어 있는 상태
            위에서 192.168.123.10의 포트 32794과 218.xxx.xx.xx의 포트 22(ssh)이 서로 연결되어 있는 상태

2) TCP 종료관련 상태

* 정상적인 연결 종료 과정

   TCP A                          TCP B

 1. ESTABLISHED                       ESTABLISHED
 2. (Close)
   FIN-WAIT-1 --> < SEQ=100>< ACK=300>< CTL=FIN,ACK> --> CLOSE-WAIT
 3. FIN-WAIT-2 <-- < SEQ=300>< ACK=101>< CTL=ACK>   <-- CLOSE-WAIT
 4.                             (Close)
   TIME-WAIT  <-- < SEQ=300>< ACK=101>< CTL=FIN,ACK> <-- LAST-ACK
 5. TIME-WAIT  --> < SEQ=101>< ACK=301>< CTL=ACK>   --> CLOSED
 6. (2 MSL)
   CLOSED                           

FIN_WAIT1  : 소켓이 닫히고 연결이 종료되고 있는 상태. 원격의 응답은 받을 수 있다.
            솔라리스에서는 FIN_WAIT_1로 표시
FIN_WAIT2  : 로컬이 원격으로 부터 연결 종료 요구를 기다리는 상태.
           솔라리스에서는 FIN_WAIT_2로 표시
CLOSE_WAIT : 원격의 연결 요청을 받고 연결이 종료되기를 기다리는 상태.
            원격으로 부터 FIN+ACK 신호를 받고 ACK 신호를 원격에 보냈다.
TIME_WAIT  : 연결은 종료되었으나 원격의 수신 보장을 위해 기다리고 있는 상태.
           이 상태를 특히 자주 보게되는 Apache에서 KeepAlive를 OFF로 해둔 경우,  Tomcat 서버를 쓰는 경우 등
LAST_ACK  : 연결은 종료되었고 승인을 기다리는 상태
CLOSED   : 완전히 연결이 종료된 상태

※ 위의 FIN_WAIT1, FIN_WAIT2, CLOSE_WAIT 3개 상태는 연결 종료를 위해 서로간에 신호를 주고받는 과정에 나타나는 상태로 이해하면 된다.
  종료 요청을 한 곳에서는 FIN_WAIT1, FIN_WAIT2, TIME_WAIT 상태가 종료 요청을 받는 곳에서는 CLOSE_WAIT, LAST_ACK 상태가 표시된다.

3) 기타

CLOSING   : 연결은 종료되었으나 전송도중 데이타가 분실된 상태
UNKNOWN   : 소켓의 상태를 알 수 없음

솔라리스의 netstat 명령에서는 다음 2개의 상태를 더 표시한다.

IDLE    : 소켓이 열렸지만 binding 되지 않은 상태
BOUND    : listen이나 연결을 위한 준비 상태

※ 참고 문서 
- netstat 맨페이지(linux, solaris)
- RFC 793 ( http://www.ietf.org/rfc/rfc0793.txt )

출처 : 커피닉스( http://coffeenix.net/ )
작성 : 좋은진호
출처 : http://sinilyu.linuxstudy.pe.kr/qaboard/QaBoardContentProcess.php3?page=6&no=780&s_name=&s_value=




자신의 컴퓨터와 연결되었거나 연결될 목록을 프로토콜과 함께 보여주는 명령어

유닉스나 윈도우에는 사용자 컴퓨터의 네트워크의 상태를 알려주는 netstat라는 명령어가 있다. 즉 어떤 포트가 열려 있고 어떻게  사용되고 있는지 모두 알 수가 있고 이 명령어를 잘 활용하면 맨손으로도 해킹을 감지해 낼 수 있습니다. 그러나 사용자의 대부분은  netstat란 명령어를 모르고 있는것 같아 이번에는 netstat명령어의 사용법을 익힘으로써 다른 소프트웨어 도움을 받지 않고  해킹을 감지해 내는 능력을 길러봅니다.

1. netstat로 알아보는 내 컴퓨터의 포트상태
c:>netstat
Proto    Local Address    Foreign Address    State
TCP     acy7807:1023       211.233.45.89:80     ESTABLISHED

- Proto : 현재 사용한 프로토콜
- Local Address : 현재 열려 있는 사용자 컴퓨터의 IP/호스트 네임과 사용중인 포트
- Foreign Address : 현재 사용자의 컴퓨터에 접속되어 있는 IP/호스트 네임과 사용중인 포트
- State : 연결 상태를 나타내는 것
  - ESTABLISHED : 현재 연결되어 있다는 뜻
  - LISTENING : 연결을 위하여 접속을 기다리는 상태
  - TIME_WAIT : 이미 해당 사이트와 연결이 종료되었거나 다음 연결을 위해 기다리는 상태
  - SYN_SENT : 접속하기 위해 패킷을 보냈다는 뜻



2. netstat옵션 배우기
c:>netstat ?

netstat -a : 연결된 혹은 연결을 기다리고 있는 모든 포트를 보여줍니다. -a 옵션이 없으면 연결된 목록만 보여주는데, -a 옵션을 주면 연결되었거나 연결을 기다리는 목록을 모두 보여줍니다.

netstat -n : 통상 연결 목록이 컴퓨터 이름이 나오는데, -n 옵션을 주면 컴퓨터 이름 대신 ip 주소가 뜹니다.

netstats -an or -na : 컴퓨터와 연결되었던 혹은 연결을 기다리는 목록을 ip 주소로 바꾸어서 보여줍니다.

이제 netstat 명령을 알았으니 가끔씩 실행시켜주면 됩니다. netstat 명령으로 검색했을 때 알 수 없는 포트가 있거나,  포트중에 31337, 12345, 54321과 같이 트로이 목마가 사용하는 포트가 하나 열려 있거나 열려진 포트로 특정 IP가 접 속해 있다면 이는 십중팔구 해킹인 것입니다.


///// 응용 /////
#netstat -nap (열려 있는 모든 포트)
#netstat -l 또는 netstat -nap | grep LISTEN (LISTEN 되는 모든 포트)
#netstat -nap | grep ESTABLISHED | wc -l ( 모든 서비스 동시 접속자 수)
#netstat -nap | grep :80 | grep ESTABLISHED | wc -l ( 웹 동시 접속자 수)
TAG netstat, tcp

shell 명령어 && 유틸

it/etc 2006/06/29 01:02 Posted by newtype
df -k  빈공간 보기

du -sk *   목록으로 차지하는 용량 보기

rm -fr *    서브Dir도 지우고, 지우면서 묻지 않기

. .profile    수정한 .profile 적용하기

swinstall -s /설치할_depot_ 파일_경로  depot 파일을 설치 합니다.

history     입력한 shell명령 보기
              ( [ESC] + J, K 로 입력 가능합니다 )

uname -a    OS 버전 정보 보기

ipcs               메시지큐, 공유메모리 정보 등을 확인한다.

ipcrm -m  ID   ipcs를 통해 조회한 내용을 삭제한다.
                  (-m 옵션은 공유 메모리)

lsof -i | grep 포트 번호     특정 포트를 사용하고 있는 Process정보를 본다.

truss -p PID   해당 PID 해당하는 프로세스의 동작을 모니터링 한다.
                   (CPU점유율이 높아진 경우, 무한 루프등의 원인 규명에 큰 도움)

file 실행 파일명   컴파일 정보(32, 64비트 정보 등..)

route add -host xxx.xxx.xxx.xxx xxx.xxx.xxx.xxx    라우트 테이블에 추가

netstat -rn     랜카드 목록 보기
TAG cshell

tar 묶기 & 풀기

it/etc 2006/06/20 10:28 Posted by newtype
경로 포함 서브 디렉토리 포함 묶기
   tar cvf 20060620.tar .

풀기
  tar xvf 20060620.tar


TAG tar

[알고리즘] 시디키를 만들어 보자

it/etc 2003/01/14 15:34 Posted by newtype
CD 키


전략 시뮬레이션을 기획 제작하고 있는 게임사 개발팀의 박 팀장.

베틀넷 서비스를 구상하고 있기에 안전한 CD 키를 만들 방법이 없겠냐고 필자에게 물어온 적이 있었다. 아마 조금만 생각하면 쉽게 생각해 낼 수 있었겠지만 마땅히 문서화한 자료를 구하기 힘들었기 때문이었을 것이다. 사실 스타 크래프트의 CD 키 생성툴은 립버전이 활개를 치게 하는데 큰 역할을 했다. 여러 가지 알고리즘이 많이 있겠지만, 보통 이런 번호는 실제 키와 그 키를 암호화한 부분을 합친 것을 생각해 보자. 이 대표적인 예가 주민등록번호다. 주민등록번호는 실제키 12자리에 각 가중치를 줘 더한 값을 10으로 모듈 연산해 얻은 값을 마지막에 붙여 13자리로 이뤄진다.

따라서 12자리를 정한 후 마지막 자리를 10번 반복하면, 주민등록번호에 대한 인증은 뚫리게 된다. 일단 10진수가 위험하다는 것을 느꼈을 것이다. 여기에 알파벳 26자을 동원하면 36가지가 가능한 36진수가 된다. 소문자도 동원할 수 있지만 대소문자 구분까지 하는 것은 유행은 아닌 듯 하니 대소문자 구분은 하지 않고 36진수만 사용하도록 하자.

그리고 생성 규칙은 날짜에 그날 생성된 순서로 하자. 그리고 마지막에 이 값을 모두 더한 값을 끝에 덧붙이도록 하자.

Y0Y1Y2Y3/M0M1/D0D1 S0S1S2S3 H0H1H2

원문은 다음과 같다고 하자. 암호화 알고리즘은 여러 가지가 있지만, 어차피 공개키 방식을 동원할거라면, 어떤 알고리즘을 사용하더라도 어떤 알고리즘을 사용했는지 공개만 하지 않으면 되므로 비교적 구현이 쉬운 DLP(Discrete Logarithm Problem)을 이용하겠다. 지수는 곱셈을 반복하면 되는 것으로 구현이 비교적 간단하다. 다음 식을 보자.

Ax = B (mod n)

간단한 식이지만, 참 많은 규칙이 숨어 있다. A가 소수일때 '0

7x = B (mod 31)

이 정도면 훌륭하다. 36진수를 사용할 것이라고 했는데 31을 사용한 것은 모듈 연산을 소수로 해야 겹치지 않기 때문이다. 예를 들어 다음과 같은 경우를 생각해보자.

31 (mod 8) = 3
32 (mod 8) = 1
33 (mod 8) = 3
...

32가 1이 되면서 계속 3과 1이 반복돼 버린다. 따라서 8이 아닌 소수를 잡아야 한다. 계산을 하기 위한 힌트하나로 다음과 같은식이 성립한다.

Ax+y (mod n) = ( Ax (mod n) )× ( Ay (mod n) )

다음과 같은 예를 들 수 있다.

35(mod 7) = 243 (mod 7) = 5
= 31(mod 7)×34(mod 7) = 3 (mod 7)×11 (mod 7) = 33 (mod 7 ) = 5
= 32(mod 7)×33(mod 7) = 2 (mod 7)×6 (mod 7) = 12 (mod 7 ) = 5
이 속성은 실제 구현시 매우 유용한 속성으로 전값에 곱셈을 하고 바로 모듈연산을 해버리면 값이 작아지므로 작은 범위의 데이터 타입으로도 큰 지수 연산을 가능하게 해준다.

그럼 원문을 200103120003012이라고 해보자. 2001년 3월 12일의 세번째 만들어진 CD 키라는 뜻이다. 그리고 뒤에 012는 앞의 모든 숫자를 더해 만든 해시키다.

70 = 1 (mod 31)
71 = 7 (mod 31)
72 = 18 (mod 31)
73 = 2 (mod 31)
...
따라서 암호문은 다음과 같을 것이다.

( 18, 1, 1, 7, 1, 2, 7, 18, 1, 1, 1, 2, 1, 7, 18)

이 암호문은 아스키 코드 등으로 바꿔 사용하면 될 것이다. 그런데 0이 7개, 1이 4개, 2가 3개이다. 패턴을 읽힐 수 있다. 따라서 자리수별로 가중치를 주자. 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47로 하면 그 문제는 해결될 것이다. 그리고 이렇게 나온 값을 가지고 암호화 패턴을 하나 만들어 뒤에 4자리 정도 붙이자. 그럼 다음과 같은 결과 값이 나올 것이다.

22 = 4 (mod 31)
30 = 1 (mod 31)
50 = 1 (mod 31)
71 = 7 (mod 31)
110 = 1 (mod 31)
133 = 27 (mod 31)
171 = 17 (mod 31)
192 = 20 (mod 31)
230 = 1 (mod 31)
290 = 1 (mod 31)
310 = 1 (mod 31)
373 = 6 (mod 31)
410 = 1 (mod 31)
431 = 12 (mod 31)
472 = 8 (mod 31)

따라서 암호문은 다음과 같다.

( 4, 1, 1, 7, 1, 27, 17, 20, 1, 1, 1, 6, 1, 12, 8 )
( 4, 1, 1, 7, 1, R, H, K, 1, 1, 1, 6, 1, C, 8 )

4117-1RHK-1116-1C8

특성상 지수의 0승이 1이 돼 1이 많은데 실제 사용시에는 지수에 전부 1을 더해서 사용하면, 훨씬 분포도가 좋아 질 것이다. 이 키를 사용자가 입력하면 역으로 로그 연산을 하면 원문을 얻을 수 있다. 앞의 시리얼키를 해시해 나온 값이 해시키와 일치하면 그 키는 유효한 것이다.

네트워크에 연결되지 않은 채 로컬에서만 게임을 즐기는 사람이 많기 때문에 인증서버를 거치지 못하고 단방향 암호함수를 거치는 수밖에 없다.




<출처>
http://www.zdnet.co.kr/