'linux/Tip'에 해당되는 글 34건

  1. 2007.03.28 awk -추가
  2. 2007.03.16 pdf to html --linux
  3. 2007.03.16 ssh brute force 막기 (ssh dictionary attack 막기 ver.2)
  4. 2007.03.16 daemontool 로 service하기
  5. 2007.03.16 Web server 성능 개선

awk -추가

linux/Tip 2007. 3. 28. 12:26

http://blog.naver.com/brightest?Redirect=Log&logNo=150015288879

http://www.gnu.org/software/gawk/manual/gawk.html

1. 라인선택 후 필드 출력
awk '/dairy/ {print $3, $1}' foot
; 파일 food의 레코드들 중에서 문자열 dairy를 갖는 레코드 선택 후,
선택된 레코드의 3번째 필드와 1번째 필드 출력
필드와 필드사이는 공백으로 출력


2. 암호 레코드 찾은 후 패스워드
grep $USER /etc/password

; 자신의 암호 레코드를 찾는다.
awk -F: '{print $1, $3, $4}' /etc/passwd |more
awk -F: '$1 == "root" {print $1, $3}' /etc/passwd


3. 필드 구분자 사용
awk -F: '{print $2}' aaa.txt
; 필드구분자를 :으로 하고, 두번째 필드를 출력


4.변수와 문자열 구분하기

awk -v item='Grocery Item' '{print item, $1}' gdbase

; v는 변수를 정의할 것임을 알려준다.


5. 정규표현으로 레코드 선택하기

awk -F: '/^[a-m][a-z]*:/ {print $1, $7}' /etc/passwd

awk '/[Vv]eg/ {print $0}' gdbase

; 레코드 한줄을 출력


6.
who | awk ' {print $1}' | sort -u

       sort - sort lines of text files
       -d, --dictionary-order
             consider only blanks and alphanumeric characters
       -f, --ignore-case
              fold lower case to upper case characters
       -g, --general-numeric-sort
              compare according to general numerical value
       -i, --ignore-nonprinting
              consider only printable characters
       -M, --month-sort
              compare (unknown) < `JAN' < ... < `DEC'
       -n, --numeric-sort
              compare according to string numerical value
---------------------
du -a|awk '{print $2}'
who| awk '{ print $1, $5 }'
---------------------
< awk Built-in Variables >
FILENAME ;
FS  ; field separator character (default blank & tab)
NF  ; number of fields in input record
NR  ; number of input record
OFMT  ; output format for numbers (default %g; see printf(3))
OFS  ; output field separator string (default blank)
ORS  ; output record separator string (default newline)
RS  ; inupt record separator character (default newline)

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

< Shell Built-in Variables >

$# ; the number of arguments
$* ; all arguments to shell
$@ ; similar to $*
$- ; options supplied to the shell
$? ; return value of the last command executed
$$ ; process-id of the shell
$! ; process-id of the last command started with &
$HOME ; default argument for cd command
$IFS ; list of characters that separate words in arguments
$MAIL ; file that, when changed, triggers "you have mail" message
$PATH ; list of directories to search for commands
$PS1 ; prompt string, defalut '$ '
$PS2 ; prompt string for continues command line, default '> '

---------------------
chmod +x $1
chmod +x $*
--------------------

grep "$*" /usr/you/lib/phone-book

> grep dow jones
...

grep -y pattern ; case-independent.

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

2>&1;  stderr 을 stdout에 더함.
ex)

> /usr/bin/time wc ch3.1 >wc.out 2>&1
/usr/bin/time ls >test  2>&1

1>&2; stdout 을 stderr에 더함.

혹은

#!/usr/bin/sh 안에서 수행


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

#!/usr/bin/awk
#

BEGIN {
  max = 0
}
/^#define/ {
  print $0
  if( max<$3 ) max = $3
}
END {
  printf "#define %-29s %4d\n", "COMMENT",      max+1
  printf "#define %-29s %4d\n", "SPACES",       max+2
}

'linux > Tip' 카테고리의 다른 글

SELinux 관련 qna  (0) 2007.04.30
SELinux  (0) 2007.04.30
pdf to html --linux  (0) 2007.03.16
ssh brute force 막기 (ssh dictionary attack 막기 ver.2)  (0) 2007.03.16
daemontool 로 service하기  (0) 2007.03.16
Posted by efrit
,

pdf to html --linux

linux/Tip 2007. 3. 16. 14:49
http://user.oss.or.kr/swreview/view.html?num=25&page=1

수화기를 드니 저쪽에서 목소리가 들려왔다.

"롭, 좀 도와줄 수 있겠어? PDF 파일을 읽을 수가 없어."

베버리 힐에서 변호사를 하고 있는 동생이었다. 1MB PDF 파일을 웹 기반 이메일 클라이언트에서 받았는데 어떻게 다운로드를 하고 어떻게 읽어야할지를 모르겠다는 것이었다. 더욱이 그는 아크로벳 리더도 설치하지 않은 상태였다. 문서 하나 읽는 데 뭐가 이리 골치아프냐며 우리 둘은 아크로뱃에 대해 투덜거렸다. 얼마 지나지 않아 필자는 이 골치아픈 문제를 아주 속시원하게 해결하는 방법을 발견했다. 별로 알려지지 않은 프로그램 pdftohtml 덕분이었다.

pdftohtml은 일반 .pdf 파일을 .png 파일과 각각의 HTML 파일을 가리키는 인덱스들로 변환한다. 그리고 최종적으로 이 모든 것들을 하나의 편리한 메인 HTML 파일로 묶는 것이다. 그 메인 HTML 파일은 어느 브라우저에서나 볼 수 있고 각각의 페이지를 보려면 해당 링크를 클릭하면 된다.

pdftohtml을 사용하려면 우선 그 소프트웨어의 tar.gz 파일(http://sourceforge.net/projects/pdftohtml/)을 다운로드해서 설치한다(역주- 윈도우즈 바이너리도 있다). 현재 가장 최신 버전은 0.36이다. 필자는 수세 리눅스 8.2 프로페셔널 버전을 랩탑에서 사용하는데 수세 CD에서 YAST2를 사용해 pdftohtml 버전 0.35-22를 설치했다.

pdftohtml로 작업하기

pdftohtml은 명령행에서 옵션을 주어 실행시키는 방식이다. 기본 명령 방식은 다음과 같다.

rreilly> pdftohtml [pdf file name]

이렇게 명령을 주면 간단한 HTML 파일을 만든다. 해당 PDF 파일의 텍스트 내용을 읽고 복사할 수 있는 정도다. 여러분은 브라우저에서 텍스트를 긁어 다른 애플리케이션에 붙일 수 있다. PNG 파일은 전혀 만들지 않기 때문에 그래픽은 하나도 보이지 않는다. 어도브 파일에서 텍스트만 축출하는 데는 아주 유용하게 쓰일 수 있다.

그래픽을 보고 싶으면 -c (complex) 옵션을 사용하면 된다.

rreilly> pdftohtml -c [pdf file name]

이렇게 옵션을 주면 각각의 HTML 파일들을 만든다. PDF 파일의 각 페이지들에 HTML 파일들이 하나씩 배정되고 PNG 파일들이 링크된다. 원 PDF 파일에 있던 그래픽들을 브라우저에서 볼 수 있고 텍스트 또한 잘라서 붙일 수 있다. 이렇게 -c 옵션으로 만든 HTML과 PNG 파일의 총 용량은 원 PDF 파일 용량과 대충 비슷하다.

필자는 OpenOffice.org 임프레스에서 만든 PDF 파일을 포함해서 다양한 파일을 가지고 pdftohtml을 적용시켜 보았다. 결과적으로 썩 좋은 변환 품질을 보여주었고 컬러도 처리해주었다.

하지만 그냥 지나칠 수 없는 아쉬운 점들도 있었다.

- 원 PDF 파일의 텍스트와 그래픽 품질이 나쁘다면 (스캔한 페이지 등) 결과로 생성된 웹 페이지의 품질도 나빠 내용을 알아볼 수 없을 수도 있다. 이 문제를 해결하는 한 가지 방법은 생성된 PNG 파일을 Gimp로 불러 콘트라스트를 조정하는 것이다. 또한 몇몇 내장 확장 필터를 사용해볼 수도 있다.

- 다른 제한점은 pdftohtml 변환기가 기본으로 PNG 파일을 1.5배 크게 만든다는 것이다. 그래서 변환한 임프레스 슬라이드는 브라우저에서 한눈에 보기에 너무 커서 전체 슬라이드를 보려고 상하좌우로 스크롤을 해야했다. 모질라 1024x768 해상도 세팅에서 그랬다! 이건 쉽게 처리할 수 있다. 명령을 줄 때 줌(zoom)을 1.0으로 설정하면 된다.

rreilly> pdftohtml -c -zoom 1.0 [pdf file name]

- 변환된 자료의 포맷이 원 PDF와는 세세한 부분에서 약간 다르다. 줄 간격이 좀더 벌어져 있거나 글꼴이 기본 글꼴로 변환되어 있는 경우가 있다. 모질라(버전 1.6)는 생성된 HTML과 PNG 파일을 아주 잘 보여주는 것 같다. 동일한 웹 페이지를 컹커러 3.3.1로 보았을 때는 상황이 달랐다. 아마도 버전이 올라가면 좀 더 잘 보여줄 것 같다.

- pdftohtml은 변환 작업에 다소 시간을 요구한다. 특히 페이지가 많은 PDF 파일이고 -c 옵션을 사용할 때 그렇다. 필자의 구형 300MHz 랩탑에서 60페이지 PDF 문서를 HTML과 PNG 그래픽으로 변환하는 데 거의 5분이 걸렸다.

이 밖에도 여러 명령행 옵션이 있으니 한번 시도해보기 바란다. 예를 들면 -noframes, -nomerge 등이 있다. 옵션 목록을 보고 싶으면 옵션을 주지 말고 그냥 pdftohtml이라고만 입력하면 된다.

변환된 페이지를 웹 서버에 올리기

이제 우리는 PDF 파일에서 HTML과 PNG 파일을 만들었다. 마지막 단계는 그것들을 서버에 올려 다른 이들이 볼 수 있게 하는 것이다.

파일을 ISP 웹 서버에 보낼 때는 그냥 gftp나 다른 FTP 프로그램을 사용하여 HTML과 PNG 파일을 올릴 수 있다.

필자는 필자의 랩탑에서 웹에 연결되어 있는 아파치 서버로 그 파일들을 복사하는 데 scp를 사용했다. 조금 번거롭다고 느낄 수도 있겠지만 필자는 타이핑을 즐기니 별 문제없다.

웹 서버에 디렉토리 구조도 만들었다. 각각의 디렉토리 이름은 원 PDF 파일 이름을 따랐다. 다른 여러 문서들도 변환해야 할 일이 있을 것이라는 생각 때문이었다. pdftohtml은 무조건 PDF 파일 이름을 따라 변환된 파일들에 이름을 붙인다. 변환된 파일들을 모두 한 디렉토리에 집어넣을 수도 있겠지만 그럴 경우 금방 혼란스러워 질 것이다. 한 문서 당 하나의 변환 디렉토리를 할당한다면 관리하기에 훨씬 쉽다. 정말 편하게 하려면 HTML 메뉴 문서를 재빨리 작성해서 그 URL을 사용자에게 전달할 수 있다.

해결된 문제

내 동생의 PDF 파일을 그가 읽을 수 있는 형태로 만드는 데는 그리 많은 작업이 필요치 않았다. 조금만 손을 쓰면 가끔 도움을 받을 수 있는 방법이다. 정리하자면,

동생은 파일을 내려받는 데 전혀 신경 쓸 필요가 없었다. 필자가 해당 URL을 그에게 메일로 알려주었다.
그는 메일 계정의 용량 제한에도 신경 쓸 필요가 없다.

매 페이지가 HTML과 PNG이기 때문에 동생은 아주 경쾌하게 브라우저로 불러들여 원하는 대로 페이지를 하나씩 살펴볼 수 있었다.

결국 그는 자신의 윈도우즈 XP 박스를 아크로뱃 리더에게서 영향을 받지 않는 자유롭고 깨끗한 영역으로 남겨둘 수 있었다.

롭 레일리는 전문 기술 기고가이자 컨설턴트로 여러 리눅스 미디어 아울렛에 기사를 기고하고 있다. 전문적인 글을 쓰거나 리눅스 데스크탑 애플리케이션, 휴대형 컴퓨팅, 프리젠테이션 기술에 관해 세미나 서비스를 제공하기도 한다. 주된 관심은 유익한 리눅스 이야기를 쓰는 데 있다. robreilly AT earthlink.net 으로 메일을 보내거나 그의 홈페이지(http://home.earthlink.net/~robreilly)를 방문할 수 있다.

 
 
제공 : OSS센터  

'linux > Tip' 카테고리의 다른 글

SELinux  (0) 2007.04.30
awk -추가  (0) 2007.03.28
ssh brute force 막기 (ssh dictionary attack 막기 ver.2)  (0) 2007.03.16
daemontool 로 service하기  (0) 2007.03.16
Web server 성능 개선  (0) 2007.03.16
Posted by efrit
,
http://my.oops.org/56
http://my.oops.org/index.php?pl=56&ct1=3&ct2=2

http://www.hostlibrary.com/A-Cure-for-the-Common-SSH-Login-Attack-195586.html

ssh dictionary attack 막기 ver.2

요즘 ssh dictionary attack 이 심합니다. (정확히 말하자면.. ssh brute force attack 이라고 하더군요 ^^) 일전에 제 blog 에서 geoip 를 이용해서 막는 방법을 소개를 했었습니다.

외국에서의 공격, 특히 중국에서의 공격을 막아서인지 현저하게 시도는 줄었지만.. 그래도 3일에 한번꼴로 국낸 IP (특히 대학이나 초등학교 서버에서..) 에서 5000번 이상의 scan 을 하고 지나가는 꼴을 보니 또 오기가 생기기 시작했습니다.

설마 막는 방법에 없겠느냐는 생각에 iptables 의 extension 을 탐색하던 중 ipt_recent extension 을 발견 했습니다. recent extension 은 iptables 의 기본 extension 이므로 따로 빌드할 필요도 없고, seconds 별 hitcount 를 계산할 수 있는 듯 합니다.

아래의 예제를 보죠. (oops.org 에 기본으로 적용한 rule 입니다.)

# ssh buste attack rule
%-A INPUT -p tcp --dport 22 -m state --state NEW -m recent --set --name SSHSCAN
%-A INPUT -p tcp --dport 22 -m state --state NEW -m recent --update \
       --seconds 60 --hitcount 8 --rttl --name SSHSCAN -j LOG --log-prefix SSH_Scan:
%-A INPUT -p tcp --dport 22 -m state --state NEW -m recent --update \
       --seconds 60 --hitcount 8 --rttl --name SSHSCAN -j DROP


1. 처음에 22 번으로 NEW state 의 session 을 SSHSCAN 이라는 이름으로 list 를 만듭니다.
2. 60 초 동안 8 번의 히트를 기록하면, 60초 동안 DROP 합니다.
3. 그리고 SSH_Scan 이라는 prefix 로 logging 을 합니다.

문서들이 영어라서.. 결국에는 습관대로 대충 읽고 반영해서 보자는 식으로 하게 되어서 정확한 정보는 되지 않을 것 같습니다. 정확한 정보를 얻고 싶은 분들은.. 다음의 링크를 참조 하십시오.

http://snowman.net/projects/ipt_recent/
http://users-x.757.org/~joat/wiki/index.php/Slowing_down_SSH_brute_force_attacks
http://la-samhna.de/library/brutessh.html

전 영어가 딸려서 ^^; 정확한 설명을 알려 주시면 고맙겠습니다. (아 이 귀차니즘의 압박이여.. -_-;)

P.S
안녕 리눅스를 사용하시는 분들은 oops-firewall 을 5.0.0 으로 올리시고 위의 rule 을 user.conf 에 반영하시면 됩니다. 5.0.0 부터는 ALLOWALL 이 user pre command 보다 먼저 실행이 되기 때문에 ALLOWALL 에 등록된 site 는 최소한 이 rule 에 영향을 받지 않습니다.

'linux > Tip' 카테고리의 다른 글

awk -추가  (0) 2007.03.28
pdf to html --linux  (0) 2007.03.16
daemontool 로 service하기  (0) 2007.03.16
Web server 성능 개선  (0) 2007.03.16
rotatelog  (0) 2007.03.16
Posted by efrit
,

'linux > Tip' 카테고리의 다른 글

pdf to html --linux  (0) 2007.03.16
ssh brute force 막기 (ssh dictionary attack 막기 ver.2)  (0) 2007.03.16
Web server 성능 개선  (0) 2007.03.16
rotatelog  (0) 2007.03.16
iptables 로 국가별 차단하기  (0) 2007.03.15
Posted by efrit
,

Web server 성능 개선

linux/Tip 2007. 3. 16. 14:36
가. httpd.conf , srm.conf , access.conf 파일의 최적화 수정

a. ServerType : StandAlone
 이것은 이용자 접속 요청시 웹 서버의 Child Processor의 생성에 있어서
기존 Spare Child Processor를 복사(Fork)하여 빠르게 대쳐할수 있도록 한다.
가령 100명의 이용자가 동시에 웹 서버로 접속할 경우 그때마다 config 파일을
참고로 하여 새로운 Child Processor가 만들어지는 inetd 방식보다 기존의 여유
Child processor 를 fork 하여 대응하는 것이 훨씬 빠르고 효율적이다.
b. HostNameLookup off
 이것은 접속자의 IP 주소에 대한 Reverse Lookup 을 방지한다. 대부분의 이용자들은
자신의 IP 주소에 대한 호스트, 도메인 이름이 없다. 그러므로 만일 HostNameLookup on 을
하여 웹 서버가 매번 접속 요청자에 대한 네임 서버 검색 후 로그 파일을 작성하도록 하면
그 만큼 접속 시간과 부하량이 증가하게 된다.
c. Rotate log를 사용한다.
 이용자가 접속할때마다 기록되는 access_log의 경우 한번 접속당 약 85Byte가 증가하여
하루 100만번의 접속으로 access_log 파일은 무려 약 405MByte가 증가한다.
이렇게 되면 접속때마다 log file을 access 하는데 상당한 시간과 부하가 발생된다.
그러므로 로그 파일을 일정 시간마다 초기화 함으로서 언제나 경량화 시켜줄 필요가 있는데,
이것은 httpd/support 디렉토리에 존재하는 rotatelogs라는 유틸리티를 쓰면 해결할 수 있다.
레드햇 리눅스 5.2 이상의 경우 syslog을 이용하여 log 파일을 관리하고 있다.

[ 형 식 : rotatelog logfilename time ]
 httpd.conf의 TransferLog logs/access_log를 아래와 같이 수정
 TransferLog “|/usr/loca/etc/httpd/support/rotatelogs /usr/local/etc/httpd/logs/access_log 86400”
 ## 86,400초 (24시간)마다 access_log을 갱신한다는 뜻
참고 : error log 역시 위와같은 방법으로 수정 가능
d. ServerAlias를 이용한다.
 가상 호스팅 추가시 ServerName www.domain.com 외에 ServerAlias *.domain.com
domain.com 를 아래에 추가하여 Alias 도메인의 가상 호스팅을 위해 불필요한
<virtualhost..> 필드의 추가를 생략할 수 있다.
e. Error_log파일을 통합한다.
 Virtual host 경우 가급적 error_log 파일들은 하나의 error_log 파일로 지정해
관리한다. (운영체제의 동시 file open수 제한을 피하는 소극적 방법?)
f. KeepAlive on
 이것은 접속 요청자에게 웹 서버 프로세스가 웹 페이지들을 전송할 때 내부의 여러개체
(그림파일) 전송까지 새로운 프로세스를 만들지 않고 담당 프로세스가 계속 접속을
유지 할 수 있도록 한다.
g. MaxRequestPerChild 를 증가시킨다.
 프로세스가 일정 횟수의 클라이언트 요청을 처리하고 종료되는 수치인
MaxRequestPerChild 30을 시스템의 안정성에 따라 증가시켜준다. 보통 100 이상을
권한다. 만일 자신의 웹 서버 시스템이 상당히 안정적이라면 아예 1,000을 주기도 한다.
h. StartServer, Min, Max Spare Server 수를 가급적 증가시켜준다.
 디폴트는 각각 5, 5, 10정도인데 웹 서버가 standalone 방식을 경우 새로운 접속요청을
받으면 기존의 spare Child Processor를 Fork 하여 새로운 Child Processor 를
만들어 내므로 기본적으로 Spare 프로세스가 많을 수 록 폭주에 빨리 대처할 수 있다.
각각 비례적으로 증가시키는 것이 바람직하다.
예) StartServer 20, Min SpareServer 20, Max SpareServer 40  (4배씩 증가)
i. MaxClient 150
 이것은 동시에 떠 있을수 있는 최대 Processor 수를 제한하는 것인데, 이것은 결국
최대 동시 이용자수 제한과 같다. 물론, http 프로토콜의 특성상 접속자체가 비연결성을
가지므로, 150정도가 충분할수 있으나 필요시 더 늘려줄수도 있다. 그러나 OS에서의
기본 제한 수치를 넘어설 수 있으므로, 주의 해야 한다. 가령 nobody 가 만들어낼수
있는 최대 프로세스의 개수가 150개로 OS에서 제한하고 있는데 MaxClient를 그 이상으로
조정하면 문제가 생길수 있다.


나. 운영체제(OS)의 각종 제한 설정 확인
  앞서 언급한 각 Processor 수치와 가상 호스팅을 위한 동시에 Open되는 Log 파일의
개수를 확장하기 위해서는 해당 웹 서버의 운영체제의 자원에 대한 제한 수치를 확인할
필요가 있다.

ulimit
 ulimit은 운영체제의 각종 Limit을 확인하는 명령어로서 아래의 수치를 확인할수 있다.
The Max number of system processess
The Max number of processes per user
The Max number of open files (can have open files)

웹 서버는 보통 nobody라는 이용자 권한을 가진 ChildProcessor에 의해 서비스된다.
가령 레드햇 리눅스의 경우 6.0 버전 이상부터 그 기본 수치가 상당히  증가되었는데,
이전 5.2버전의 경우 ulimit -a 으로 아래의 결과를 보인다.

 # ulimit -a
core file size (blocks)  1000000
data seg size (kbytes)   unlimited
file size (blocks)       unlimited
max memory size (kbytes) unlimited
stack size (kbytes)      8192
cpu time (seconds)       unlimited
max user processes       256
pipe size (512 bytes)    8
open files               256
virtual memory (kbytes)  2105343

 여기서 max user processes가  256 정도인데, 아파치 웹 서버의 conf 파일에서
MaxClient 를 256 이상 설정하면 OS의 기본 설정을 초과하므로 문제가 발생할 수 있다.
OpenFiles 역시 256이므로, access_log, error_log를 각 가상 호스팅 이용자에게 따로
부여할 경우에는 웹 서버의 log 파일의 총 개수가 256보다 아래여야  할것이다. 물론
이용자가 cgi 프로그램을 동시에 실행하여 open되는 file수도 고려해야 한다.

 참고로 ulimit는 OS의 기본 설정을 확인하거나 기본 수치에 대해 줄일 때 사용할수
있다. 그러므로 ulimit을 통해 각 분야별 수치를 증가시키는 것은 아무런 효과가 없다.
 OS의 기본 제한 수치를 증가시키고자 한다면 리눅스의 경우 별도의 커널 수정과 커널
컴파일이 필요하다.
그러나 레드헷 6.0부터 커널의 각종 설정들이 상당히 증가되어 (예 : openfiles,
max user processes 가 1024로 증가) 이젠 굳이 커널을 수정하여 컴파일할 필요가 없다.

'linux > Tip' 카테고리의 다른 글

ssh brute force 막기 (ssh dictionary attack 막기 ver.2)  (0) 2007.03.16
daemontool 로 service하기  (0) 2007.03.16
rotatelog  (0) 2007.03.16
iptables 로 국가별 차단하기  (0) 2007.03.15
DNS  (0) 2007.03.15
Posted by efrit
,