Reminiscence

ascii_upload_enable=YES
ascii_download_enable=YES


vsftp에서 위 셋팅을 하지 않으면 기본적으로 바이너리 형태로만 데이터를 주고 받게 되는거 같다. 현재 운영하는 리눅스 서버들에서 아스키 파일들이 아스키 모드로 올라가지 않아 Internal Server Error를 뿜어대는 바람에 한참 삽질했다.

난 CGI가 문제 있는줄 알았다구!!! ㅜ_ㅜ

추가로 vsftpd.conf에서 사용되는 셋팅 값들을 퍼왔다.

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

vsftpd의 다양한 기능 설정(vsftpd.conf)
  vsftpd는 다양한 기능이 있습니다. 꼭 필요한 몇개의 지시자에 대해 알아보도록 하겠습니다.

  1) 아스키모드로 파일전송 하려면?
vsftp는 기본적으로 아스키모드(ASCII)로의 파일 전송을 허용하지 않습니다. 윈도우와 리눅스등의 엔터문자로 인한 text파일 변조(??)등 때문에 기본 허용하지 않습니다. 만약 필요해서 허용 하려면 다음과 같이 설정하시기 바랍니다.

ascii_download_enable=YES
ascii_upload_enable=YES


  2) 쉘권한이 없는 사용자들이 ftp를 사용가능하게 하려면?
대부분의 ftp서버는 로그인시 쉘을 요구하게 됩니다. 하지만 쉘 권한을 주지 않은 사용자들에게 ftp접근 권한을 주려면 /etc/pam.d/vsftpd파일에서 4번째 줄에 #을 입력하여 주석 처리 합니다.
(check_shell=NO 라는 지시자가 있었지만 PAM인증을 받는 곳에서는 작동하지 않았다.)


#%PAM-1.0
auth       required     pam_listfile.so item=user sense=deny file=/etc/vsftpd.ftpusers onerr=succeed
auth       required     pam_stack.so service=system-auth
#auth       required     pam_shells.so
account    required     pam_stack.so service=system-auth
session    required     pam_stack.so service=system-auth


  3) 사용자 home 디렉토리를 벗어나지 못하게 하려면?
ftp사용자가 자기 home디렉토리를 벗어나지 못하게 하려면 다음과 같이 설정합니다.

chroot_list_enable=YES
chroot_local_user=YES
위와같이 설정합니다. 접속하면 /etc/vsftpd.chroot_list 파일이 없다고 에러가 나게 됩니다.
단순히 touch /etc/vsftpd.chroot_list 이렇게 파일을 만들어 주면 됩니다.
그리고 특정유저는 제외하려면 /etc/vsftpd.chroot_list 파일에 사용자 계정을 넣어줍니다.



  4) "."으로 시작하는 숨김파일을 기본적으로 보이게 하려면?
리눅스에서 "."으로 시작하는 파일은 숨김 파일입니다. 하지만, 다른 os에서는 "."으로 시작해도 숨김파일으로 취급하지 않는 경우가 있습니다. 이런경우 항상 "."으로 시작하는 파일을 보여주려면 다음과 같이 설정합니다.
force_dot_files=YES



  5) ftp 접속시 파일과 디렉토리의 소유권을 숨기려면?
특수한 목적으로 파일 및 디렉토리의 소유자를 숨길 경우가 있습니다. 이런 경우 다음과 같이 설정하면, ftp라는 사용자로 보이며, 본 ID는 보이지 않습니다.
hide_ids=YES



  6) 하위디렉토리의 파일 및 디렉토리를 볼수 있는 ls -R 명령 허용하려면?
하위디렉토리 리스트를 보여주기 위해서 ls -R 명령어를 내릴때가 있습니다. 이런경우 대부분의 ftp 서버는 부하등의 이유로 막아 두게 됩니다. vsftpd또한 기본적으로 막아 놓은 상태이며, 허용하기 위해서는 다음 지시자를 입력하세요.
ls_recurse_enable=YES



  7) openssh에 chroot 패치가 된 것을 사용하는데 정책을 같이 적용하려면?
openssh에 패치를 가하면, ssh 또한 자기 home 디렉토리를 벗어나지 못하게 설정가능합니다. 이 정책은 /etc/passwd파일의 홈디렉토리 부분에 /home/사용자/./ 와 같이 "/./"을 붙여 사용자를 홈디렉토리로 제한하게 됩니다. 이 정책에 따라 적용하려면, 다음 옵션을 적용하시기 바랍니다.
passwd_chroot_enable=YES


  8) 파일을 올렸는데 시간이 이상하게 보인다면?

대부분의 ftp서버에서 시간 표현은 표준시각(GMT)을 보여주게 됩니다. 국내에서만 사용하는 ftp서버는 다음 옵션으로 국내 시간으로 보여줄 수 있습니다.
use_localtime=YES


  9) 전송속도를 제한하고 싶다면?
다운로드 받는 한 사용자가 네트웍 트래픽을 모두 사용해 버리는 것을 방지하기 위해서 대역폭을 조정해야 하는 경우가 있습니다. 다음 옵션으로 가능합니다. 뒤에 나오는 숫자의 단위는  (Bytes/Sec) 입니다.
local_max_rate=300000

위 설정은 300KByte/Sec의 대역폭을 제공합니다.


  10) 동시 접속자수를 제한하려면?
ftp서버에 접속할 수 있는 최대 접속수를 제한하려면, 아래의 설정으로 제한 가능합니다.
max_clients=10
위 설정은 동시에 10개의 연결으로 제한합니다.


  11) 한 IP당 접속할 수 있는 동시접속 수 제한하려면?
ftp서버의 한 사용자가 대역폭을 모두 사용해 버리는 것을 방지하기 위해, 전송 속도를 제한하면, flashget 등의 유틸리티로 몇개의 접속으로 나눠 받으면 대역폭 제한을 우회 할 수 있습니다. 이런경우 한 IP에서 접속 가능한 동시접속 수를 제한하므로 해결 가능합니다.
max_per_ip=2
위 설정은 한 IP에서 접속할 수 있는 연결을 2개로 제한합니다.


  12) PASSIVE 모드 사용시 사용하는 포트 범위를 제한하려면?
FTP에서 데이터 전송을 위해서 20번 포트를 사용합니다. 이경우 서버에서 클라이언트 쪽으로 연결을 하기 때문에 중간에 방화벽 또는 공유기등을 사용한다면, 정상작동하지 않을 수 있습니다. 이런 문제를 해결하기위해서 PASSIVE모드라는 것이 있고, 이 모드에서는 서버의 1024이후 포트를 사용합니다. 이 포트의 범위를 제한하기 위해서는 다음과 같이 설정합니다.
pasv_min_port=40000
pasv_max_port=50000
위 설정은 PASSIVE에서 사용할 포트를 40000~50000로 합니다.



  13) mp3, wmv 등의 확장자를 가진 파일의 업로드를 금지하려면?
ftp를 통해 인증된 사용자가 파일을 올리는 것을 막는 방법은 거의 없었습니다. 이 vsftpd는 특이하게 특정파일 패턴을 제한하는 기능이 있습니다.
deny_file={*.mp3,*.wmv}
위 설정은 mp3, wmv 파일을 전송하지 못하게 하는 방법입니다.



  14) 특정파일 패턴을 숨기려면?
특정파일이 서버내에는 존재하지만, ftp접속시 보여지지 않게 설정할 수 있습니다. 다음예를 보시기 바랍니다.
hide_file={*.mp3,.hidden,hide*,h?}
위 설정은 mp3파일, .hidden 파일, hide로 시작하는 파일을 보여지지 않게 하는 옵션입니다.

Comment +0

가끔씩 고객들이 load data infile할때 권한이 없다는 문의를 해온다.
작년에 이와 같은 문제로 해결해 준적이 있었는데 올해들어 이것저것 하다보니 까먹어 버렸었다;; 그러다 오랜만에 찾아보니 아래와 같이 나와있네.. ㅋ

1) load data infile '파일명' into table 테이블명
2) load data local infile '파일명' into table 테이블명


두 문장의 차이는 불러오려는 파일이 MySQL 서버에 있느냐? 아니면 원격에서 접속해서 처리하느냐이다.

local 명령어를 추가해서 사용할 경우에는 서버와 클라이언트 모두 local-infile옵션이 on으로 되어 있어야만 사용가능 하며 그에 따른 확인은 아래와 같이 할 수 있다.

mysql> show variables like 'local%';
위와 같은 명령어를 내렸을때 local-infileOn 으로 되어 있으면 사용이 가능한거다.

클라이언트에서 연결할때 사용하는 명령어는 아래와 같다.
$> mysql -u 아이디 -p -h 서버명 DB명 --local-infile=1

Comment +0

Client does not support authentication protocol requested by server와 같은 메세지를 내뿜으며 MySQL서버에 접속되지 않는 경우. 아래와 같이 해보세요~

MySQL 4.1 이상 버전에서는 비밀번호를 해쉬알고리즘을 기반으로한 인증 프로토콜을 사용합니다.
그리고 해당 기능이 하위버전의 Client와 호환이 되지 않기에 서버를 4.1이상으로 업그레이드를 한 후에 아래와 같은 에러메세지를 접하게 될수 있습니다.

shell> mysql
Client does not support authentication protocol requested
by server; consider upgrading MySQL client

위의 문제점을 해결하기 위해서는

1. 모든 Client 프로그램을 4.1이상으로 업그레이드한다.
2. 사용하려는 계정을 4.1 이전 Client 프로그램과 통신이 가능한 이전 비밀번호 체계로 변경한다.

mysql> SET PASSWORD FOR
-> 'some_user'@'some_host' = OLD_PASSWORD('newpwd');

Alternatively, use UPDATE and FLUSH PRIVILEGES:

mysql> UPDATE mysql.user SET Password = OLD_PASSWORD('newpwd')
-> WHERE Host = 'some_host' AND User = 'some_user';
mysql> FLUSH PRIVILEGES;

3. --old-passwords 옵션으로 서버를 이전비밀번호 체계로 실행한다.

4.1 이후 비밀번호를 사용하는 계정을 모두 변경처리 한다.

SELECT Host, User, Password FROM mysql.user
-> WHERE LENGTH(Password) > 16;

Comment +0

한글로된 MySQL 5.0 레퍼런스 메뉴얼이 있는 사이트 입니다.

모르는 사항이나 영문판으로 궁금한 사항이 있을때 참조하면 이해가 빠를꺼 같군요.

http://www.mysqlkorea.co.kr/develop/sub_01.html


MySQL Cert 관련 Dump 있으시거나, 관련 문서가 있으신 분은 제공 부탁드립니다.

Comment +0

제  목 : procmail과 perl로 메일수신로그를 DB로. v2
작성자 : 좋은진호(truefeel, http://coffeenix.net/ )
작성일 : 2004.1.15(목)
수정일 : 2004.1.18(일) DB 스키마 수정, mail_log.pl에서 작은따옴표(')처리
        http://coffeenix.net/board_view.php?bd_code=172
업데이트 : 2004.9.10(금) 메일 필터링 여부 체크 필드 추가

메일 쿼터(파일시스템 쿼터나 milterAPI를 이용하지 않고 순수 procmail+perl로만으로
구현할려는 진보적인(?) 쿼터)를 위해 만드는 과정에서 수신 정보가 필요했고, 이
수신정보를 DB로 남겨도 좋겠다는 생각을 하게되었다.
즉, 단순히 곁다리로 나온 것이지만 쓸만하다 싶어(?) 정리하여 소개한다.

1. 들어가기

1) DB로 남기면 뭐가 좋은가?

 - 통계처리가 쉽게 가능하다.
   월 몇통의 메일을 받는 서버인지 COUNT(*)만으로 쉽게 확인할 수 있다.
 - 수신자별로 메일 수신 메일 통수 통계를 볼 수 있다. (수신자별 GROUP BY 로 가능)
 - 메일 제목을 통해 필터링할 스팸 메일 설정을 쉽게 도와준다.
 -  SUM(MAIL_SIZE)를 이용하면 월별 메일 수신용량(헤더 제외)을 확인할 수 있다.
 - 메일 필터링 여부를 DB에 저장하여 필터링 비율을 확인할 수 있다.

2) 어떤 로그를 남기는가?

 - 메일 송신자 메일주소와 이름
 - 메일 수신자 ID
 - 메일 제목
 - 본문 길이 (단위 byte)
 - 송신한 일시 (정확히는 DB에 로그를 남긴 일시이나 시간상의 차이는 거의 없다.)
 - 필터링 여부 (값이 0이면 필터링되지 않은 메일이다.)

3) 과정을 이해해보자.

 sendmail, qmail 등에서 메일을 수신하면 MDA인 procmail로 넘겨준다.
 -> /etc/procmailrc 에서 메일 제목 디코딩을 한다.  (procmail에서)
 -> 송신자, 수신자, 제목, 길이 등을 얻어내어 변수에 저장한다. (procmail에서)
 -> 얻어낸 값을 mail_log.pl 로 넘겨준다. (procmail에서)
 -> DB로 저장한다. (mail_log.pl에서)
 -> 필터링 여부를 체크한다. (mail_filterchk.pl에서)

2. 요구 사항

1) DB는 MySQL을 사용한다.
  오라클도 상관없다. 그게 바로 Perl DBI모듈의 장점이다.

2) Perl과 Perl DBI, DBD 모듈이 필요하다.
  펄의 저장창고라 불리는 CPAN( http://www.cpan.org/modules/ )에서
  DBI, DBD 모듈을 구할 수 있다.
  참고로 레드햇 9에서는 rpm으로 제공된다.

  http://www.cpan.org/authors/id/T/TI/TIMB/DBI-1.43.tar.gz
  http://www.cpan.org/authors/id/J/JW/JWIED/DBD-mysql-2.1028.tar.gz

  먼저 DBI을 다음과 같은 과정으로 설치하고 똑깥이 DBD-mysql도 설치하면 된다.
  기존에 설치된 것을 사용했으므로, 위에 링크한 소스로 컴파일했을 때 문제가
  발생하는지에 대해서는 확인해줄 수 없다.
   

  # perl Makefile.PL
  # make
  # make test
   (꼭 할 필요는 없다. 정상 동작하는 것인지 확인하기 위한 용도.
    예전에 설치했을 때 몇 개 오류가 발생했어도 실제 사용에는 문제없었다.)
  # make install


3) 메일 제목의 한글 디코딩을 위해서는 hcode 프로그램이 필요하다. (옵션)
  ftp://ftp.kaist.ac.kr/pub/hangul/code/hcode/
  ftp://ftp.kreonet.re.kr/pub/hangul/cair-archive/code/hcode/
  에서 구할 수 있으며, make 만으로 컴파일할 수 있다.

3. procmail 설정

[ /etc/procmailrc 설정 중 디코딩 부분만 ]

# 메일 헤더 디코딩
:0 fhw
*^(Subject|From|Cc):.*=\?EUC-KR\?(B|Q)\?
 |formail -c | /usr/bin/hcode -dk -m

:0 Efhw
*^(Subject|From|Cc):.*=\?ks_c_5601-1987\?(B|Q)\?
 |formail -c | /usr/bin/hcode -dk -m

:0 Efhw
*^(Subject|From|Cc):.*=\?KSC5601\?(B|Q)\?
 |formail -c | /usr/bin/hcode -dk -m

:0 Efhw
*^(Subject|From|Cc):.*=\?ISO-8859-1\?(b|B|Q)\?
 |formail -c | /usr/bin/hcode -dk -m

# 메일 수신로그를 DB로 저장
INCLUDERC=/etc/procmail/mail_log.rc

# 이부분에 필터링 내용을 나열한다.
#
# 예)
#
# SPAM_LOG=/var/log/SPAM.log
# :0 :
# * ^Subject:.*(무료.*(교재|샘플|증정|홍삼)|샘플.*무료.*(배송|배포|제공)|자선전안내|기적.*영문법|명품.*(최저
# * *가|시계))
# $SPAM_LOG

# 필터링 여부를 체크한다. (필터링이 안된 메일만 mail_filterchk.rc가 실행된다.)
INCLUDERC=/etc/procmail/mail_filterchk.rc


: 는 처리할 조건의 시작을 의미하며 recipes라 불린다.
위에서 헤더에서 각각의 조건을 찾아 맞지 않으면 다음 조건(E = else if로 이해하면 됨)을
처리하는 형태로 되어 있다.
이런 과정을 거쳐 Base64나 QP로 인코딩된 메일 헤더를 디코딩하게 된다.

이제 include된 mail_log.rc과 mail_filterchk.rc 를 살펴보자.

[ /etc/procmail/mail_log.rc ]

# 송신자 메일주소
:0
* ^From: \/.*
{
       FROM = "$MATCH"
}
# 수신자 메일주소
:0
* ^To: \/.*
{
       TO = "$MATCH"
}
# 메일제목
:0
* ^Subject: \/.*
{
       SUBJECT = "$MATCH"
}

# 메일 본문 byte수
:0
* 1^1 B ?? > 1
{ }

LENGTH = $=

RESULT=`/etc/procmail/mail_log.pl "$FROM" "TO" $LOGNAME "$SUBJECT" $LENGTH`

* 다운로드 : http://coffeenix.net/truefeel/files/mail_log_v2/mail_log.rc

각각의 조건에 의해 수신자, 송신자, 메일제목, 본문 길이를 얻어낸다.
그 얻어진 값은 변수에 저장되어 mail_log.pl 프로그램에 인수로 넘겨주게 된다.

어떻게 매칭이 되어 FROM, TO, SUBJECT, LENGTH 변수에 값이 들어가는지 궁금하면
procmailrc 에 VERBOSE=yes 로 하면 쉽게 확인할 수 있을 것이다.


LOGFILE=/var/log/procmail
VERBOSE=yes


[ /etc/procmail/mail_log.rc ]

# 메일 필터링 여부 체크
#
# 메일 필터링이 되지 않은 경우는 DB에서 필터링 유무 체크용 필드를 0 으로
# update합니다.
# 이 파일은 /etc/procmailrc 의 제일 마지막에 INCLUDE해야 합니다.
RESULT2=`/etc/procmail/mail_filterchk.pl "$RESULT"`

* 다운로드 : http://coffeenix.net/truefeel/files/mail_log_v2/mail_filterchk.rc

4. DB 스키마

MAIL_LOG DB 스키마이다.

/* 메일 수신 로그 */
CREATE TABLE MAIL_LOG (
 MAIL_SEQ              int unsigned not null auto_increment,    /* 로그 SEQ.  */
 MAIL_FROM             varchar(255),                   /* 송신자(From) */
 MAIL_FROMNAME         varchar(255),                   /* 송신자 이름 */
 MAIL_FROMMAIL         varchar(255),                   /* 송신자 메일주소 */
 MAIL_TO               varchar(255),                   /* 수신자(To)  */
 MAIL_LOGNAME          varchar(255),                   /* 수신 ID   */
 MAIL_SUBJ             varchar(255),                   /* 제목      */
 MAIL_SIZE             int unsigned default 0,         /* 메일 크기 */
 MAIL_FILTERCHK        int unsigned default 0,         /* 필터링 유무 (0=필터링 안됨) */
 MAIL_DATE             datetime,                       /* 메일 날짜 */
 PRIMARY KEY (MAIL_SEQ),
 INDEX key_filterchk(MAIL_FILTERCHK)
);

* 다운로드 http://coffeenix.net/truefeel/files/mail_log_v2/mail_log.sql

5. 로깅 및 필터링 여부 체크 프로그램

다음은 로그를 DB에 저장하는 펄 소스이다.

[ /etc/procmail/db_lib.pl ]

#!/usr/bin/perl
#
# DB 함수
#
# Made By Jinho Hwangbo ( 좋은진호, http://coffeenix.net/ )

use DBI;

# DB 연결
sub db_connect {
   $szDBName  = "DB지정";
   $szDBUser  = "DB USER ID";
   $szDBPasswd= "DB 비밀번호";

   $dbh = DBI->connect ( "DBI:mysql:$szDBName", $szDBUser, $szDBPasswd)
|| die "$DBI::errstr";
}

# DB 접속을 끊음
sub db_disconnect {
   $dbh->disconnect();
}

# SQL문 실행
sub db_do_sql {
   my ( $szSQL ) = @_;
   my ( $sth );

   $sth = $dbh->prepare($szSQL);

   # 오류가 발생했는지 검사 --------
   if ( $@ ) {
        &db_disconnect;
        print " 오류 발생 : $@\n";
   } else {
        $sth->execute;
   }
   $sth->finish();
}

$temp="1";


[ /etc/procmail/mail_log.pl ]

#!/usr/bin/perl
#
# procmail을 통해 넘겨온 메일 수신 정보를 DB로.
#
# Made By Jinho Hwangbo ( 좋은진호, http://coffeenix.net/ )
#
# 2004.1.13(화)
# 2004.9.10(금) 필터링 여부 체크용 필드 추가
#
# - Perl DBI, DBD 모듈 필요
# - DB : MySQL
# - 넘겨오는 값 : 순서대로 From, To, 수신ID, 메일제목, 본문크기(byte)

require '/etc/procmail/db_lib.pl';

# $DEBUG = 1;
# 정보를 넘겨 받음
if ( $#ARGV < 4 ) {
   print "실행방법이 틀렸습니다. procmail을 통해서 실행하세요.\n";
   exit 1;
}
($FROM, $TO, $LOGNAME, $SUBJECT, $SIZE ) = @ARGV;

# DB저장을 위한 작은 따옴표 처리
$FROM    =~ s/'/''/g;
$TO      =~ s/'/''/g;
$SUBJECT =~ s/'/''/g;

# From: 에서 이름과 메일주소를 분리
# 예 1) $FROM = '"truefeel" ';
# 예 2) $FROM = 'true____@coffee___.___';
# 예 3) $FROM = '';
if ( $FROM =~ /"{0,}([^"|.]*)"{0,}\s{0,}<(.*)>/g ) {
   $FROMNAME = $1;
   $FROMMAIL = $2;
} else {
   $FROMMAIL = $FROM;
}

# 필터링 여부 체크를 위한 Uniq한 키(9자리) 만들기
srand();
$FILTERCHK = sprintf("%09d", int(rand(999999999)) );

# -------------------------------------------------
# DB 처리
# -------------------------------------------------
# DB 접속
&db_connect;

# 로그 저장
$szSQLMailLog = qq {
   INSERT INTO MAIL_LOG
   VALUES ('', '$FROM', '$FROMNAME', '$FROMMAIL', '$TO', '$LOGNAME', '$SUBJECT', '$SIZE', '$FILTERCHK', now() ) };
&db_do_sql($szSQLMailLog);
&db_disconnect;

# 디버깅
if ( defined($DEBUG) ) {
   $szMailLog = sprintf("송신= %s\n수신= %s, %s\n제목= %s\n크기= %dBytes\n", $FROM, $TO, $LOGNAME, $SUBJECT, $SIZE);
   open(FILE, ">/tmp/maillog.debug");
      print FILE $szMailLog;
      print FILE "$szSQLMailLog \n";
   close(FILE);
}

print $FILTERCHK;      # 키값을 procmail 로 넘김
exit;

* Syntax Highlight된 소스 보기 :
 http://coffeenix.net/truefeel/files/mail_log_v2/mail_log.pl.html
 http://coffeenix.net/truefeel/files/mail_log_v2/db_lib.pl.html
* 다운로드
 http://coffeenix.net/truefeel/files/mail_log_v2/mail_log.pl.txt
 http://coffeenix.net/truefeel/files/mail_log_v2/db_lib.pl.txt

간단히 살펴보자.

넘겨온 인수중에서 송신자 정보는 이름과 메일주소로 나눈다. 물론 이름이 없어도 문제없이
처리한다. 그리고 DB에 저장하고 종료한다.
$DEBUG = 1 으로 지정하면 디버깅에 유용하다. 넘겨받은 인수를 /tmp/maillog.debug에 저장 한다.

db_connect() 함수에서 $szDBName, $szDBUser, $szDBPasswd을 설정해주어야 한다.
만약 Oracle DB이라면 'DBI:mysql' 대신 'DBI:Oracle'을 써주면 된다.

주의할 것은 DB 비밀번호도 있으니 파일 퍼미션을 700(rwx------)으로 해야한다.


# chmod 700 /etc/procmail/db_lib.pl


[ /etc/procmail/mail_log.pl ]

#!/usr/bin/perl
#
# procmail을 통해 넘어온 키로 필터링 여부를 DB에 표시
#
# Made By Jinho Hwangbo ( 좋은진호, http://coffeenix.net/ )
#
# 2004.9.10(금)
#
# - Perl DBI, DBD 모듈 필요
# - DB : MySQL
# - 필터링 안된 것은 MAIL_FILTERCHK 필드를 0 으로 함

require '/etc/procmail/db_lib.pl';

# $DEBUG = 1;
# 정보를 넘겨 받음
if ( $#ARGV < 0 ) {
   print "실행방법이 틀렸습니다. procmail을 통해서 실행하세요.\n";
   exit 1;
}
($FILTERCHK ) = @ARGV;

# -------------------------------------------------
# DB 처리
# -------------------------------------------------
# DB 접속
&db_connect;

# 로그 저장
$szSQLMailLog = qq {
   UPDATE MAIL_LOG SET MAIL_FILTERCHK = 0 WHERE MAIL_FILTERCHK = '$FILTERCHK' };
&db_do_sql($szSQLMailLog);
&db_disconnect;

# 디버깅
if ( defined($DEBUG) ) {
   $szMailLog = sprintf("송신= %s\n수신= %s, %s\n제목= %s\n크기= %dBytes\n", $FROM, $TO, $LOGNAME, $SUBJECT, $SIZE);
   open(FILE, ">/tmp/maillog.debug");
      print FILE $szMailLog;
      print FILE "$szSQLMailLog \n";
   close(FILE);
}

exit;

* Syntax Highlight된 소스 보기 :
 http://coffeenix.net/truefeel/files/mail_log_v2/mail_filterchk.pl.html
* 다운로드
 http://coffeenix.net/truefeel/files/mail_log_v2/mail_filterchk.pl.txt

수신 메일에 대한 유일한 키값($FILTERCHK)을 넘겨받아서 필터링 되지 않은 메일임을
표시한다. (UPDATE문, MAIL_FILTERCHK = 0)

로그가 제대로 남았는지 확인해보자.


로그를 DB로 남겼을 때 어떻게 활용할 것인지 생각했는가?
그럼 지금 당장 시작해라!

6. 참고 자료

* Procmail Tips
 http://pm-doc.sourceforge.net/pm-tips.html
* procmail에 관하여 (글 이상로)
 http://trade.chonbuk.ac.kr/~leesl/procmail/index.html
* Short guide to DBI (The Perl Database Interface Module)
 http://www.perl.com/pub/a/1999/10/DBI.html


내가 관리하는 리눅스 서버는 약 12대 정도다. 한대당 평균 하루 5~10만건 이상의 메일이 발송된다. 이중 스팸메일이 85%가 넘으며, 이런 스팸메일로 인해 우리 리눅스 서버는 IP가 자주 블럭되었었다.  해당 서버의 IP가 블럭되는것을 막기위해 난 Procmail과 Sendmail을 이용하여 발송되는 메일들을 필터링 하기 시작했다.

필터링 하여 로그를 남기는건 좋으나, 나중에 분서하기가 까다로웠는데, 아래 메뉴얼을 참고하여 발송되는 내역에 대한 로그를 DB화 해야 할꺼 같다....

위 메뉴얼은 받는 메일에 대한 부분이지만, 난 발송되는 메일에 대한 부분? ㅋ
응용하면 얼마든지..

Comment +0

Apache 를 컴파일 할때
--enable-suexec
옵션을 줘서 컴파일 한다.

위 옵션을 줄때는 반드시 부수적인 옵션 하나 이상이 있어야 한다.
--with-suexec-bin Path to suexec binary
--with-suexec-caller User allowed to call SuExec
--with-suexec-userdir User subdirectory
--with-suexec-docroot SuExec root directory
--with-suexec-uidmin Minimal allowed UID
--with-suexec-gidmin Minimal allowed GID
--with-suexec-logfile Set the logfile
--with-suexec-safepath Set the safepath
--with-suexec-umask umask for suexec'd process
이것중에 적어도 하나는 포함해야 합니다.

저는 httpd-2.0.49 에서
--server-uid=web \
--server-gid=web \
--enable-suexec \
--suexec-uidmin=1000 \
--suexec-gidmin=1000
이렇게 포함했습니다. UID 와 GID 가 1000 미만인 파일은 실행이 안되게끔...
단, web User 의 UID 와 GID 가 1000 이상이여야합니다. 이상이 아닐경우 오류를 출력합니다.

컴파일 설치한 후에는 httpd.conf 파일을 수정합니다.
먼저 CGI 가 실행되게끔 해줍니다.

AddHandler cgi-script .cgi

앞에 # 주석 제거.

<Directory ... > 의 Options 에 IncludesNoExec 를 ExecCGI 로 수정

Section 3 의 Virtual Hosts 를 사용하는 경우

<VirtualHost *:80>
.
.
SuexecUserGroup master master
.
</VirtualHost>
<VirtualHost *:80>
.
.
SuexecUserGroup useraaa groupaaa
.
</VirtualHost>
<VirtualHost *:80>
.
.
SuexecUserGroup userbbb groupbbb
.
</VirtualHost>

이런식으로 SuexecUserGroup 를 써줍니다. 보시면 아시겠지만 SuexecUserGroup 다음에 처음 작성하는게 해당 도메인 User 이고 두번째 작성하는게 해당 도메인 Group 입니다.

이제 간단하게 test.cgi 파일을 작성합니다. 단 조심하실점은 작성된 CGI 파일은 Group 이나 Order 에 Write 권한이 있다면 Internal Server Error 를 출력합니다. (User 에 Write 권한은 오류출력 안함.)

간단하게 CGI 파일의 권한설정을 chmod 500 test.cgi 정도로 주시면 되겠습니다. 이렇게 주시면 Group 이건 Order 건 접근 불가능 입니다.

그리고 위에 저와 같이 UID 와 GID 를 1000 으로 주신경우에 만약 1000 이하의 User 나 Group 의 CGI 를 실행할 경우 역시 Internal Server Error 에러를 출력합니다.

그리고 SuexecUserGroup 에서 지정된 User 와 Group 이 아니여도 Internal Server Error 오류를 출력합니다.

언제든지 suexec 설정을 보실려면

./suexec -V

하시면 되며 수정은 불가입니다. 수정하실려면 Apache 재설치 하셔야합니다.


오류의 원흉 정리)
1. --enable-suexec 옵션을 사용할경우 꼭 부수적인 옵션을 하나이상 포함할것.
2. 웹서버 데몬 User 와 Group 은 --suexec-uidmin=xxx --suexec-gidmin=xxx 에서 지정된 UID 와 GID 보다 클것.
3. 파일소유주와 그룹이 --suexec-uidmin=xxx --suexec-gidmin=xxx 에서 지정된 UID 와 GID 보다 클것.
4. 파일소유주와 그룹이 SuexecUserGroup 에서 지정한 User 와 Group 일것.
5. 파일권한에 Group 과 Order 에 write 권한이 없을것.(Suexec 를 사용하는경우는 그냥 퍼미션을 Group 과 Order 에 주지마세요 User 권한만 있으면 됩니다.)

추신. 저녁에 그냥 심심해서 작성한 글입니다. Suexec 를 사용할려고 하는분이나 설정이 미비하신분들은 사용하시면 좋습니다. Suexec 를 사용하지 않는 경우는 웹CGI 땜시 서버가 흔들리는 경우가 다반사라서...--; Suexec 를 사용한다 하더라도 SuexecUserGroup 를 주지 않는다면 역시 하나마나한거라서...--;

출처 : phpschol.com  글쓴이 : cgi

'Linux > Apache' 카테고리의 다른 글

mod_jk 컴파일 에러 처리... -_-  (0) 2009.04.11
apache - Suexec 와 Cgi 파일간의 관  (0) 2006.11.13
[Kisa] Mod_Security Manual  (0) 2006.10.09

Comment +0

한국 정보보호 진흥원에서 제공하는 Mod_security Module에 대한 Manual입니다.

간략한 셋팅을 하기에는 딱 좋은 것 같네요 ^^

우리 모두 보안에 힘을 씁시다!!

'Linux > Apache' 카테고리의 다른 글

mod_jk 컴파일 에러 처리... -_-  (0) 2009.04.11
apache - Suexec 와 Cgi 파일간의 관  (0) 2006.11.13
[Kisa] Mod_Security Manual  (0) 2006.10.09

Comment +0

MySQL_reference_manual-4.1-en.pdf

MySQL 4.1 Reference Manual

Comment +0

유닉스 및 리눅스 명령어 팁

  1. 서브 디렉토리까지 파일안의 문자열 모두 검색
  2. haha와 huhu가 동시에 들어있는 행 뽑기
  3. 찾아서 지우기
  4. 공사중에 로그인 막기
  5. 크기가 가장 큰 파일, 디렉토리 찾기
  6. 가장 큰 파일을 찾으려면
  7. 현재 디렉토리의 크기만을 파악할때
  8. 시스템 정보 감추기
  9. 어떤 프로세스가 메모리를 가장 많이 잡아먹고 있는지 알아내기
  10. FTP로 들어온 사용자 확인하기
  11. 원하지 않는 사용자 죽이기
  12. less 결과를 vi로 보기
  13. vi에서 블럭 설정하기
  14. man 페이지 프린트하기
  15. ping 무시하기
  16. LILO 다시 살리기
  17. 특정 사용자 ftp 접근 막기
  18. X 윈도우에서 TV보기
  19. ls라는 파일이 포함된 rpm패키지 찾기
  20. 현재 rpm패키지의 의존패키지
  21. 현재 디렉토리크기
  22. 바로 이전 디렉토리로 가기
  23. 프로세스명으로 프로세스 죽이기
  24. 하드웨어 시계맞추기
  25. 원격에서 리모트서버의 X application실행시
  26. 링크 파일
  27. ^M 문자 없애기
  28. 비어있는 행을 찾기
  29. 기타 명령어 떼
  30. 각자가 사용하는 컴퓨터의 정보를 알고 싶을때
  31. 전체 메일
  32. 디렉토리만 빠르게 검색
  33. 호스트 네임 바꾸기
  34. 틀린명령어 틀린글자만 바꿔서 실행
  35. 유닉스의 현재 버젼과 종류 그리고 라이센스등을 알려주는 명령어
  36. 열려있는 포트 알아내기
  37. 텔넷 모든 접속자에게 메세지 보내기
  38. lsof는 열려있는 파일을 나타내 주는 옵션
  39. 사용자가 어디에서 무엇을 하는지 알아내기
  40. 텔넷 화면 수정
  41. 하위 디렉토리 한꺼번에 만들기
  42. 특정디렉토리의 모든 파일 안의 특정 문자열 치환
  43. killall 명령 시뮬레이션 (프로세스명으로 죽이기)
  44. find와 grep
  45. vi 검색, 치환
  46. 파일내의 중복되는 행을 제거 : uniq
  47. 파일의 결합
  48. 파일의 암호화 : crypt
  49. 개행을 제외한 화면내의 보이지 않는 문자 출력
  50. 화일내의 포함된 특정문자열로 찾아서 내용만 출력하기
  51. 특정 파일의 화일명을 비슷하게 여러개 한꺼번에 바꾸기
  52. 어제 날짜 구하기
  53. 원하지 않는 사용자 죽이기
  54. UNIX상에서 한글출력이 깨져 나올경우
  55. 현재 디렉토리의 대량의 파일을 각자의 파일명가운데에 특정문자 추가하여 바꾸기


0.0.0.1 서브 디렉토리까지 파일안의 문자열 모두 검색

find ./ -name "*" -exec grep 'abc' {} ; -print find . -name -print -exec grep abc {} ; grep -r abc * 

0.0.0.2 haha와 huhu가 동시에 들어있는 행 뽑기

grep haha foo.txt | grep huhu 

0.0.0.3 찾아서 지우기

find / -name "*.eml" -exec rm -f {} ; 

0.0.0.4 공사중에 로그인 막기

시스템을 공사중일 때, root 이외의 다른 사용자를 로그인 못하게 해야 할 때가 있죠? 그럴 때는, /etc/nologin 이라는 파일을 만들어,공사중 또는 Under Construction이라는 공지를 넣으면 됩니다.

0.0.0.5 크기가 가장 큰 파일, 디렉토리 찾기

가장 큰 디렉토리를 찾으려면,

du -S | sort -n  

0.0.0.6 가장 큰 파일을 찾으려면

  ls -lR | sort +4n  

0.0.0.7 현재 디렉토리의 크기만을 파악할때

[root@dev2 local]# du -c -h --max-depth=0 * 

0.0.0.8 시스템 정보 감추기

/etc/inetd.conf 파일을 열어서,

telnet stream tcp nowait root /usr/sbin/tcpd in.telnetd -h 

0.0.0.9 어떤 프로세스가 메모리를 가장 많이 잡아먹고 있는지 알아내기

ps -aux | sort +4n  또는 ps -aux | sort +5n  

0.0.0.10 FTP로 들어온 사용자 확인하기

  ftpwho,ftpcount  

0.0.0.11 원하지 않는 사용자 죽이기

 skill -KILL sunny  

위의 명령을 내리면 sunny 라는 사용자를 완전히 추방시킬수 있습니다. 그런데 이렇게 완전히 추방시키는게 아니구, 특정 터미널에 접속해있는 사용자만 추방시켜야 할 때도 있겠죠? 그럴때는

 skill -KILL -v pts/14  

이런식으로 하면 된다 그럼 pts/14 에 연결되어 있는 사용자가 죽게 됩니다.

0.0.0.12 less 결과를 vi로 보기

less상태에서 v를 누르면 바로 vi로 감

0.0.0.13 vi에서 블럭 설정하기

alt+v 하면, 라인 단위로 블럭 설정을 할 수 있으며, 해제 하시려면 Esc를 누르면 됩니다. 또한 ctl+v를 하시면, 블럭 단위로 블럭을 설정하실 수 있습니다. 블럭을 설정 하신 뒤,

삭제를 하려면 x 복사를 하려면 y 붙여넣기는 p

0.0.0.14 man 페이지 프린트하기

  man -t vi > vi.ps  

0.0.0.15 ping 무시하기

echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all echo 0 > /proc/sys/net/ipv4/icmp_echo_ignore_all 

0.0.0.16 LILO 다시 살리기

  boot : vmlinuz root=/dev/hda6  

0.0.0.17 특정 사용자 ftp 접근 막기

/etc/ftpusers 파일에 로그인 네임을 추가하면 됩니다.

0.0.0.18 X 윈도우에서 TV보기

리눅스에서 TV보기 위해서는 드라이버 파일과 TV를 보는 프로그램이 필요합니다. 이 글에서는 미지 리눅스 OS에 탑재된 bttv 칩셋을 사용하는 TV 카드를 기준으로 설명합 니다. 만일 커널을 새로 컴파일 하실 분은 반드시 Character devices -> Video For Linux -> BT848 Video For Linux 항목을 모듈화 시키거나 커널에 포함하십시오. TV 카드를 리눅스에 인식시키기 위해서 /etc/conf.modules 파일에 다음과 같은 내용을 삽입하고 컴퓨터를 다시 시작합니다.

alias char-major-81 bttv  

# 필립스 튜너의 경우 pre-install bttv modprobe -k tuner # 알프스 튜너의 경우 pre-install bttv modprobe -k tuner type=9

이제 kwintv나 xawtv 등의 TV 시청 프로그램으로 TV를 볼 수 있습니다. 만약 TV 장치를 찾지 못하는 오류가 있다면 bttv driver 디렉토리에 포함된 MAKEDEV 를 실행하십시오.

0.0.0.19 ls라는 파일이 포함된 rpm패키지 찾기

일단 ls의 절대경로를 알아야 한다. which lswhich로 알아낸 ls의 절대경로로 rpm질의를 한다.

rpm -qf /bin/ls [root@piruks /etc]# which ls /bin/ls [root@piruks /etc]# rpm -qf /bin/ls fileutils-4.0i-2mz 

0.0.0.20 현재 rpm패키지의 의존패키지

  rpm -qR 패키지명  

0.0.0.21 현재 디렉토리크기

  du -h --max-depth=1 .  

0.0.0.22 바로 이전 디렉토리로 가기

  cd -  

0.0.0.23 프로세스명으로 프로세스 죽이기

killall 프로세스명 kill -9 `pidof 프로세스명 

0.0.0.24 하드웨어 시계맞추기

배포본을 설치하고 나면 시간이 맞지 않는 경우가 많다. 간단히 어느정도 정확한 시간을 설정하는 방법이다.

[root@dev /down]# rdate -s time.kriss.re.kr [root@dev /down]# clock -w 

0.0.0.25 원격에서 리모트서버의 X application실행시

X윈도 app를 실행할때 다음과 같은 에러가 나면 조치

[kang@dev /home/kang] xclock Xlib: connection to "211.222.186.170:0.0" refused by server Xlib: Client is not authorized to connect to Server Error: Can't open display: 211.222.186.170:0.0 	

export DISPLAY=211.222.186.170:0 xhost +211.222.186.170

0.0.0.26 링크 파일

ln -sf 링크할디렉토리 링크로 만들어질 디렉토리 참고로 링크를 걸기만 한다고 접근가능한것은 아니고,링크가 걸린 디렉토리의 퍼미션도 허용으로 바꿔야 한다. 링크로 만들어질 디렉토리는 저절로 생성되고 퍼미션 777로 잡혔음.

ln -sf /www/dir_1/r_photo /www/dir_2/r_photo  

0.0.0.27 ^M 문자 없애기

a = 1^M def vartest(a):^M a = a + 1^M return a^M a = vartest(a)^M print a^M  

Unix류 기계에서는 그냥 ^J 하나만을 개행문자로 사용하는데 PC에서는 MJ 이렇게 두 제어문자가 연속으로 사용되어야 개행문자로 받아들이죠. (그래서 PC쪽에서 만들어진 txt문서를 유닉스 기계로 불러와 vi 등을 실행하면 줄 끝마다 보기싫은 ^M이 붙습니다. 뭐 vi에서 요거 지우는건 간단하지만요.)

PC에서 Unix에서 작성한 텍스트 문서를 보통 ftp로 받아오거나 하면 워드패드 등에서 봤을 때 전혀 개행이 되어있지 않지요. 하지만 MS Word 등 좀더 강력한 편집기에선 대개 잘 처리해서 잘 보여줍니다.

위는 간단한 Python 소스입니다. 위의 경우 처럼 ^M문자가 있을때, dos2unix라는 유틸리티를 많이 사용하기도 하죠. 하지만 vi에서 간단하게 모두 삭제할수도 있습니다. dos2unix가 없거나 빠져나가서 지우는게 귀찮을때 좋겠죠. 명령은 :%s/(ctrl+v)M//g 입니다. (ctrl+v)M 이거는 ctrl과 v를 눌러준후, ctrl키를 떼지 말고 바로 m을 눌러주시믄 됩니다. 위는 정규표현식을 이용한것이고, 형식은 %s/이것을/요걸로/g 입니다 그럼 문서안의 모든 "이것을" "요걸로" 바꾸게 되죠. 단, M의 경우 ctrl+M의 뜻인데 단순히 문자로 M을 바꾸라도 해도 인식을 못하기 때문에, 위처럼 (ctrl+v)M 으로 해주셔야 합니다.

0.0.0.28 비어있는 행을 찾기

  #grep -n '^$' filename  

정규표현 의미 ^ 행의 처음 $ 행의 끝 . 임의의 한 문자 [...] ... 안의 임의의 한 문자. a-z,0-9 같은 범위도 사용 [^..] .. 안에 없는 임의의 한 문자. 범위 사용가능 r* 0회 이상 r 반복 r+ 1회 이상 r 반복 r? 0 혹은 1회의 r r{n,m} n회 이상 m회 이하 r 반복 r1|r2 r1 혹은 r2 (egrep 만) (r) r 의 정규표현(egrep 만)

0.0.0.29 기타 명령어 떼

alias(명령어 간소화하기) apropos(관련된 명령어 찾기) arch(컴퓨터 종류 알기) arp(같은 서브넷의 IP 보여주기) at(작업 시간 정하기) atd(계획성 있는 작업 실행하기) awk(특정 패턴 문자 처리하기) a2p(펄 파일로 바꾸기) badblocks(배드 블럭 검사하기) bc(계산기) biff(메일 수신 소리로 확인하기) bg(후면작업; 배경화면 설정) bind(키나 함수 순서 결합하기) break(루프 빠져나가기) cal(달력보기) builtin(내부 명령어 알아보기) case(조건 처리하기) cat(화면상에서 파일 보기) cd(디렉토리 변경하기) cfdisk(디스크 설정하기) chattr(파일 속성 변경하기) chfn(사용자 정보 변경하기) chgrp(파일, 디렉토리가 속했던 그룹 바꾸기) chmod(파일 권한 바꾸기) chown(파일 주인 바꾸기) chsh(지정된 셸 바꾸기) cksum(CRC값을 점검한다) clear(화면 청소하기) clock(CMOS 시각을 조정하기) cmp(파일 비교하기) colcrt(문자 변환 필터) colrm(열 삭제하기) column(가로 정렬하기) comm(파일 비교 출력하기) command(명령어 알아보기) continue(루프 계속돌기) cp(파일 복사하기) cpio(복사본 만들기) crontab(cron을 관리한다) csplit(파일에 서식, 규칙 정하기) cut(필요한 필드만 출력하기) date(날짜 보기) dd(블럭장치 읽고 쓰기) debugfs(ext2 파일 시스템 디버깅하기) declare(변수 선언하기) df(파일 시스템의 사용량 보기) dirs(디렉토리 목록 표시하기) dmesg(부팅 메시지 보기) dnsdomainname(DNS 이름 출력) domainname(NIS 이름 출력&설정) du(디렉토리와 파일의 용량 파악하기) dumpe2fs(파일 시스템 정보 보기) echo(표준 출력하기) eject(장치 해제하기) elm(메일 관련) enable(내부 명령어 지정) env(환경변수 출력하기) eval(인수 읽기) exec(셸 명령어 실행하기) exit(종료하기) expand(탭을 공백으로 변환하기) export(변수 지정하기) e2fsck(파일 시스템 복구하기) fc(지정된 편집기 받기) fdformat(플로피 디스크 포맷하기) fdisk(파티션 나누기) fg(지정된 작업을 전면 프로세스로 시작하기) file(파일 종류 보기) find(파일 찾기) finger(사용자 정보 알기) fold(정형화하기) fmt(정형화하기) for(반복 실행하기) free(메모리 사용량 알아보기) fsck(파일 시스템 검사하기) fstab(파일 시스템에 대한 고정적인 정보 저장하기) ftp(파일 전송 프로그램) fuser(프로세스 ID 출력) getkeycodes(매핑 테이블 출력하기) grep(특정 문자(열) 검색하기) gzexe(실행 파일 압축하기) gzip(압축하기) halt(시스템 종료하기) hash(기억해 두기; index 역할) head(파일의 앞부분 출력하기) help(도움말 보여주기) host(호스트 정보 보기) history(사용 명령어 목록보기) hostname(서버 이름 알기) id(계정 정보 알기) if(조건문 실행하기) ifconfig(랜카드에 주소 할당하기) imolamod(모듈 설치하기) inetd(인터넷 서비스의 최상위 데몬) init(실행 단계 정하기) ispell(철자법 검사하기) jobs(수행중인 프로세스 알기) kbd_mode(키보드 모드 출력하기) kill(프로세스 죽이기) klogd(커널 로그 데몬) ldd(공유 라이브러리의 의존성 알기) less(페이지 단위로 출력하기) let(정규식 표현하기) lilo(부팅하기) ln(링크하기) locate(패턴에 맞는 파일 찾기) login(로그인하기) logger(시스템 로그 기록하기) logname(사용자 로그인명 보여주기) logout(로그인 셸 종료하기) look(특정 단어 검색하기) losetup(중복 장치 확인하기) lpd(프린트 데몬) lpq(현재 프린트 작업 상태 출력하기) lpr(출력하기) lprm(대기열에 있는 문서 삭제하기) ls(디렉토리 내용보기) lsattr(파일 시스템의 속성 보여주기) lsdev(하드웨어 장치 출력하기) lsmod(모듈 정보 출력하기) mail(메일 관련) make(컴파일하기) man(매뉴얼 보기) mattrib mbadblocks mcd mcopy mdel mdeltree mdir mesg(메시지를 받을 수 있는지 확인하기) mformat minfo mkdir (디렉토리 만들기) mke2fs(파일 시스템 생성하기) mkfs(파일 시스템 만들기) mknod(특수 파일 만들기) mkswap(스왑 영역 지정하기) mlabel mmd mmount mmove mpartition mount(장치 연결하기) more(화면 단위로 출력하기) mrd mren mtoolstest mtype mutt(메일 관련) mv(파일 옮기기) mzip netstat(현재 네트웍 상황 보기) nice(프로세스 우선 순위 변경하기) od(8진수로 파일 보기) passwd(암호 입력하기) pidof(실행중인 프로그램의 프로세스 ID 찾기) pine(메일 관련) ping(네트웍 확인하기) popd(pushd 취소) ps(프로세스 상태 알기) pstree(프로세스 상관관계 알기) pwd(절대경로 보여주기) quota(디스크 한계량 알기) rarp(rarp 테이블 관리하기) rcp(원격 호스트에 파일 복사하기) rdev(루트, 스왑장치, 램 크기, 비디오 모드를 조사하고 설정하기) rdate(네트웍으로 시간 설정하기) reboot(재부팅하기) rmmod(모듈 지우기) readonly(읽기 전용으로 표시하기) renice(프로세스 우선 순위 바꾸기) reset(터미널 초기화하기) restore(다시 저장하기) rlogin(바로 접속하기) rm(파일 지우기) rmdir (디렉토리 지우기) route(라우팅 테이블 추가/삭제하기) rpm(프로그램 추가/삭제) rpm2cpio(rpm을 cpio로 변환하기) rsh(원격으로 명령어 실행하기) rup(호스트 상태 출력하기) rusers(호스트에 로그인한 사용자 출력하기) rwall(호스트 사용자에게 메시지 뿌리기) script(기록하기) set(변수값 설정하기) setup(시스템 관련 설정하기) showmount(호스트의 마운트 정보 보여주기) shutdown(전원 끄기) sleep(잠시 쉬기) source(스크립트 번역하기) split(파일 나누기) ssh(암호화된 원격 로그인하기) stty(터미널라인 설정 보여주기) su(계정 바꾸기) suspend(셸 중단하기) swapoff (스왑 해제하기) swapon(스왑 활성화하기) sync(버퍼 재설정하기) syslogd(로그인 과정 설정하기) tac(거꾸로 보기) tail(문서 끝부분 출력하기) talk(이야기하기) tar(파일 묶기) tcpdchk(tcp wrapper 설정하기) tcpmatch(네트웍 요청에 대해 예측하기) tee(표준 입력으로부터 표준 출력 만들기) telnet(원격접속하기) test(테스트하기) times(셸에서의 사용자와 시스템 시간 출력하기) top(cpu 프로세스 상황 보여주기) tr(문자열 바꿔주기) true(종료 코드 리턴하기) type(유형 보기) ul(밑줄 처리해서 보여주기) ulimit(제한하기) umask(매스크 모드 설정하기) umount(장치 해제하기) unalias(별명 제거하기) uname(시스템 정보 보기) unexpand(공백 문자를 탭으로 변환하기) uniq(중복된 문장 찾기) useradd(사용자 계정 만들기) userdel(계정 삭제하기) usermod(사용자 계정정보 수정하기) unset(설정 변수 해제) uptime(시스템 부하 평균 보여주기) users(로그인된 사용자 보여주기) w(시스템에 접속한 사용자 상황 알아보기) wait(프로세스 기다리기) wall(모든 사용자에게 메시지 보내기) wc(문자, 단어, 라인수 세기) whatis(명령어의 간단한 설명보기) while(루프 명령어) who(사용자 알기) write(콘솔 상에서 간단한 메시지 보내기) xcopy(반복적으로 복사하기) XFree86 ypchfn(NIS에서 사용하는 chfn 명령어) ypchsh(NIS에서 사용하는 chsh 명령어) yppasswd(NIS에서 사용하는 passwd 명령어) zcat(압축 파일 보기) zcmp(압축 파일 비교하기) zforce(강제로 gz 만들기) zgrep(압축 상태에서 grep 실행하기) zmore(압축 상태에서 more 실행하기) znew(.Z 파일을 .gz로 다시 압축하기) 

0.0.0.30 각자가 사용하는 컴퓨터의 정보를 알고 싶을때

  [root ...]#more /proc/cpuinfo  

위와 같이 치면 사용자의 컴퓨터 정보를 볼수 있으며,

    [root ...]#more /proc/meminfo  

라고 치면 사용자의 메모리 정보를 볼수 있습니다.

0.0.0.31 전체 메일

먼저 보낼 내용을 텍스트로 파일로 만들어야 합니다.어디에서든지 가능하지요! [root@aromi /root]# vi nea 안녕하세요! 저희 서버에서는 웹서버를 오늘부터 시작합니다. 사용자 여러분의 많은 관심과 이용을 부탁드립니다.

:wq [root@aromi /root]#

만약, 한글을 사용하지 못하면 윈도우95에서 먼저 쓴다음에 ftp를 이용해서 올리면 됩니다. [root@aromi /root]# mail -s "[공지]" `cat /etc/passwd|gawk ?F :'{print$1}'`

[공지]-> 라고 쓴 것은 보낼 메일의 제목입니다. 'cat /etc/passwd|gawk -F : '{print$1}'' ->먼저 cat으로 passwd파일의 첫번째 나오는 내용을 출력하라는 소리입니다. nea라는 텍스트파일을 메일의 내용으로 보내라는 내용입니다.

0.0.0.32 디렉토리만 빠르게 검색

  ls -al | grep "^d"  

0.0.0.33 호스트 네임 바꾸기

/etc/HOSTNAME file은 부팅시 /etc/sysconfig/network file 의 HOSTNAME 부분을 참조하여 저장합니다. 호스트 네임을 바꾸고자 한다면 /etc/sysconfig/network file 의 HOSTNAME 부분을 바꿔주면 됩니다.

[root@linux /root]# vi /etc/sysconfig/network NETWORKING=yes HOSTNAME="linux" GATEWAY="" GATEWAYDEV="" FORWARD_IPV4="yes" 

바꾸신후 시스템을 재부팅 하신거나, #/etc/rc.d/init.d/network restart 명령을 내리시면 됩니다.

0.0.0.34 틀린명령어 틀린글자만 바꿔서 실행

# ./configure --prefax=/usr/local/apache 앗, 틀렸습니다. prefax가 아니라 prefix인데... 고쳐야지요...간단하게 화살표키로 왔다갔다 하면서 지워지고 바꿔주면 되겠지만 다른 방법이 있습니다. # ^fax^fix^ 라고 하면... -> ./configure --prefix=/usr/local/apache 라고 됩니다..

0.0.0.35 유닉스의 현재 버젼과 종류 그리고 라이센스등을 알려주는 명령어

  [root@aromi /root]# uname -a  

0.0.0.36 열려있는 포트 알아내기

  netstat -anp | grep LISTEN  

0.0.0.37 텔넷 모든 접속자에게 메세지 보내기

wall 내용...  Ctrl-D  

0.0.0.38 lsof는 열려있는 파일을 나타내 주는 옵션

여기에 보안 점검을 위하여, -i 옵션을 사용하면, 현재 열려 있는 포트와 링크되어 있는 서비스 또는 프로그램이 모두 나타나죠. 자신이 열어 놓지 않은 포트가 열려있다던지하면 한번쯤 의심해 봐도 되겠죠?

0.0.0.39 사용자가 어디에서 무엇을 하는지 알아내기

w라는 명령어를 사용하시면 된답니다. 이 때, w [-s] 를 붙여주시면 -s 옵션이 긴 정보 대신에 필요한 짧은 정보만 알려 준답니다.

0.0.0.40 텔넷 화면 수정

로그인화면: /etc/issue.net 로그인후화면: /etc/motd

0.0.0.41 하위 디렉토리 한꺼번에 만들기

  mkdir -p music/koreanmusic/ost  

0.0.0.42 특정디렉토리의 모든 파일 안의 특정 문자열 치환

for i in $*; do      sed "s/\/opt\/arm/\/opt\/arm-linux/g" < $i > $i.new      mv -f $i.new $i done 
  (chihwan.sh를 포함하지 않는 디렉토리면)find ./ -type f -exec 'chihwan.sh' {} \; s

0.0.0.43 killall 명령 시뮬레이션 (프로세스명으로 죽이기)

ps aux | grep 프로세스명 | grep -v grep | awk '{ print $w }' | xargs kill -9 모든 프로세스 나열 지정한 프로세스만 뽑아냄 grep 명령이 포함된 라인 제거 awk로 두번째 필드만 뽑아냄 xargs에 의해 걸러진 아이디로 죽임

0.0.0.44 find와 grep

find . -name "H20021115.*" -exec grep -l '...;........;110100' {} ;

0.0.0.45 vi 검색, 치환

구호스트 서비스 오늘 날짜에서 분류코드가 110100인 파일 찾기 :%s/./U&/g 모든문자->대문자 g/^$/d

0.0.0.46 파일내의 중복되는 행을 제거 : uniq

입력 파일에서 연속되는 행을 비교하여, 두 번째 이상의 동일한 행들을 제거하고 나머지는 출력파일로 출력 연속되어 표시되지 않으면 동일한 행이 존재할 수 있음. sort 명령을 사용하여 정렬한 후 사용하는 것이 타당 사용법uniq [-cdu] [+|숫자] [입력파일 [출력파일]] -c : 각 행이 연속적으로 나타난 횟수를 행의 시작부분에 표시 -d : 연속적으로 반복되는 행만 출력 -u : 연속적으로 반복되지 않는 행만 출력 +숫자 : 행의 처음 '숫자' 만큼의 문자는 무시 -숫자 : 행의 처음 '숫자' 만큼의 필드는 무시

0.0.0.47 파일의 결합

여러 개의 텍스트 파일을 하나의 파일로 순차적으로 묶는데 사용 cat [파일명1] [파일명2] ... > [출력파일명] cat [파일명1] [파일명2] ... >& [출력파일명] cat [파일명1] [파일명2] ... >> [출력파일명] cat [파일명1] [파일명2] ... >>& [출력파일명] cat - [파일명1], [파일명2] .. >> [출력파일명] cat - [파일명1], [파일명2] .. >>& [출력파일명]

% cat > file1 파일명 : file1 ^D % cat > file2 파일명 : file2 ^D % cat file1 file2 > file3 % cat file3 파일명 : file1 파일명 : file2 %

행단위 결합 : paste 여러 파일에 대해여 행간 결합을 수행하거나 하나의 파일에 대해 연속되는 행들을 결합 둘이상의 파일에 대해서 테이블상의 하나의 열과 같이 취급하여 동일한 행번호 끼리 결합

paste [파일명1] [파일명2].. paste -d리스트 [파일명1] [파일명2] ... paste -s [-d리스트] [파일명] d : 행간 결합시 행간 구분문자들의 리스트 s : 한파일의 연속되는 행을 결합

% cat > paste.data1 홍길동 이순신 김유신 % cat > paste.data2 부산 서울 대구 % paste paste.data1 paste.data2 홍길동 부산 이순신 서울 김유신 대구 % paste -d"n" paste.data1 paste.data2 홍길동 부산 이순신 서울 김유신 대구 % paste -s -d"::n" paste.data1 홍길동:이순신:김유신 %

두 파일을 동일한 필드 값에 따라 행 단위 결합 : join

관계형 데이터 베이스에서의 join 연산과 동일 키로 사용할 필드에 대해 정렬된 두 파일의 각 행에 대해 동일한 키 값을 갖는 행들을 결합 입력으로 사용될 두 파일은 키 값에 대해 오름 차순으로 정렬되어 있어야 함 출력 결과는 기본적으로 키 값이 먼저 표시되고, 첫번째 파일에서 키를 제외한 나머지 필드, 두번테 파일에서 키를 제외한 나머지 필드가 표시 필드 구분은 공백, 탭, 개행문자가 기본, 연속적으로 나타날 경우 하나로 취급

% cat > join.data1 98001:서원일: 98002:홍길동: 98003:김유신: 98004:이순신: 98010:이상관: % cat > join.data2 부산:98001:441 울산:98002:89 대구:98003:99 서울:98004:120 김해:98010:44 % join -j1 1 -j2 2 -t: join.data1 join.data2 98001:서원일::부산:441 98002:홍길동::울산:89 98003:김유신::대구:99 98004:이순신::서울:120 98010:이상관::김해:44 % join -j1 1 -j2 2 -o 1.2 1.1 2.1 -t: join.data1 join.data2 서원일:98001:부산 홍길동:98002:울산 김유신:98003:대구 이순신:98004:서울 이상관:98010:김해 %  

0.0.0.48 파일의 암호화 : crypt

파일을 암호화 하여 키를 알지 못하는 사람은 내용을 볼 수 없도록 함 표준 입출력 사용

% cat > crypt.data test test 안녕하십니까? ^D % crypt  crypt.data1 Enter key: hello % ls -l crypt* -rw-r--r-- 1 wiseo pro 24 9월 24일 14:47 crypt.data -rw-r--r-- 1 wiseo pro 24 9월 24일 14:48 crypt.data1 % crypt < crypt.data1 Enter key:hello test test 안녕하십니까? % 

0.0.0.49 개행을 제외한 화면내의 보이지 않는 문자 출력

cat -v http://comp-cse.sch.ac.kr/~pl/lecture/linux/file2.html 

0.0.0.50 화일내의 포함된 특정문자열로 찾아서 내용만 출력하기

grep -h '20030305......01' ./R00* 

0.0.0.51 특정 파일의 화일명을 비슷하게 여러개 한꺼번에 바꾸기

ls *.* | awk '{print "mv",$1, $1 }' | \sed "s/ ([a-zA-Z0-9]*).([a-zA-Z0-9]*)$/1._2/g" 

현재디렉토리의 모든 *.* 파일을 *._* 형식으로 바꾼다. 더 간단하게

ls *.* | sed "s/([a-zA-Z0-9]*).([a-zA-Z0-9]*)/mv 1.2 1._2/g" 

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

0.0.0.52 어제 날짜 구하기

$ date -v-1d "+%Y-%m-%d"  [컴퓨터분류] 

0.0.0.53 원하지 않는 사용자 죽이기

[root@dream /root]# skill -KILL sunny  

위의 명령을 내리면 sunny 라는 사용자를 완전히 추방시킬수 있습니다. 그런데 이렇게 완전히 추방시키는게 아니구, 특정 터미널에 접속해있는 사용자만 추방시켜야 할 때도 있겠죠? 그럴때는

[root@dream /root]# skill -KILL -v pts/14  

이런식으로 하면 된다 그럼 pts/14 에 연결되어 있는 사용자가 죽게 됩니다.

0.0.0.54 UNIX상에서 한글출력이 깨져 나올경우

유닉스상에서 한글을 stdout출력할 경우 가끔 출력되는 문자들이 몽땅 깨져서 나오는 경우가 있다. 이때부터는 프로그램이 종료된 이후에도 쉘 프람프트를 비롯, 쉘에서 입력하는 모든 커맨드가 깨져서 나온다. 이는 ascii code 로 ^n 에 해당하는 문자가 출력될 때 나오는 현상으로 그 이후로는 MSB가 모두 켜지기 때문이다. 문자가 깨져나오는 이후부터 ascii code 로 ^o 에 해당하는 문자를 출력하면 반대로 된다. 쉘 커맨드 상에서라면, # echo ^v^o 라고 해야겠지만 커맨드가 깨져나오므로 shell이 해석을 못한다. 따라서, command line에서 ^v^o를 치고 enter 하면 된다

0.0.0.55 현재 디렉토리의 대량의 파일을 각자의 파일명가운데에 특정문자

추가하여 바꾸기
/bin/ls A?????.html | \sed 's/A(.....).html/1/g' | \xargs -t -i mv 'A{}.html' 'A0{}.html' 

/bin/ls는 ls가 보통 -F로 파일 종류 표시(*, @등)까지 하기 때문에 그걸 막기 위한 것이고 xargs의 -t는 트레이스모드이다.

Comment +0

<Procmail Sendmail을 이용한 Outgoing 메일 필터링>

1) 개요

대부분의 리눅스 서버들이 스패머들의 공격으로 인하여 대량의 스팸메일 발송이 이루어 지고 있습니다. 이와 같은 경우 해당 서버의 아이피 블록 및 시스템 장애, 과부하 등이 일어나며 이에 대한 대처방안으로 Procmail을 이용한 필터링을 사용 할 수 있습니다.

Procmail은 리눅스설치시 기본적으로 설치되는 프로그램이며 혹시라도 설치가 되어 있지 않다면 패키지를 다운받아 설치가 가능 합니다.

또한 Sendmail과의 호환성이 매우 뛰어나며, 시스템 자원사용이 매우 적어 시스템에 부하를 일으키지도 않습니다.

Sendmail에서 발송시 sendmail.cf Ruleset에 의하여 해당 메일의 방향을 외부가 아닌 내부로 변경하게 됩니다. 내부로 돌아온 메일은 procmail에 의해 outgoing.rc와 같은 정규표현식 필터링을 거치게 되며, 모든 필터링이 완료되면 formail에 의하여 다시 Sendmail에게 전달되며, 해당 메일을 다시 전달 받은 Sendmail은 이제서야 정상적으로 메일발송을 하게 됩니다.

2) Sendmail.cf의 수정

Sendmail.cf의 수정은 아래 2가지 항목만 수정하시면 됩니다.

$ vi /etc/mail/sendmail.cf

- 아래 주석으로 검색하시면 구문이 있습니다.

(Before - 1)

# deal with other remote names

R$* < @$* > $*         $#esmtp $@ $2 $: $1 < @ $2 > $3 user@host.domain

(After - 1)

# deal with other remote names

#R$* < @$* > $*         $#esmtp $@ $2 $: $1 < @ $2 > $3 user@host.domain

R$*<@$*.procmail>$*     $#esmtp $@$2 $:$1<@$2>$3

R$*<@$*>$*           $#procmail $@/etc/outgoing.rc $:$1<@$2procmail.>$3

(Before -2)

#

#  envelope recipient rewriting --

#  also header recipient if not masquerading recipients

#

R$+                    $: $>PseudoToReal $1            sender/recipient common

R$+                    $: $>MasqSMTP $1                qualify unqual'ed names

R$* < @ *LOCAL* > $*    $: $1 < @ $j . > $2

(After 2)

#

#  envelope recipient rewriting --

#  also header recipient if not masquerading recipients

#

SEnvToSMTP

R$* < @$*.procmail > $* $: $1 < @ $2 > $3

R$+                     $: $>51 $1

R$+                     $: $>61 $1

R$+                    $: $>PseudoToReal $1            sender/recipient common

R$+                    $: $>MasqSMTP $1                qualify unqual'ed names

R$* < @ *LOCAL* > $*    $: $1 < @ $j . > $2

위와 같이 수정하시면 되며 탭구분을 주의하시기 바랍니다.

밑줄이 그어진 부분은 탭으로 구분하셔야 하는 부분입니다.

셋팅이 완료 된 후 outgoing.rx 파일을 생성하여야 하며, outgoing.rc는 제가 수정하여 놓은 파일을 이용하시면 됩니다.

Outgoing.rc /etc/ 폴더로 옮겨놓으신후 sendmail을 재시작 하면 셋팅은 완료가 되었습니다.

3) 테스트

#sendmail -d12.21 bt

ADDRESS TEST MODE (ruleset 3 NOT automatically invoked)

Enter <ruleset> <address>

> /parse mrmsm@sds.co.kr

Cracked address = $g

Parsing envelope recipient address

canonify           input: mrmsm @ sds . co . kr

Canonify2          input: mrmsm < @ sds . co . kr >

-- 중략 --

final              input: mrmsm < @ sds . co . kr . procmail . >

final            returns: mrmsm @ sds . co . kr . procmail

mailer procmail, host /etc/outgoing.rc, user mrmsm@sds.co.kr.procmail

> /parse mrmsm@sds.co.kr.procmail

Cracked address = $g

Parsing envelope recipient address

canonify           input: mrmsm @ sds . co . kr . procmail

Canonify2          input: mrmsm < @ sds . co . kr . procmail >

Canonify2        returns: mrmsm < @ sds . co . kr . procmail >

-- 중략 --

final              input: mrmsm < @ sds . co . kr >

final            returns: mrmsm @ sds . co . kr

mailer esmtp, host sds.co.kr, user mrmsm@sds.co.kr

위와 같이 이메일 주소 뒤에 .procmail이 붙으면 정상적으로 처리가 되는 것입니다. 그에 대한 역 또한 정상적으로 되고 있습니다.

만약 결과가 틀릴경우 sendmail.cf 파일의 셋팅이 잘못 된것이므로 다시한번 체크하여 보시기 바랍니다.

- -

Comment +0

기존 MySQL 환경에서는 Database측 CHARSET 이 latin1 이나 euckr을 많이사용했을 겁니다.

Legacy DB쪽은 아무 생각없이 CREATE DATABASE ... ; 해버렸었던 경우가
많아서 latin1 으로 되어 있는 database가 저또한 엄청나게 많았습니다.

그런데, 이럴 경우 utf8을 제대로 쓸 수 없다거나, command line utility에서
꼭 문제가 발생하여서 utf8로 전환을 시도했습니다.

문제는 latin1 db에 client 는 utf8을 사용하고 있던 경우,
db에는 utf8로 들어가나, 정상적인 utf8이 아님으로써,
mysql 이나 query browser등에서 쿼리를 할 수 없었습니다.

한번은 잘못해서 database하나를 몽땅 못쓰게 만들어 버린 적도 있었죠.

이곳 게시판을 잘 읽어 본 결과 아래와 같이 하여 성공적으로 conversion을 하였습니다.

**. 준비물
vim 혹은 editplus 등 utf-8을 지원하거나, 변환가능한 editor
test한 MySQL 버젼 아무거나(기존), MySQL 4.1.12 , 5.0.16 (utf-8사용할 것)

A. DB는 latin1으로 만들어져 있고, client는 utf8을 사용하였던 경우

(1). 가장 먼저 mysql로 접속 한 후 use {database}, show variables like 'c%'; 로 확인을 합니다.
아마도 대부분 Database와 character_set_connection 이 latin1으로 되어 있을 겁니다.

(2). 기존 DB를 Dump받습니다.
mysqldump -u{username} -p{password} {dbname} --default-character-set latin1 > {dump}.sql
이때 Dump 받는 SQL은 database의 chracter set이 아니라, client가 실제로 사용한
character set. 즉 이경우에는 utf8로 저장되어 있게 됩니다.

(3). {dump}.sql 을 편집합니다.

3-1. SET NAMES latin1; 으로 되어 있는 놈을 SET NAMES utf8; 로 변경합니다.

3-2. CREATE DATABASE ..... DEFAULT CHARSET=latin1; 으로 되어 있는 놈을
CREATE DATABASE ..... DEFAULT CHARSET=utf8; 로 변경합니다.
vim 사용자라면, command line에서 1,$s/CHARSET=latin1/CHARSET=utf8/g 하면 바꿀 수 있습니다.
이렇게 하므로써, 다시 생성될 TABLE의 CHARSET도 utf8로 맞출 수 있게 됩니다.

(4). MySQL로 로그인 하여 새로 부어줄 DATABASE를 생성합니다.
CREATE DATABASE {utf8-dbname} DEFAULT CHARACTER SET utf8;

(5). dump 한 data를 부어넣습니다.
mysql -u{username} -p{password} {utf8-dbname} < {dump}.sql

B. DB는 latin1으로 만들어져 있고, client는 euckr을 사용하였던 경우
제로보드가 대표적인데, 다음과 같이 합니다.

(1). 가장 먼저 mysql로 접속 한 후 use {database}, show variables like 'c%'; 로 확인을 합니다.
아마도 대부분 Database와 character_set_connection 이 latin1으로되어 있을 겁니다.

(2). 기존 DB를 Dump받습니다.
mysqldump -u{username} -p{password} {dbname} --default-character-set latin1 > {dump}.sql
이때 Dump 받는 SQL은 database의 chracter set이 아니라, client가 실제로 사용한
character set. 즉 이경우에는 euckr로 저장되어 있게 됩니다.

(3). {dump}.sql 을 편집합니다.

3-1. SET NAMES latin1; 으로 되어 있는 놈을 SET NAMES euckr; 로 변경합니다.

3-2. CREATE DATABASE ..... DEFAULT CHARSET=latin1; 으로 되어 있는 놈을
CREATE DATABASE ..... DEFAULT CHARSET=utf8; 로 변경합니다.

vim 사용자라면, command line에서 1,$s/CHARSET=latin1/CHARSET=utf8/g
하면 바꿀 수 있습니다.
이렇게 하므로써, 다시 생성될 TABLE의 CHARSET도 utf8로 맞출 수 있게 됩니다.

(4). MySQL로 로그인 하여 새로 부어줄 DATABASE를 생성합니다.
CREATE DATABASE {utf8-dbname} DEFAULT CHARACTER SET utf8;

(5). dump 한 data를 부어넣습니다.
mysql -u{username} -p{password} {utf8-dbname} < {dump}.sql

C. 모두 끝난 다음에 절차...
이 게시판에 많이 나와 있는 방법대로 했습니다. 더 좋은방법도 있을 겁니다.
/{mysqld-my.cnf path}/my.cnf

[client]
default-character-set=utf8

[mysqld]
init_connect=SET collation_connection=utf8_general_ci
init_connect=SET NAMES utf8
default-character-set=utf8
character-set-server=utf8
collation-server=utf8_general_ci

로 바꾸어 줍니다.
/{init script path}/{init script} restart
아마 리눅스 사용자면 /etc/init.d/mysqld restart 일 것이고,
저처럼 NetBSD 사용자이면 /etc/rc.d/mysql restart 일겁니다.

D. client application의 접속단 변경...
Legacy 프로그램때문에 문제가 되는 게 많은데,
제로 보드의 경우 다음과 같이 바꾸어 줍니다.

{Zeroboard installed path}/lib.php 를 열고,
function dbconn() 을 찾습니다.
@mysql_select_db($f[4], $connect) or Error("DB Select 에러가 발생했습니다","");
이라고 되어 있는 부분 (즉, return $connect; 문 바로 앞)에다가 다음과 같이 넣습니다.
@mysql_query("set names euckr;",$connect);

모두 해피하게 사용하실 수 있을 겁니다.

가장 중요한 것은 show variables like 'c%' ; 해서
character_set_client 와 character_set_connection 과 character_set_database의
속성을 잘 파악하여야 한다는 것입니다.

아무쪼록 소중한 DATA 깨먹는 일 없도록 하시기 바라면서 이만 줄이겠습니다.

저의 시행착오가 다른 분들에게 조금이나마 도움이 되길 바랍니다.

이 문서는 여러분 모두의 경험을 바탕으로 정리한 것이기 때문에
써보시고 유익하시다면 많은 분들이 도움을 얻을 수 있게 해주세요.


출처 : datbase.sarang.net
작성자 : 박인서(bubux)
작성일 : 2006-01-11 20:15:40
Title : Utf8 환경으로 자료 conversion 성공기
Sub Title : MySQL환경을 UTF-8로 전환하기

제 개인 적으로 테스트 한 결과 위와 같은 방법으로 하는 것도 좋습니다. 다만 데이터를 Dump할때는 해당 Client와 DB의 Character-set에 주의해야 합니다.

저희 DB를 할때는 Characterset을 따로 지정하지 않고 덤프 뜬후 Vi를 통해 Characterset을 UTF-8로 변경하고 그 데이터를 그대로 DB에 넣은 후 제로보드 소스(lib.php)에서 수정하여 표기 하였습니다.

뭐... Iconv를 이용해서 컨버팅 하는 방법도 테스트를 해봐야 겠지만 급한 경우 이렇게 처리 하는것도 하나의 방법이겠네요 ^^

Comment +0

아파치에서 포워딩 셋팅하기 방법을 찾으려고 mod_rewrite를 먼저 생각햇으나, 더 간편한 방법이 있었다. mod_alias -_-;

방법은 다음과 같다.

RedirectMatch (.*)$ http://www.abcd.com$1

abcd에 포워딩 하고자 하는 도메인을 넣으면 됀다.

Comment +0

리눅스 시스템 시간동기화 하기 ( rdate, ntp )



1. rdate
를 이용한 동기화

- 레드햇계열 및 여타 배포판에서도 별도의 설치과정필요없이 사용할수있다.

  쉘스크립파일을 하나 작성한다.

  ex) time-sync.cron ---------------------------

  #!/bin/bash

  /usr/bin/rdate -s time.bora.net && /sbin/clock -w

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

  저장후 실행권한 부여

  #chmod 755 time-sync.cron

  작성한 파일을  /etc/cron.daily 로 복사 ( 일일 새벽 4에 동기화 스크립트를 수행함 )


2. ntp
를 이용한 동기화

  - rdate 를 이용한 방법보다 소수점 몇몇점이하까지 상세히 동기화해준다고해서 애용중;

  #rpm -qa | grep ntp 명령으로 "ntp-버젼" 이 출력되지않으면

  http://rpmfind.net 에서 "ntp" 로 검색해서 배포판에 해당하는 패키지를 설치한다


 
1).
용어 설명

  a. Reference Clock

  UTC(Universal Time Coordinated)처럼 NTP가 참고하는 신뢰할 만 한 시간, 즉 절대시간이다.

     UTC는 원자시계로 부터 측정한 공식적인 표준 시간을 말한다.


 
b. Stratum

     타임 서버는 계층적 구조로 되어있고  각각의 레벨에 번호를 붙인다.

     Stratum-0은 시간을 생성하는 Reference Clock이고

     Stratum-1은 원자시계 같은 생성 장치에 직접 연결된 최상의 계층의 타임 서버이다.


 
c. /var/ntp/ntp.drift

     지역 시스템의 시간을 더욱 정확하게 유지하는 파일로,

     시간 오차의 평균값을 저장하고 있다.


 
d. /etc/init.d/ntpd

     데몬 프로세스


 
2).
동작 원리

a. 시스템이 부팅할때 /etc/ntp.conf 파일이 있으면 ntpd 데몬이 구동된다.


   
b. /etc/ntp.conf
파일의 설정을 따라서 서버 또는 클라이언트 모드로 작동된다.


   
c. NTP
서버는 매분마다 NTP 서버임을 다른 시스템에 알린다.


 
3)
서버 구성시

  a. 외부 타임 서버를 통해 시간을 받아오는 방법

     NTP 서버가 시간을 얻어올 외부 서버를 지정한다.

  여러 서버 지정이 가능하며 데이터의 prefer가 명시된 서버

     /etc/ntp.conf의 내용을 수정한다.

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

      server xxx.xxx.xxx prefer ==> 추가

      server xxx.xxx.xxx        ==> 추가

      server xxx.xxx.xxx        ==> 추가

      #fudge 127.127.XType.0 stratum 0 ==> 주석처리

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

      ntpd 구동한다.

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

      # /etc/init.d/ntpd start

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


 
b.
서버 시스템의 자체 시간을 이용하는 방법 (비추)

      타임 서버 스스로 Stratum-1 로 동작한다.

      /etc/inet/ntp.conf의 내용을 수정한다.

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

      server 127.127.1.0 ==> 추가

      #fudge 127.127.XType.0 stratum 0 ==> 주석처리

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

      ntpd 구동한다.

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

      # /etc/init.d/ntpd start

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



4)
클라이언트 구성시

  #ntpdate -b -s 서버아이피 또는 호스트네임

  // -s : 결과를 화면이 아닌 syslog 로 보냄

  * 다음과 같은 오류가 발생한 경우

 [root@truefeel root]# ntpdate -b time.kriss.re.kr

 17 Mar 21:03:25 ntpdate[8244]: no server suitable for synchronization found

 

 -> NTP 프로토콜은 UDP port 123 을 사용하는데, 이 포트가 방화벽 등으로

    막혀있는 경우에는

    #ntpdate -u time.kriss.re.kr

    처럼 -u 를 옵션을 사용해서 다른 포트 사용하거나

      IPTABLE 을 사용중이면 OUTBOUND UDP 123 포트를 열어준다



 
- cron.daily
에 등록 ( 쉘스크립트 파일 작성 )

     ex) time-sync.ntp ---------------------------

     #!/bin/bash

  /usr/sbin/ntpdate -b -s time.kriss.re.kr && /sbin/clock -w

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

     저장후 실행권한 부여

     #chmod 755 time-sync.ntp


 
작성한 파일을  /etc/cron.daily 로 복사 (매일 새벽 1 5분 동기화)

Comment +0

Postgres SQL 직접 쓰는일이 없어 설치한적이 없었으나,
우연찮게 설치하게 될 일이 생겨 설치해 보았다.

특별한 사항은 없으며, 간단한 Quick Guide 만 올린다.

./configure --prefix=/usr/local/pgsql --with-md=EUC_KR
gmake
su
gmake install
adduser postgres
mkdir /usr/local/pgsql/data
chown postgres /usr/local/pgsql/data
su - postgres
/usr/local/pgsql/bin/initdb -D /usr/local/pgsql/data
/usr/local/pgsql/bin/postmaster -D /usr/local/pgsql/data >logfile 2>&1 &
/usr/local/pgsql/bin/createdb test
/usr/local/pgsql/bin/psql test

Postmaster 데몬 띄울때 에러날 경우 Logfile을 먼저 보라.
Logfile에
FATAL:  XX000: failed to initialize lc_messages to ""
와 같은 에러가 나면 자신의 profile을 확인하여
export Lang을 재설정 하면 된다.

PostgresSQL의 버그인데 그에 대한 참고로 내용을 올린다.



The following bug has been logged online:

Bug reference:      1716
Logged by:          steve owen
Email address:      steve ( at ) keymarksystems ( dot ) com
PostgreSQL version: 7.4.8
Operating system:   RHEL4
Description:        FATAL:  XX000: failed to initialize lc_messages to ""
Details:

I found this referenced under bug #1344: locale problem

The problem appears to be in going from Linux 2.6.9-5.0.5 to 2.6.9-11 the
default LANG environment variable changed
from LANG=en_US.UTF-8 to LANG=english_us.8859.  Error could be identified by
typing locale at the opsys prompt.
I fixed by adding to posgres .bash_profile:
  LANG=en_US.UTF-8; export LANG

hopes this helps someone else

Comment +0

Centos 4.2 개발자용 패키지 리스트다 -_-

젠장.. 이거하나 만들려고 Centos 이미지에서 Header를 조낸 뒤졌다 -_-

왠 삽질. 그래도 리스트 건졌으니 다행 ㅜ_ㅜ



Centos 4.2 개발자 패키지 리스트

Comment +0