2009. 11. 9.

[find] 명령어

[find] 명령어

find ---주어진 파일명과 동일한 파일을 찾고, 그 경로를 출력한다.

# find / -name newbie -print

최상위 루트 디렉토리부터 검색하여 검색된 파일을 한 행에 하나씩 표준 출력

# find . -name newbie -print

현제의 작업 디렉토리에서 검색

# find / -size +1000 -print

최상위 루트에서 크기가 1000블록 이상인 파일 검색

# find . -size -1000 -print

현 디렉토리에서 크기가 1000블록 이하인 파일 검색

# find . -mtime +10 -print

10일 이전에 수정된 파일 검색

# find . -mtime -10 exec rm {} :

10일 이내에 수정한 파일을 검색하여 모두 지운다

# find / -cmin 5 -print

5분전에 마지막으로 수정된 파일을 찾을 수 있다.

# find /home -empty -print

/home 디렉토리에 용량이 0인 파일과 디렉토리를 찾는다.

# find / -perm -4000 -print

퍼미션이 4000 이상인 파일을 모두 출력한다.
출처 : http://www.linuxno1.com/

find ./ -name "*.jsp" -exec grep "request" {} ; -print
디렉토리내에(하위디렉토리포함) *.jsp라는 파일안에 request라는 단어가 있는 지 찾아서 뿌려줍니다.

find ./ -name "*.jsp" -exec perl -pi -e "s/search/replace/g" {} ; -print
디렉토리내에 *.jsp라는 파일명을 가진 파일을 찾고 그 안에 search라는 단어가 포함되어 있을경우, replace로 수정합니다.
문자열안에 " 이 들어갈 경우 x22로 써줍니다.

find ./ -mtime 0
24시간 내에 수정된 파일을 뿌려줍니다.

아쉽게도 출력되는 것에 대한 제어는 잘 모르겠습니다. ㅡ.ㅡ;



특정 용량 이상의 파일을 찾고 싶을때
find /home/ -size +2000000

특정 확장자의 파일을 찾고 자동으로 지우고 싶을때
find /home/ -name *.asf -exec rm -rf {} ;

퍼미션 706인 디렉토리를 차자서 707로 변환
find /home/ -perm 706 -type d -exec chmod 707 {} ;
chmod 707 `find -perm 706`

사용자 계정에서 환경설정 파일 검색했나 확인
find /home/ -maxdepth 2 -name .bash_history -exec grep -H .conf {} ; |
less

3일 이내 동안 수정된 파일 확인
find /home/ -mtime -3

3시간 이내 동안 수정된 파일 확인
find /home/ -mmin -3

수정된지 3시간 이후된 파일
find /home/ -mmin +3

현재폴더에서 수정된지 1시간 이내의 파일들만 압축
tar cvzf filename.tgz $( find ./ -type f -mmin -60 )

2009. 11. 3.

리눅스 특정 파일 확장자 한번에 변경 스크립트

리눅스 특정 파일 확장자 한번에 변경 스크립트 입니다.

#!/bin/bash
for i in `find -name *.jad`
do
echo $i `echo $i|sed 's/.jad/.java/'`
mv $i `echo $i|sed 's/.jad/.java/'`
done

2009. 10. 8.

[Oracle] 함수 계산 누적 값 더하기

Quiz> 아래와 같이 결과 값을 만들어라.
COL1 COL2
---- ----------
A 10
C 20
D 10
B 30

COL1 COL2 SUM
---- ---------- ----------
A 10 10
C 20 30
D 10 40
B 30 70


[풀이]
SQL> create table exam1(
2 id varchar2(2),
3 num number)
4 ;
SQL> insert into exam1 values('A',10);

1 row created.

SQL> insert into exam1 values('C',20);

1 row created.

SQL> insert into exam1 values('D',10);

1 row created.

SQL> insert into exam1 values('B',30);

1 row created.

SQL> select * from exam1;

ID NUM
---- ----------
A 10
C 20
D 10
B 30

SQL>
1 select min(y.id) col1, min(y.num) col2, sum(x.num) sss
2 from exam1 x, exam1 y
3 where x.rowid<=y.rowid
4 group by y.rowid
5* order by sss

COL1 COL2 SSS
---- ---------- ----------
A 10 10
C 20 30
D 10 40
B 30 70

2009. 10. 7.

[아이피 대역 계산법]

[아이피 대역 계산법]
4.16.5.0 ~ 5.7.4.0 AA

1. (4*256*256*256)+(16*256*256)+(5*256)+0 = 67108864+1048576+1280+0
2. (5*256*256*256)+(7*256*256)+(4*256)+0 = 83886080+458752+1024+0

-> 68158720 ~ 84345856 = 여기까지의 숫자가 AA의 IP 대역이라 계산할 수 있다.

2009. 9. 14.

[Oracle] 함수 기능

* 단일 행 함수

-함수가 정의된 SQL문이 실행될 때 각각의 ROW에 대해 수행되며 ROW 당 하나의 결과를 리턴 해줍니다.

-인수로는 상수,변수,표현식들이 사용될 수 있습니다.

-SELECT,WHERE,ORDER BY 절에 사용할 수 있습니다.



구 분 | 함수 | 내 용

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

LOWER 모든 문자를 소문자로

UPPER 모든 문자를 대문자로

INITCAP 첫 글자는 대문자,나머지는 소문자로

CANCAT 첫 번째 문자와 두 번째 문자를 연결

SUBSTR 문자의 길이를 리턴할 때

LENGTH 문자의 길이를 리턴할 때

NVL 널값을 다른 값으로 대체할 때

NVL2 조건에 의해 널값을 다른 값으로 대체할 때

SUBSTR 특정 문자의 문자열중 필요 부분만 선별하여 사용

문자 RTRIM 서브 스트림의 정확한 위치와 길이를 요구(오른쪽)

함수 LTRIM 서브 스트림의 정확한 위치와 길이를 요구(왼쪽)

RPAD 문자열을 제외한 공간에 지정한 문자열로 대체(오른쪽)

LPAD 문자열을 제외한 공간에 지정한 문자열로 대체(왼쪽)

TRANSLATE 첫 문자는 탐색집합의 첫 문자로 대체(2번째도 동일)

REPLACE 특정 문자열을 다른 문자열로 대체

SOUNDX 같은 단어 또는 유사한 사운드 단어를 음성학적으로

LENGTH 문자의 실제 길이를 변환할 때

LENGTHB 문자열의 실제 길이를 변환할 때

INTSTR 문자열 내의 특정 스트림의 위치

NULLIF 조건이 같으면 NULL,다르면 지정된 값을 리턴할 때

COALESCE 조건에 따라 여러 가지 값을 리턴할 때

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

시스템 USER 현재 DB 사용자

함수 USERID 현재 DB 사용자에게 할당되는 사용자번호

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



*문자함수의 예제

EX) -2개의 문자값을 결합합니다.

SQL>SELECT CONCAT(CONCAT(ename, ' is a '),job)

FROM emp;



CONCAT(CONCAT(ENAME,'ISA

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

SMITH is a CLERK

ALLEN is a SALESMAN



-정의된 문장 단어의 첫 번째 문자를 대문자로 변환

SOL> SELECT INITCAP( 'the soap') FROM DUAL;



INITCAP(

-----------

The Soap



-정의된 문장의 왼쪽 나머지 공간을 지정한 문자로 채웁니다.

SQL> SELECT LPAD( 'Page 1' , 15 , '*.') FROM DUAL;



LPAD( 'PAGE1',15

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

*.*.*.*.*Page 1



-정의된 문장의 왼쪽부터 지정된 단어가 발견되면 제거합니다.

SQL> SELECT LTRIM( 'xyxXxyLAST WORD','xy') FROM DUAL;



LTRIM('XYXXX

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

XxyLAST WORD



-정의된 문장에서 해당 문자가 발견되면 지정된 문자로 변경합니다.

SQL> SELECT REPLACE( 'JACK and JUE' , 'J' , 'BL') FROM DUAL;



REPLACE( 'JACKA

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

BLACK and BLUE



-정의된 문자의 오른쪽 나머지 공간을 지정한 문자로 채웁니다.

SQL> SELECT RPAD(ename, 11 ,'ab' ) FROM emp WHERE ename = 'TURNER' ;



RPAD(ENAME , 11 ,'AB')

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

TURNERababa



-정의된 문자의 오른쪽부터 지정된 단어가 발견되면 제거합니다.

SQL> SELECT RTRIM( 'TURNERyxXxy' , 'xy') FROM DUAL ;



RTRIM( 'TU

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

TURNERyxX



-정의된 문장의 지정된 위치부터 해당 길이 만큼만 추출합니다.

SQL> SELECT SUBSTR( 'ABCDEFG' , 3 , 2 ) FROM DUAL ;



SU

-------

CD



-정의된 문장의 뒤에서부터 지정된 위치의 해당 길이 만큼만 추출합니다.

SQL> SELECT SUBSTR ( 'ABCDEFG' , -3 , 2 ) FROM DUAL ;



SU

--------

EF



-문자 'Q'를 ASCII 코드로 변환합니다.

SQL> SELECT ASCII ( 'Q' ) FROM DUAL ;



ASCII ( 'Q' )

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

81



-정의된 문장에서 지정된 위치에 존재하는 문자의 위치 값을 찾아 줍니다.

SQL> SELECT INSTR ( 'CORPORATE FLOOR' , 'OR' ,3 ,2 ) FROM DUAL ;



INSTR ( 'CORPORATEFLOOR' , 'OR' , 3 , 2 )

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

14



-정의된 문장의 길이를 변환합니다.

SQL> SELECT LENGTHB ( '가나다라마바사') FROM DUAL ;

LENGTH( '가나다라마바사' )

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

14



-정의된 단어 중에 가장 높은 값을 찾아줍니다.

SQL> SELECT GREATEST ( 'HARRY' , 'HARIOT' ,'HALORD' ) FROM DUAL ;



GREAT

---------

HARRY



-정의한 컬럼이 NULL이면 지정한 값으로 대체합니다.

SQL> SELECT NVL (sal , 0 ) , NVL( ename , '*' ) , NVL(hiredate , '01-JAN-02' ) FROM emp ;

NVL(SAL , 0 ) NVL(ENAME , NVL(HIRE

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

800 SMITH 80/12/17





*시스템 함수

-현재 어떤 사용자로 데이터 베이스에 접속하였는지 알 수 있습니다.

SQL> SELECT USER FROM dual ;



USER

-------

SCOTT







* 숫자함수/날짜함수

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

구 분 함 수 내 용

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

ROUND 해당 소수점 자리에서 반올림할 때

TRUNC 해당 소수점 자리에서 절삭할 때

MOD(m/n) m을 n으로 나누고 남은 나머지를 리턴할 때

ABS 숫자 값을 절대값으로 바꾼다

SIGN 숫자가 양수:+1, 음수:-1, 0:0

숫자함수 FLOOR 실수값을 정수값으로

CEIL 그 수보다 가장 크거나 작은값을 리턴

POWER 해당 수에 대한 지수값을 표현

LOG 로그값으로 변환

SIN SIN값

COS COS값

TAN TAN값

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

SYSDATE 현재 시스템 날짜를 보여줄 때

ADD_MONTHS 지정한 날짜에 몇 월을 추가한 결과의 월을 계산할 때

LAST_DAY 해당 월의 마지막 날짜를 알고자 할 때

날짜함수 NEW_TIME 해당 표준시로 시간을 변환할 때

NEXT_DAY 해당 날짜의 다음 지정한 날짜로 현환할 때

NONTH_BETWEEN 지정된 월 간의 월수를 알고자 할 때

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



* 숫자함수 예제....

-정의된 값을 절대값으로 변환 합니다

SQL> SELECT ABS(-15) FROM DUAL ;

ABS(-15)

-----------

15



-정의된 값의 올림된 값으로 변환합니다

SQL> SELECT CEIL(15.7) FROM DUAL ;



CEIL(15.7)

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

16



-정의된 값의 내림된 값으로 변환합니다

SQL> SELECT FLOOR(15.7) FROM DUAL ;



FLOOR(15.7)

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

15



-정의된 산술식의 COSINE 값으로 변환합니다

SQL> SELECT COS(180*3.14/180) FROM DUAL ;



COS(180*3.14/180)

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

-.99999873



-정의된 숫자의 지수승값을 계산합니다

SQL> SELECT EXP(4) FROM DUAL ;



EXP(4)

---------

54.59815



-뒤에 정의된 수로 앞에 정의된 수를 나눈 나머지 값을 반환합니다

SQL> SELECT MOD(11,4) FROM DUAL ;



MOD(11,4)

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

3



-정의된 수를 지정한 자리 수에서 반올림합니다

SQL> SELECT ROUND(15.193 , 1) FROM DUAL ;



ROUND(15.193 , 1)

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

15.2



-정의된 값이 음수이면 -1 , 0 이면 0, 양수이면 1을 리턴합니다

SQL> SELECT SIGN(-15) FROM DUAL ;



SIGN(-15)

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

-1



-정의된 수를 지정한 자리 수 에서 절삭합니다

SQL> SELECT TRUNC(15.97 , 1) FROM DUAL ;



TRUNC(15.79 , 1)

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

15.7



* 날짜 함수 예제



-현재 시스템 날짜를 제공합니다

SQL> SELECT SYSDATE FROM DUAL ;



SYSDATE

-----------

06/11/13



-해당 날짜에 지정한 달 수만큼 더합니다

SQL> SELECT HIREDATE , ADD_MONTHS(HIREDATE , 1)

FROM EMP WHERE EMPNO = 7782 ;



HIREDATE ADD_MONT

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

81/06/09 81/07/09



-정의된 날짜의 달에서 마지막 일이 몇 일인지 알 수 있습니다

SQL> SELECT HIREDATE , LAST_DAY(HIREDATE)

FROM EMP WHERE EMPNO = 7782 ;



HIREDATE LAST_DAY

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

81/06/09 81/06/30



-정의된 두 날짜간의 차이 값을 알 수 있습니다

SQL> SELECT HIREDATE , MONTHS_BETWEEN(SYSDATE , HIREDATE)

FROM EMP WHERE EMPNO = 7782 ;



HIREDATE MONTHS_BETWEEN(SYSDATE , HIREDATE)

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

81/06/09 252.930883



-정의된 날짜를 녀도 값을 기준으로 반올림 합니다

SQL > SELECT

ROUND(TO_DATE(' 27-OCT-98' , 'DD-MON-YY' ) ,

'YEAT' ) FROM DUAL ;



ROUND(TO

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

99/01/01






변환 함수

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

구 분 함 수 내 용

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

TO_CHAR 숫자,날짜 타입의 Data를 varchar2타입으로 변환

변환함수 TO_NUMBER 숫자를 포함하는 문자 String을 number 타입으로 변환

TO_DATE 문자 String을 날짜 타입으로 변환

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



*날짜 형식 요소

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

형식 요소 설 명

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

MM 달 수(ex : 10)

MON 월 이름을 3자리 문자로 표현(ex : JAN , FEB , MAR 등)

MONTH 월 이름(ex : JANUARY,FEBUARY,MARCH 등)

DD 날짜 (ex : 14)

D 주의 일수 (ex : 4)

DY 요일 이름을 3자리 문자로 표현(ex : SUN , MON , TUE 등)

DAY 요일 이름(ex : SUNDAY , MONDAY 등)

YYYY 년도 4자리 수 (ex : 2002)

YY 년도의 마지막 2자리(ex : 02)

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



*시간 형식 요소

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

형식 요소 설 명

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

9 숫자(ex : 9999 → 1534)

0 자리 수가 비면 0으로 채워줌 ( ex : 09999 → 01534 )

$ 금액에 $를 표시해줌 (ex : $99999 → $1534 )

. 명시한 위치에 소수점을 표시함 (ex : 99999.99 → 1534.00 )

, 명시한 위치에 콤마를 표시함 (ex : 999,999 → 1,534 )

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



변환 함수 예제들.....

-현재 날짜가 한 주에서 몇번째 일인지 알 수 있습니다

SQL> SELECT SYSDATE , TO_CHAR ( SYSDATE , 'D' )

FROM dual ;



SYSDATE TO_CHAR

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

02/09/26 5



-정의된 날짜의 출력 포맷을 DD-MM-YY로 출력합니다

SQL> SELECT ename , TO_CHAR(hiredate , 'DD-MM-YY' ) HIREDATE

FROM emp ;



ENAME TO_CHAR(hiredate , 'DD-MM-YY' )

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

SMITH 17 11 90

ALLY 20 02 91

......................



-일자를 출력할 때 0 값을 제거합니다(09 → 9 , 01 → 1)

SQL> SELECT ename , TO_CHAR (hiredate , 'fmDD-MM-YY' ) HIREDATE

FROM emp ;



ENAME TO_CHAR(hiredate , 'fmDD-MM-YY' )

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

....................................

MARTIN 9 09 91

....................................



-문자 100을 숫자값으로 출력합니다

SQL> SELECT TO_NUMBER ( '100' ) FROM dual ;



TO_NUMBER

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

100



-현재 시간을 AM , PM 표기법으로 출력합니다

SQL> SELECT TO_CHAR( SYSDATE , 'AM HH:MI ' )

FROM dual ;



TO_CHAR(

-----------

오전 10 : 10



-숫자값을 출력할 때 금액표시를 합니다

SQL> SELECT TO_CHAR( 12506 , '$9099,999' ) FROM dual ;



TO_CHAR(

-----------

$010,234



-정의된 날짜를 지정한 포맷으로 출력합니다

SQL> SELECT TO_DATE( '01-JUL-99' , 'DD-MM-YY' )

FROM dual ;



TO_DATE(

-----------

99/07/01



-정의된 시간을 지정한 포맷으로 출력합니다

SQL> SELECT TO_DATE( '01:30' , 'HH24:MI' ) FROM dual ;



TO_DATE

----------

13:30




단일행함수
* NVL2 ( Colum, Express1, Express2 )



-해당 컬럼이 null이면 Express-2 의 값을 , null이 아니면 Express-1의 값을 리턴해 줍니다.

오라클 이전 버전에서 사용되던 NVL함수는 정의된 컬럼의 값이 null인 경우 지정한 값으로

대체하는 기능을 가지고 있었습니다. 반대로, NVL2 함수는 정의된 컬럼의 값이 지정한

값인 경우 null값으로 대체된다.

NVL2 함수는 해당 컬럼이 null 값이 아니면 Express2의 값을 리턴해 주고 null 값이면

Express3의 값을 리턴해 주는 기능을 가지고 있습니다.

SQL> SELECT empno, ename, nv12( comm, comm.*1.1, 0 )

FROM emp ;



EMPNO ENAME COMM NVL2( COMM, COMM*1.1, 0 )

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

7369 SMITH 0

7499 ALLEN 300 330

7521 WARD 500 550

7566 JONES 0

..............................................

->COMM이 null인 경우 null이 아닌 경우





* NULLIF ( Express1, Express2 )



-Express-1과 Express-2의 값을 비교하여 그 값이 같으면 null을 리턴하고 다르면 Express-1의

값을 리턴해 줍니다.

NULLIF 함수는 Express-1 과 Express-2 의 값을 비교하여 그 값이 같으면 null 값을 리턴하고

서로 다른 값을 가지고 있으면 Express-1의 값을 리턴해 주는 함수입니다.

LENGTH(first_name)의 값과 LENGTH(last_name)의 값을 NULLIF 함수로 비교하여 같으면

null 값을 화면에 출력하고 다르면 LENGTH(first_name)의 값을 화면에 출력합니다.



SQL> SELECT empno, ename, nullif( comm, 0 )

FROM emp ;



EMPNO ENAME COMM NULLIF( COMM, 0 )

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

7369 SMITH

7370 ALLEN 300 300

7521 WARD 500 500

7566 JONES

7654 MARTIN 1400 1400

.....................................

->COMM이 NULL이므로 NULL, COMM이 NULL이 아니므로 COMM값으로...



*COALLESCE 함수

이 함수는 EXPRESS-1의 값이 NULL값이 아니면 EXPRESS-1의 값을 화면에 출력해 주고

NULL 값이면 EXPRESS-2의 값을 EXPRESS-1의 값과 EXPRESS-2의 값모두 NULL이면

EXPRESS-N의 값을 화면에 출력해 주는 함수입니다. 문법에서 정의된 각 컬럼에서 NULL이

아닌 첫 번째 컬럼의 값을 돌려줍니다.



SQL> SELECT coalesce( comm,sal ) FROM emp ;



COALESCE( COMM,SAL )

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

800

300



SQL> SELECT coalesce ( comm, 100 ) FROM emp ;



COALESCE( COMM,100 )

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

100

300

500

->이 문법은 COALESCE([컬럼],[값]) 문법에서 정의된 컬럼이 NULL이면 정의된 값을

더한 결과를 돌려줍니다. 원래 NULL이지만 100을 더한 값이 출력됩니다.



*TRIM함수

이 함수는 오라클 8i 버전에서 추가된 함수이며 이전 버전에서 제공되던 LTRIM 함수와

RTRIM 함수를 결합한 형태의 함수입니다. TRIM 함수는 문자값의 왼쪽 또는 오른쪽 부분에

정의한 문자값이 존재하면 그 문자를 절삭시키는 기능을 가지고 있습니다. TRIM 함수는

3가지 종류의 기능을 가지고 있습니다.



-먼저,LEADING은 이전의 LTRIM 함수와 동일한 기능을 가지고 있습니다.정의된 컬럼의 값

왼쪽에 해당 문자열이 존재하면 문자값을 절삭시켜서 화면에 출력합니다.

SQL> SELECT ename, TRIM( LEADING 'A' FROM ename ) as TRIM

FROM emp

WHERE ename LIKE 'A%' ;



ENAME TRIM

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

ALLEN LLEN

ADAMS DAMS



-TRAILING은 이전의 RTRIM 함수의 기능을 가지고 있으며 컬럼값의 오른쪽에 존재하는 문자값을

절삭해줍니다.

SQL> SELECT ename, TRIM( TRAILING 'N' FROM ename ) as TRIM

FROM emp

WHERE ename LIKE '%N' ;



ENAME TRIM

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

ALLEN ALLE

MARTIN MARTI



-BOTH는 왼쪽, 오른쪽에 해당 문자열이 있으면 절삭해 주는 기능을 가지고 있습니다.

SQL> SELECT ename, TRIM( BOTH 'A' FROM ename ) as TRIM

FROM emp

WHERE ename LIKE 'A%' ;



ENAME TRIM

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

ALLEN LLEN

ADAMS DAMS

->ENAME 컬럼에서 마지막 문자가 'A'인 값은 발견되지 않았고 첫번째 문자가 'A'인 사원은 ALLEN과 ADAMS

^M문자없애기

^M문자없애기

vi로 문서를 보다 보면 줄끝마다 ^M 이 보이는 경우가 있습니다.
이는 윈도우시리즈(도스포함)에서 작성된 문서를 유닉스로 볼때 생기는 현상 입니다.

이런 현상이 왜 생기는 이유는 윈도우와 유닉스에서의 ASCII화일 형식이 서로 다릅니다.

일단 윈도우에서는 엔터시에 한줄을 내리고 커서를 앞으로 보내주지만 즉,엔터 한번으로
두 명령이 입력되는거죠..

하지만 유닉스에서는 엔터치면 단지 줄만 바뀌죠..즉 한번의 엔터는 단지 한번의 명령일 뿐 입니다..^^;

그래서 도스파티션에 있는 화일을 그냥 카피하면 ^M자들이 지저분하게 보이죠..

반대로 유닉스용 화일을 도스로 카피해서 도스용 에디터로 보면 전부 한줄로 붙어서 나타나게 된답니다.

아래는 몇가지 방법입니다.

1. vi 에디터를 이용해서 ^M 문자 없애는 방법

1) tr 을 이용합니다.
vi 에디터에서 다음과 같이 입력합니다. 여기서 1G는 첫라인으로 간다는
뜻이고, 느낌표부터는 쉘명령 tr을 이용한다는 겁니다.

1G!Gtr -d ^M

2) ed 명령을 사용합니다.
vi 에디터에서 다음과 같이 입력합니다. 여기서 : 는 아시다시피
명령모드로 가는 거구, 1은 첫라인을 $는 마지막 라인을 의미합니다.
그러므로 여기서 1,$ 는 첫라인부터 마지막라인까지라는 뜻이겠죠?
s는 substitute의 약자로써 다음의 /피대체어/대체어/ 에서
피대체어를 대체어로 바꾼다는 것입니다. 여기서는 ^M을 없애라는
뜻이겠죠? 마지막의 g는 global의 약자로 각 라인에서 해당문자열이
나올때마다 몽땅 바꾸라는 의미.

:1,$s/^M//g


2. perl 을 이용하는 방법

perl -pi -e 's/\r//' inputfile


3. sed 를 이용하는 방법

1 번 vi 에디터를 이용하는 방법에서 언급 되었습니다. 커맨드라인상에서
바로 수정하는 방법.

sed 's/^M//g' inputfile > outputfile


4. awk 를 이용하는 방법

print $0 는 문서전체를 의미합니다.

awk '{print $0,"\r"}' inputfile > outputfile


5. tr 을 이용하는 방법

1 번 vi 에디터를 이용하는 방법에서도 언급되었지만 에디터를 부르지
않고 커맨드라인상에서 바로 고치는 방법입니다. -d 옵션은 delete를 의미.

tr -d '\015' < inputfile > outputfile


6. mcopy 이용시 옵션을 주는 방법

-t 옵션을 이용하면 mcopy로 복사할때 ^M 문자가 없어지고 copy됩니다.

mcopy -t a:/test.cap .

7. fromdos 명령을 이용하는 방법

간단히 리눅스에 포함되어있는 유틸리티를 이용하는 방법입니다. fromdos는
도스용 문서를 리눅스(유닉스)용으로, todos는 리눅스에서 도스용으로 변환
할때 사용할 수 있습니다.

fromdos inputfile


참고 : ^M 의 입력은 [Ctrl+V][Ctrl+M] 입니다.


또다른 방법하나.

//g$s/
요렇게 하면 몽땅 지워집니다.
1 은 첫라인부터
$ 은 마지막라인까지
s 는 다음과 같이 바꾸는데...
^M 은 입력할때 Ctrl+V M 요렇게 해야허구...
// 는 원래 요사이에 뭔 string이 들어가야하지만
없애야하기에 암껏두 안썼음.
g 는 문서전체에 걸쳐 몽땅...

이게 귀찮으시면 그냥 fromdos 명령 사용하세요~


저는 보통 vi 편집기 명령모드에서 :1,$s/^M//g 이걸로 ^M을 없애고 있습니다..

2009. 8. 19.

wget 을 웹소스 땡기기

다운받는 경로

http://www.gun.org/software/

(리눅스용은 대부분 디폴트로 깔려있습니다.)



설치 방법

# tar xvfz wget-5.x.x.tar.gz

# ./configure

# make install



사용 방법

# wget http://www.naver.com/index.html

현재 디렉토리에 index.html 파일을 가져옵니다.

index.html 파일에 링크되어 있는 것까지 가져오려면 -r 옵션을 사용합니다.

# wget -r http://www.naver.com/index.html

-r 옵션은 재귀적을 의미하는 recursive 입니다. 디렉토리 구조와 파일을 그대로 가져옵니다.

재귀적 탐색의 깊이 레벨은 기본값이 5로 설정되어 있으며, -l depth 옵션을 사용하여 바꿀수 있습니다.

기본갑이 -l 5 인데 이 레벨이 증가함에 따라 복사해오는 파일은 지수 함수적으로 증가하게 됩니다.



특정페이지와 링크된 것만 받고싶으면

# wget -r www.naver.com/index.html/doc/lecture/lecture.html

이렇게 하면 lecture.html과 이파일과 링크된 파일들을 복사해 옵니다. 이 과정에서 링크된 파일 중 상위 디렉토리에 있는 것도 있는데, 이 파일들을 빼고 원하는 파일이 있는 디렉토리와 그 이하에서만 받아오려면 아래와 같은 명령을 수행 합니다.

# wget -r -np www.naver.com/index.html/doc/lecture/lecture.html

-np 옵션은 no-parent를 의미합니다.



사이트에서 이미지나 오디오 파일 등을 제외하고 html 문서만 가져오고 싶으면

# wget -r -np -A html, htm www.naver.com/index.html

-A 옵션은 accept를 의미합니다. 만약 이와 반대로 일부 파일을 제외하고 싶으시면 -R 옵션을 사용 합니다. reject를 의미합니다.

# wget -r -R gif, jpg, jpeg www.naver.com/index.html

gif, jpg, jpeg만 제외하고 나머지만 가져옵니다.



-L 옵션은 상대주소를 이용한 링크들만 불러옵니다. 타 호스트에 있는 자료는 불러오지 않습니다.

대부분 html내의 링크는 상대주소를 이용하기 때문에 크게 중요하지는 않습니다.

# wget -r -L www.naver.com/index.html

만약 타 호스트의 자료까지 재귀적 탐색에 넣고싶으면 H 옵션을 씁니다. span-hosts를 의미합니다.



- 참고 -

wget -r http://대상사이트/ --user-agent="Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.0.0) Gecko/20020529



위 명령어대로 실행시키면 해당 사이트에 끊임없이 접속해서 그곳의 파일들을 긁어옵니다.

(F5 새로고침을 계속 누르는 것 이상으로 효과적이라도 함)

실행해보면 당해 디렉토리에 공격대상사이트의 이름으로 된 폴더가 생기게 되고 그곳에 파일이 계속 저장됩니다.



p.s 브라우져에서 보이는 것만 긁어온다. 소스자체를 긁어오는 것이 아니다.

2009. 8. 18.

리눅스 명령어 알고싶어요

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로 다시 압축하기)

2009. 7. 27.

[Shell] FTP 자동 접근 스크립트

1
==============================================================================
#!/bin/ksh

IP=""
ID=""
PASS=""
SRC_PATH="/home/ems2/bin"

echo "----------------------------------"
echo "[$IP]와 FTP통신 하기"
echo "ID=$ID, PASSWORD=$PASS"
echo "----------------------------------"

echo "=> FTP 파일 전송(s) or 수신(r) : "\\c
read sor

LIST=""
TEMP_PATH=""
getNput=""

if [ "$sor" = "S" ] || [ "$sor" = "s" ]
then
echo "=> FTP로 전송 할 파일들 입력 : "\\c
read LIST

TEMP_PATH="./"
getNput="mput"
else
echo "=> FTP로 수신 할 파일들 입력 : "\\c
read LIST

echo "=> FTP로 수신 할 패스 입력(default : /home/ems2/bin) : "\\c
read TEMP_PATH

getNput="mget"
fi

if [ -n "$TEMP_PATH" ]
then
SRC_PATH=$TEMP_PATH
fi

ftp -n $IP << EOF
user $ID $PASS
prompt
passive
hash
bin
cd $SRC_PATH
$getNput $LIST
bye
EOF

echo "전송 완료!!"

PERM="755"

if [ "$sor" = "R" ] || [ "$sor" = "r" ]
then
echo "=> 수신한 파일들의 퍼미션 입력(default : 755) : "\\c
read TEMP_PERM

if [ -n "$TEMP_PATH" ]
then
PERM=$TEMP_PERM
fi

chmod $PERM $LIST
fi

exit 0

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

2
==============================================================================
#!/bin/sh

IP=""
ID=""
PASS=""
SRC_PATH="/supp1/webapps/ims_domain/ims/ims_webapps/pid/server"

/home/wlogic81/nam/pid_monitor/.ws_01a_pid.sh > /home/wlogic81/nam/pid_monitor/logs/ws_01a_`date +%Y%m%d`.xml;

cp /home/wlogic81/nam/pid_monitor/logs/ws_01a_`date +%Y%m%d`.xml /home/wlogic81/nam/pid_monitor/ws_01a.xml;


ftp -n -v $IP << EOF
user $ID $PASS
prompt
passive
hash
bin
cd $SRC_PATH
mput ws_01a.xml
bye
EOF

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

3
==============================================================================
#!/bin/sh
FILENAME=/hom
for user in $(cut -d: -f1 $FILENAME)
do
aaa=$user // 오늘날짜를 aaa라는 변수에 담아요
done
/usr/kerberos/bin/ftp -vn << END // crontab에서는 ftp라고 부르면 오류나요. 파일이 실제 존재하는 곳
open 211.xx.xx.xx
user user_id "password"

as
hash
prompt
lcd /home/uploading //업로드하려는 파일이 존재하는 폴더 (서버상에서)
put upfile_${aaa}.txt // upfile_20080721.txt 오늘날짜라면..
bye
END

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


4 : 기타 순차 출력 방법
==============================================================================

#!/bin/sh

##cnt=1

##while [ $cnt -lt `cat list.txt | wc -l` ]
##do
#echo $cnt
## echo `cat -n list.txt | grep $cnt`
## cnt=`expr $cnt + 1`
## echo

# if [ $cnt == `cat list.txt | grep $cnt` ]
# then
# echo ""
# fi
##done


for line in `cat list.txt | tr -d '1'`;
do

echo $line

done

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

2009. 7. 19.

[Windows] Console Command

명령어 ----------------------------------------------------------------



clipbrd (클립보드에 복사된 내용 표시)
control (제어판)

winver (윈도우 버전확인)
osk 화상키보드
pbrush 또는 mspaint (그림판)
ping 사이트주소(핑테스트 해당 사이트의 인터넷연결 유무 확인)
explorer 탐색기


shutdown -i : GUI화면으로 시스템 종료, 재부팅 가능
shutdown -a : 종료 설정 중지
netstat : 인터넷 접속 상황
ipconfig /all : ip주소,게이트웨이,서브넷마스크,
DNS서버주소,physical주소
dxdiag : 다이렉트 - X 상태 정보 화면
cleanmgr.exe : 디스크 정리
regedit : 레지스트리 편집기
mstsc.exe : 원격 데스크톱 연결
netsetup.exe : 네트워크 설정 마법사

실행창 명령어

일반명령어

calc (계산기)
charmap 문자표
cleanmgr 디스크정리
dfrg.msc 디스크 조각모음
dxdiag (다이렉트X 진단도구 및 그래픽과 사운드의 세부정보를 보여줌)
eudcedit 사용자 정의 문자 편집기
magnify 돋보기
mobsync 동기화
msconfig(시작프로그램 제어등 많은기능 제공)
msinfo32 시스템정보
mstsc 원격 데스크톱 연결
netstat -na(현재 열린포트와 TCP/IP 프로토콜정보를 보여줌)
열린포트로 트라이목마형 바이러스 침투 유무확인가능
notepad 메모장
ntbackup 백업 및 복원 마법사
regedit(레지스트리 편집기)
sfc(시스템 파일 검사기)
-시스템 파일을 검사한후 깨지거난 손실된 파일을 원본 압축파일에서 찾아서 복원시켜줌 . 단,

윈2000에서는 cmd실행 후 sfc사용 - 마지막 설정된 값을 다음 윈도우부팅시 곧바로 실행됨[수정]
sndrec32 녹음기
sndvol32 (시스템 사운드 등록정보,볼륨조절)
sysedit(autoexec.bat, config.sys, win.ini, system.ini 시스템구성편집기)
systray(사운드 볼륨설정 노란색 스피커 아이콘을 트라이목록에 띄움)
telnet open 사이트주소(텔넷접속명령어)
tourstart (윈도우 기능안내 html 문서표시)
wab 주소록
winipcfg(인터넷에 접속된 자신의 아이피 주소를 보여줌) 단, 윈2000은 ipconfig로 변경됨
winmine (지뢰찾기)
wmplayer (윈도우 미디어 플레이어)
wordpad 워드패드
wscui.cpl 보안센터
wupdmgr 윈도우업데이트



MSC명령어



certmgr.msc : 인증서 관리
ciadv.msc : 인덱싱 서비스
compmgmt.msc : 컴퓨터 관리
devmgmt.msc : 장치관리자
dfrg.msc : 디스크 조각 모음
diskmgmt.msc : 디스크 관리
eventvwr.msc : 이벤트 뷰어 (이벤트 로그)
fsmgmt.msc : 공유 폴더 (공유 폴더 관리)
gpedit.msc : 그룹 정책
lusrmgr.msc : 로컬 사용자 및 그룹
ntmsmgr.msc : Removable Storage
ntmsoprq.msc : 이동식 저장소 운영자 요청
perfmon.msc : 성능
rsop.msc : 정책의 결과 집합
secpol.msc : 로컬 보안 설정
services.msc : 서비스
wmimgmt.msc : WMI 서비스 구성
comexp.msc : comexp 구성 요소 서비스
control userpasswords2 : 사용자 계정
gpedit.msc : 도메인 또는 액티브 디렉토리나 PC에 저장되어 있는
조직 단위에 연결된 그룹정책개체를 편집하는
'로컬 컴퓨터 정책'을 연다.

2009. 6. 11.

캐리지 리턴 문자 없애기

vi
:%s/^M//g

find `pwd` -name "*.*" | xargs grep "^M"

find `pwd` -name "*.*" -exec perl -pi -e 's/^M//g' {} \; -print

2009. 5. 21.

[Shell] 구구단 및 별 출력 스크립트

[1] 구구단 출력

#!/bin/bash
dan=2
while [ $dan -lt 10 ]
do
echo " $dan 단"
echo "======"
num=1
while [ $num -lt 10 ]
do
answer=`expr $dan \* $num`
if [ $answer -lt 10 ]; then
answer=" $answer"
fi
echo "${dan}x${num}=${answer}"
num=`expr $num + 1`
done

dan=`expr $dan + 1`
echo ""
done

출력 :
2 단
======
2x1= 2
2x2= 4
2x3= 6
2x4= 8
2x5=10
2x6=12
2x7=14
2x8=16
2x9=18

.....

9 단
======
9x1= 9
9x2=18
9x3=27
9x4=36
9x5=45
9x6=54
9x7=63
9x8=72
9x9=81


[2] 구구단 출력 가로
#!/bin/bash
echo ""
num=1
while [ $num -lt 10 ]
do
dan=2
while [ $dan -lt 6 ]
do
answer=`expr $dan \* $num`
if [ $answer -lt 10 ]; then
answer=" $answer"
fi
echo -n "${dan}x${num}=${answer} "
dan=`expr $dan + 1`
done

num=`expr $num + 1`
echo ""
done

echo ""

num=1
while [ $num -lt 10 ]
do
dan=6
while [ $dan -lt 10 ]
do
answer=`expr $dan \* $num`
if [ $answer -lt 10 ]; then
answer=" $answer"
fi
echo -n "${dan}x${num}=${answer} "
dan=`expr $dan + 1`
done

num=`expr $num + 1`
echo ""
done
echo ""

출력 :

2x1= 2 3x1= 3 4x1= 4 5x1= 5
2x2= 4 3x2= 6 4x2= 8 5x2=10
2x3= 6 3x3= 9 4x3=12 5x3=15
2x4= 8 3x4=12 4x4=16 5x4=20
2x5=10 3x5=15 4x5=20 5x5=25
2x6=12 3x6=18 4x6=24 5x6=30
2x7=14 3x7=21 4x7=28 5x7=35
2x8=16 3x8=24 4x8=32 5x8=40
2x9=18 3x9=27 4x9=36 5x9=45

6x1= 6 7x1= 7 8x1= 8 9x1= 9
6x2=12 7x2=14 8x2=16 9x2=18
6x3=18 7x3=21 8x3=24 9x3=27
6x4=24 7x4=28 8x4=32 9x4=36
6x5=30 7x5=35 8x5=40 9x5=45
6x6=36 7x6=42 8x6=48 9x6=54
6x7=42 7x7=49 8x7=56 9x7=63
6x8=48 7x8=56 8x8=64 9x8=72
6x9=54 7x9=63 8x9=72 9x9=81




[3] 별 출력
#!/bin/bash
echo ""
echo -n "Number : "
read su
echo ""

i=1
while [ $i -le $su ]
do
j=1
while [ $j -le $i ]
do
echo -n "*"
j=`expr $j + 1`
done

i=`expr $i + 1`
echo ""
done
echo ""
출력 :
Number : 10

*
**
***
****
*****
******
*******
********
*********
**********

[4] 별 출력
#!/bin/bash
echo ""
echo -n "Number : "
read su
echo ""

i=1
while [ $i -le $su ]
do
j=1
k=`expr $su - $i`
while [ $j -le $su ]
do
if [ $j -le $k ]
then
echo -n " "
else
echo -n "*"
fi
j=`expr $j + 1`
done

i=`expr $i + 1`
echo ""
done
echo ""

출력 :
Number : 10

*
**
***
****
*****
******
*******
********
*********
**********

[5] 별 출력
#!/bin/bash
echo ""
echo -n "Number : "
read su
echo ""

i=1
while [ $i -le $su ]
do
j=1
k=`expr $su - $i`
l=`expr $su + $i - 1`
while [ $j -le $l ]
do
if [ $j -le $k ]
then
echo -n " "
else
echo -n "*"
fi
j=`expr $j + 1`
done

i=`expr $i + 1`
echo ""
done
echo ""

출력 :
Number : 10

*
***
*****
*******
*********
***********
*************
***************
*****************
*******************

[6] 별 출력
#!/bin/bash
echo ""
echo -n "Number : "
read su
echo ""

i=1
while [ $i -le $su ]
do
j=1
k=`expr $su - $i + 1`
while [ $j -le $k ]
do
echo -n "*"
j=`expr $j + 1`
done

i=`expr $i + 1`
echo ""
done
echo ""

출력 :
Number : 10

**********
*********
********
*******
******
*****
****
***
**
*

[7] 별 출력
#!/bin/bash
echo ""
echo -n "Number : "
read su
echo ""

i=1
while [ $i -le $su ]
do
j=1
while [ $j -le $su ]
do
if [ $j -lt $i ]
then
echo -n " "
else
echo -n "*"
fi
j=`expr $j + 1`
done

i=`expr $i + 1`
echo ""
done
echo ""

출력 :
Number : 10

**********
*********
********
*******
******
*****
****
***
**
*

[8] 별 출력
#!/bin/bash
echo ""
echo -n "Number : "
read su
echo ""

i=1
while [ $i -le $su ]
do
j=1
k=`expr $su \* 2 - $i`
while [ $j -le $k ]
do
if [ $j -lt $i ]
then
echo -n " "
else
echo -n "*"
fi
j=`expr $j + 1`

done

i=`expr $i + 1`
echo ""
done
echo ""

출력 :
Number : 10

*******************
*****************
***************
*************
***********
*********
*******
*****
***
*

[9] 별 출력
#!/bin/bash
echo ""
echo -n "Number : "
read su
echo ""

i=1
while [ $i -le $su ]
do
j=1
k=`expr $su - $i`
l=`expr $su - 1 + $i`
while [ $j -le $l ]
do
if [ $j -le $k ]
then
echo -n " "
else
echo -n "*"
fi
j=`expr $j + 1`
done

i=`expr $i + 1`
echo ""
done

i=1
while [ $i -le $su ]
do
j=1
k=`expr $su \* 2 - $i - 1`
while [ $j -le $k ]
do
if [ $j -le $i ]
then
echo -n " "
else
echo -n "*"
fi
j=`expr $j + 1`

done

i=`expr $i + 1`
echo ""
done
echo ""

출력 :
Number : 10

*
***
*****
*******
*********
***********
*************
***************
*****************
*******************
*****************
***************
*************
***********
*********
*******
*****
***
*

2009. 5. 20.

grep, egrep, fgrep

grep, egrep, fgrep

grep(egrep, fgrep) [option] “pattern” filename



-i : 대소문자 구별을 하지 않는다.
-v : pattern 을 포함하지 않는 행만 출력한다.
-n : 행번호를 출력한다.
-l : 파일명만 출력한다.
-c : 패턴과 일치하는 라인의 갯수만 보여준다.



grep : 강력한 패턴 매칭 템플릿을 정의하기 위해 "정규 표현식"을 사용할 수 있다.
egrep [옵션] "패턴|패턴|..." [대상파일들] : 확장된 정규 표현식을 사용하며, 찾아낼 패턴을 여러개 지정할 수 있다. '|'기호는 불린 연산자 "OR"에 해당하므로, 정해진 패턴들에 포함되는 모든 라인을 보여준다.

fgrep [옵션] 패턴 [대상파일들] : 패턴과 정확히 일치하는 것만을 찾아 준다.



많은 시스템 관리 명령들과 파이프(pipe)를 이용해서 사용할 수 있다. 흔히 사용하는 것은 프로세스 확인이다.
$ ps aux | grep httpd
위와 같이 현재 시스템의 프로세스중 httpd 만 검색해 낸다.
만일 pipe 를 이용하여 검색할경우 검색 패턴이 한개 이상일 경우엔 egrep을 이용하여 검색할수 있다.

$ ps aux | egrep 'httpd|mysql'


$ grep -v "^[ ^I]*$" 파일명 //공백을 제거한 파일 내용 살펴보기
$ grep -v "^#*$" 파일명 //주석을 제거한 파일 내용 살펴보기

만일 현재 디렉토리와 그 하위 디렉토리까지 grep 패턴 검색을 하고자 할땐 find 명령을 이용하면 된다.
$ find . -exec grep "pattern" {} \;

2009. 4. 22.

VIM 이미 읽은 파일의 인코딩 변경하기

출처 : http://kldp.org/node/32987


VIM 이미 읽은 파일의 인코딩 변경하기 (charset encoding)
The image verification code you entered is incorrect.
kwon37xi 씀 (금, 2004/04/02 - 10:19am) 강좌
요즌 페도라에서 UTF-8 로 사용하다보니 한글 인코딩 문제에 자주 부딪힙니다.
특히 텍스트 파일 읽을 때 짜증이 이만저만이 아닙니다.

암튼, VIM 에서 파일을 읽어보니 문자 인코딩이 깨져 있을 때, 다음과 같이 하면 곧바로 인코딩을 바꿔서 화면에 표시합니다.

:e ++enc=euc-kr

이 상태에서... 파일의 인코딩을 바꿔서 저장하려면

:set fileencoding=utf-8

한뒤에 :w 해보세요. euc-kr 이던 파일이 utf-8 로 저장됩니다.

MS949 를 시도해봤는데 안되더군요. UHC 로 해야 MS-Windows 의 확장한글코드가 되는것 같습니다. - 맞는건가요? 확실치 않아서리...

리눅스 환경에서 한글 설정하는 방법

[Ctrl + Alt + T] 키를 눌러 터미널을 엽니다.


언어 환경설정 파일을 수정합니다.
참고1 : http://wiki.eeeuser.com/howto:changelanguage
참고2 : http://www.chitsol.com/455
참고3 : http://debianusers.org/DebianWiki/wiki.php/%C3%CA%BA%B8%B0%A3%B4%DC%C7%D1%B1%DB%B0%A1%C0%CC%B5%E5


로케일 설정을 담당하는 /etc/locale.gen 을 수정합니다.

sudo vi /etc/locale.gen
ko_KR.UTF-8 UTF-8

다음 명령을 실행합니다

sudo locale-gen
sudo update-locale LANG=ko_KR.UTF-8
-> 이 명령을 실행하면 /etc/default/locale 이라는 파일이 생성됩니다.


한글 입력기 설치를 위해 프로그램 설치 저장소를 추가합니다. 앞으로 다양한 응용프로그램 설치시에도 이용됩니다.

sudo vi /etc/apt/sources.list
deb http://xnv4.xandros.com/xs2.0/upkg-srv2 etch main contrib non-free
deb http://dccamirror.xandros.com/dccri/ dccri-3.0 main
deb http://www.geekconnection.org/ xandros4 main


아래의 명령을 순서대로 실행하여 입력기인 scim과 한글 폰트를 설치합니다.

wget http://download.tuxfamily.org/eeepcrepos/key.asc
sudo apt-key add key.asc
sudo apt-get update
sudo apt-get install scim scim-hangul scim-tables-ko ttf-alee ttf-unfonts

작업이 완료되면 재부팅을 합니다.



다중언어입력기 SCIM의 환경을 설정합니다.

오른쪽 아래의 트레이영역에서 입력기 아이콘(input method 라고 풍선도움말이 표시됨)에서 오른쪽 마우스를 클릭하여 SCIM 설정을 선택합니다.
[입력기엔진] -> [전체 설정] -> [설치된 입력기 서비스들:] 에서
[한국어] - [두벌식]과 [한자]만 선택하고(또는 각 개인이 사용하는 자판 형식) 나머지는 모두 선택을 해제 합니다.
설정을 적용하고 환경설정을 끝냅니다.

영어 입력 상태에서 한글 입력을 할려면 왼쪽 Ctrl + Space 키를 누르면 입력 상태가 전환됩니다. 반대의 경우도 같습니다.




** 콘솔에서 한글이 표시 되지 않고 영어가 표시되게 설정하는 방법입니다.
참고1 : http://kldp.org/node/78712
참고2 : http://safari.oreilly.com/0596526784/using_initialization_files_correctly

vi .bashrc (만약 전체 사용자에게 동일하기 적용할려면 /etc/bash.bashrc 파일을 맨 끝에 아래 내용을 추가하면 됩니다.)
export LANGUAGE="ko_KR:ko:en_GB:en"
export LC_MESSAGES="POSIX"
export LC_ALL=""

locate 명령으로 설정된 값을 확인합니다.

LANG=ko_KR.UTF-8
LC_CTYPE="ko_KR.UTF-8"
LC_NUMERIC="ko_KR.UTF-8"
LC_TIME="ko_KR.UTF-8"
LC_COLLATE="ko_KR.UTF-8"
LC_MONETARY="ko_KR.UTF-8"
LC_MESSAGES=POSIX
LC_PAPER="ko_KR.UTF-8"
LC_NAME="ko_KR.UTF-8"
LC_ADDRESS="ko_KR.UTF-8"
LC_TELEPHONE="ko_KR.UTF-8"
LC_MEASUREMENT="ko_KR.UTF-8"
LC_IDENTIFICATION="ko_KR.UTF-8"
LC_ALL=

공유기를 사용할때 IP확인

http://www.whatismyip.com/에 접속하면 접속한 PC의 실제 IP를 표시해준다.

VNC 서버 설정

1. VNC 서버 설치



yum install vnc-server

service vncserver start





2. 설정

/etc/sysconfig/vncserver



* root로 원격에서 접속가능하게 설정하기

VNCSERVERS="2:root"
VNCSERVERARGS[2]="-geometry 800x600 -nolisten tcp -nohttpd"






* 패스워드 설정

vncpasswd 명령을 실행





* 그놈으로 VNC 원격 열기

~/.vnc/xstartup 수정



#!/bin/sh

# Uncomment the following two lines for normal desktop:
# unset SESSION_MANAGER
# exec /etc/X11/xinit/xinitrc

[ -x /etc/vnc/xstartup ] && exec /etc/vnc/xstartup
[ -r $HOME/.Xresources ] && xrdb $HOME/.Xresources
xsetroot -solid grey
vncconfig -iconic &
#xterm -geometry 80x24+10+10 -ls -title "$VNCDESKTOP Desktop" &
#twm &

export GTK_IM_MODULE=scim <- 한글 입력을 위해
gnome-session & <- 그놈 데스크탑 실행





3. 클라이언트 접속

UltraVNC를 설치하여 UltraVNC Viewer 를 실행

VNC Server : 에 www.junix.pe.kr:2 를 입력하고 vncpasswd에서 지정한 암호 입력

logwatch 7.2.1 on fc5

1. 설치
yum install logwatch


2. 설정
vi /etc/logwatch/conf/logwatch.conf

########################################################
# This was written and is maintained by:
# Kirk Bauer
#
# Please send all comments, suggestions, bug reports,
# etc, to kirk@kaybee.org.
#
########################################################

# NOTE:
# All these options are the defaults if you run logwatch with no
# command-line arguments. You can override all of these on the
# command-line.

# You can put comments anywhere you want to. They are effective for the
# rest of the line.

# this is in the format of = . Whitespace at the beginning
# and end of the lines is removed. Whitespace before and after the = sign
# is removed. Everything is case *insensitive*.

# Yes = True = On = 1
# No = False = Off = 0

# Default Log Directory
# All log-files are assumed to be given relative to this directory.
LogDir = /var/log

# You can override the default temp directory (/tmp) here
TmpDir = /var/cache/logwatch

# Default person to mail reports to. Can be a local account or a
# complete email address.
MailTo = jongjun 보고서를 받을 메일 계정
# Default person to mail reports from. Can be a local account or a
# complete email address.
MailFrom = Logwatch

# If set to 'Yes', the report will be sent to stdout instead of being
# mailed to above person.
Print = Yes

# if set, the results will be saved in instead of mailed
# or displayed.
#Save = /tmp/logwatch

# Use archives? If set to 'Yes', the archives of logfiles
# (i.e. /var/log/messages.1 or /var/log/messages.1.gz) will
# be searched in addition to the /var/log/messages file.
# This usually will not do much if your range is set to just
# 'Yesterday' or 'Today'... it is probably best used with
# Archives = Yes
# Range = All

# The default time range for the report...
# The current choices are All, Today, Yesterday
Range = yesterday

# The default detail level for the report.
# This can either be Low, Med, High or a number.
# Low = 0
# Med = 5
# High = 10
Detail = Low


# The 'Service' option expects either the name of a filter
# (in /usr/share/logwatch/scripts/services/*) or 'All'.
# The default service(s) to report on. This should be left as All for
# most people.
Service = All
# You can also disable certain services (when specifying all)
Service = "-zz-network" # Prevents execution of zz-network service, which
# prints useful network configuration info.
# If you only cared about FTP messages, you could use these 2 lines
# instead of the above:
#Service = ftpd-messages # Processes ftpd messages in /var/log/messages
#Service = ftpd-xferlog # Processes ftpd messages in /var/log/xferlog
# Maybe you only wanted reports on PAM messages, then you would use:
#Service = pam_pwdb # PAM_pwdb messages - usually quite a bit
#Service = pam # General PAM messages... usually not many

# You can also choose to use the 'LogFile' option. This will cause
# logwatch to only analyze that one logfile.. for example:
#LogFile = messages
# will process /var/log/messages. This will run all the filters that
# process that logfile. This option is probably not too useful to
# most people. Setting 'Service' to 'All' above analyizes all LogFiles
# anyways...

#
# By default we assume that all Unix systems have sendmail or a sendmail-like system.
# The mailer code Prints a header with To: From: and Subject:.
# At this point you can change the mailer to any thing else that can handle that output
# stream. TODO test variables in the mailer string to see if the To/From/Subject can be set
# From here with out breaking anything. This would allow mail/mailx/nail etc..... -mgt
mailer = "sendmail -t"

#
# With this option set to 'Yes', only log entries for this particular host
# (as returned by 'hostname' command) will be processed. The hostname
# can also be overridden on the commandline (with --hostname option). This
# can allow a log host to process only its own logs, or Logwatch can be
# run once per host included in the logfiles.
#
# The default is to report on all log entries, regardless of its source host.
# Note that some logfiles do not include host information and will not be
# influenced by this setting.
#
#HostLimit = Yes

# vi: shiftwidth=3 tabstop=3 et


3. 보고서 작성
/usr/sbin/logwatch 실행

4. 확인
Logwatch로 부터 jongjun으로 온 메일 확인

swatch 사용

로그 감시툴을 swatch를 사용해 보았다.

yum install swatch


테스트용 설정파일 설정
vi ~/.swatchrc
watchfor /.*/
echo
mail=jongjun@junix.pe.kr, subject=----PLEASE INVESTIGATE SSH ACCESS----


실행
swatch --config-file=/root/.swatchrc --tail-file=/var/log/secure


동작 확인
ssh를 하나 더 열어서 로그인 실패 상황을 만들고 실패에 대한 보고 메일이 왔는지 확인한다.
제목: ----PLEASE INVESTIGATE SSH ACCESS----
내용:
Aug 29 23:44:45 junix sshd[1431]: Invalid user hjhkj from 222.117.139.98


man swatch를 참조하여 추가 설정한다.
추가할 내용 : 오류별로 구분, 메일 통보 시간 조절, 다양한 로그 감시

서버 모니터링 도구들

phpsysinfo - 웹에서 시스템 자원 모니터링
http://phpsysinfo.sourceforge.net/

iptables stat
http://www.phildev.net/iptstate/

htop
http://htop.sourceforge.net/

apache top
http://www.fr3nd.net/projects/apache-top/

iptraf
http://iptraf.seul.org/

에러 로그를 저장하는 방법

startx >& /tmp/x.log

또는

startx > /tmp/x.log 2>&1

로그확인은 cat /tmp/x.log
[출처] 에러 로그를 저장하는 방법|작성자 쭌

호주 퍼스 가기위한 준비

ㅇ 여권
경기도 여권민원실 : http://minwon.gyeonggi.go.kr/jsp/func/menu/user/view/AAVframe.jsp


ㅇ 항공권 싸게 알아보기
투어익스프레스 : http://www.tourexpress.com/
투어캐빈 : http://www.tourcabin.com/
** 주의사항 : 편도가 왕복의 1/2 가격은 아니라는 것. 1년 일정이면 왕복이 쌀수 있음



ㅇ 퍼스 정보 제공(여행, 숙박, 교통 등등)
Virtual Tourist :


http://www.virtualtourist.com/travel/Australia_and_Oceania/Australia/State_of_Western_Australia/Perth-1871231/TravelGuide-Perth.html
LOOK AT PERTH : http://www.lookatwa.com.au/index.php
Beautiful Perth : http://www.beautifulperth.com/
Perth Portal & Web Site Directory : http://www.inperth.com.au/perth.shtml
Perth Local Directory : http://www.streetsofperth.com.au/
Perth Tourist Centre Online : http://www.perthtouristcentre.com.au
Your Guide to Perth and Fremantle : http://www.countrywide.com.au/
What's On in Perth, Fremantle and Surrounds : http://www.whatson.com.au
http://www.totaltravel.com.au/travel/wa/pertharea/perth




ㅇ 숙소 알아보기 (백패커, 홈스테이는 현지 어학원 또는 영어학교를 통해서)

호텔예약 TravelStar : http://www.travelstar.co.kr/

- 한국 홈페이지. 더블룸 5일 숙박이 보통 50만원 한다.
YHA AUSTRALIA : http://www.yha.com.au
Hostel Times : http://www.hosteltimes.com/Kr/index.asp

VIP Backpackers : http://www.vipbackpackers.com/
hostelworld : http://www.hostelworld.com/
퍼스 정보 : http://www.totaltravel.com.au/travel/wa/pertharea/perth/directory/accommodation


괜찮아 보이는 곳

http://www.billabongresort.com.au

- 아침제공, 공항 픽업서비스 제공

Comfort Hostel : http://www.comfortbackpackers.com/
- 아침제공, 3일이상이면 공항 픽업서비스 제공

http://www.townsend.wa.edu.au/index.php
http://www.ymcajewellhouse.com/




ㅇ 여행용품 한국에서 미리준비하기

http://www.withtour.co.kr/ (기내용 가방 괜찮아보임)
http://www.travelmate.co.kr
http://www.safetour.co.kr
http://www.tntmall.co.kr/
http://www.travelwiz.co.kr/
http://www.back-packer.co.kr/




ㅇ 퍼스 영어 학교
* Western Australian Private Education and Training Industry Association Members : http://www.wapetia.org.au/members.html
* ENGLISH AUSTRALIA : http://www.englishaustralia.com.au
* http://studylink.com/index.html
셋다 무슨 영어 교육협회인듯 한데..퍼스 학교 리스트를 알수 있다.





PHOENIX Academy : http://www.phoenixacademy.com.au/
Embassy CES : http://www.embassyces.com/english/
Australian College of English(ACE) : http://www.ace.edu.au/tperth.htm
Milner International College of English : http://www.milner.wa.edu.au/
P.I.C.E Perth International College of English : http://www.pice.com.au/
Murdoch Language Institute : http://www.alexander.wa.edu.au/mli.htm
Cambridge International College Perth : http://www.cambridgecolleges.com/
St Marks International College(GEOS Perth) : http://www.stmarksperth.com.au
Education & Training International (ETI) : http://www.eti.wa.edu.au/
Eurocentres schools :

http://www.eurocentres.com/en/language_schools/Perth/General,8,14,x38,1.html
Centre for English Language Teaching (CELT) : http://www.celt.uwa.edu.au/
Perth Institute of Business and Technology (PIBT) : http://www.pibt.wa.edu.au




ㅇ 퍼스영어학교 소개 동영상(모 유학원서 제작함)
http://www.tagstory.com/video/video_tag.aspx?tag=%C6%DB%BD%BA




ㅇ 호주 일자리 알아보기
JOB SEARCH : http://jobsearch.gov.au

Go West Now - WA's Working : http://www.gowestnow.com/

농장 정보(과일따기) : http://www.tourinfocentre.com.au/work/work6.htm




ㅇ 퍼스 교통
기차 : http://www.railpage.org.au/railmaps/

버스 : http://www.transperth.wa.gov.au

공항 : http://www1.perthairport.net.au/


택시(택시는 이회사 말고 하나 더 있음) : http://www.swantaxis.com.au/

호주 항공사 : http://www.virginblue.com.au/




ㅇ 퍼스 날씨 : http://weatherreports.com/Perth,_Australia?units=c




ㅇ 기타

구글 어스 퍼스 지도 :

http://www.worldmapfinder.com/Map_EarthMap.php?ID=/Kr/Oceania/Australia/Perth

호주 퍼스 정보 :

http://www.hiviva.net/HTML/Travelinfo/travelinfo_04.htm?SELECT_TRAVEL_DESTINATION_INFO_AREA_UID=15
ATM기기 사용방법 :

http://www.hanabank.com/online/contents/card/guide/guid_04/guid_0401/1451_index.jsp

학생전문여행사 : http://kises.co.kr/

신한은행 제공 호주 뉴스 :
http://shinhan.eduhouse.net/common/news/news_list.asp?sel_nation=4
호주 CVA & 여행 준비하기 : http://blog.daum.net/iboyoung/5595490
[출처] 호주 퍼스에 가기 위한 북마크|작성자 쭌

2009. 4. 7.

[리눅스] F T P 전송

(1) 먼저 파일을 받는 client 에 전송할 데이터의 directory와 동일한 구조의 directory를 생성

#Source Server] find /home/user -type d -depth -print > dir.list

dir.list 파일을 target Server로 옮김

[주의]여기서 path는 절대 path를 생성해야 해야 함

#Target Server] cat dir.list | awk '{ print " mkdir -p -mode 755 " $1 }' | sh -x

[참고] Permission은 구지 명시하지 않아도 되며,

Source Server와 동일한 mode로 만들고자 하면,

Script하나 더 만들면 됨



(2) FTP로 모든 파일을 전송하는 다음의 script를 생성하고 동작시키면 됨

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

#!/bin/sh
while read line
do
cd $line
pwd
ftp -n 211.45.5.251 << +
prompt off
user root staff0
cd $line
pwd
mput *
+
done < dir.list

수행결과를 log 파일로 남길려면
# Source Server] ftp.sh > log
실행하는 위치는 아무것에나 상관없음. dir.list 에 디렉토리 경로가 절대 경로이므로

2009. 4. 6.

리눅스 रूट 패스워드

리눅스에는 시스템의 사용 모드를 나타내는 ‘runlevel’이라는 것이 있는데
============================================
0 - 시스템 종료
1 - Single-User 모드
2 - Multi-User 모드(네트워크 사용 불가)
3 - Multi-User 모드
5 - Multi-User 모드(그래픽 화면 로그인)
6 - 시스템 재시작 (멀티유저모드)
============================================

solaris 의경우 재시작할때 shutdown -r0 -y0 -i6
싱글유저로 갈때는 shutdown -r0 -y0 -s

HP의 경우 일단 OK 모드(대기모드?)
에서 init 명령어나 shutdown 명령어로 이동을 한다

Linux (fedora, redhat) 에서는
shutdown -r 재기동
shutdown -s 싱글유저

싱글유저 모드란 별도의 로그인 과정 없이 root 계정으로 시스템로긴하는 모드이다.
(설정에따라서 로그인하는 경우가 있음)
이 모드로 부팅하면 root 권한으로 로긴을 하는 것이기때문에 passwd 명령어로
쉽게 root 패스워드를 변경할 수 있다.

부팅을 하기전에 부트로더에서 부팅 파라미터를 수정해서 싱글유저로 들어갈수가 있는데
1. GRUB이 떠서 디폴트로 지정된 OS로 부팅하려고 할 때, 엔터를 쳐서 선택 메뉴로 들어간다.

2. 부팅하고자 하는 것을 선택하고 e를 눌러 Edit 모드로 들어간다. 시스템마다 차이는 있겠지만 보통 다음과 같은 형식으로 나올 것이다.

============================================
root (hd0,0)
kernel /boot/vmlinuz-2.6.14-41hs ro root=/dev/hda2
initrd /boot/initrd-2.6.14-41hs.img
============================================

3. kernel이 있는 줄을 선택하고 다시 e를 누른다. 그럼 다음과 같이 부팅 파라미터를 수정할 수 있는데 끝에 1 또는 single을 입력하고 엔터를 누른다.

=============================================
grub edit> kernel /boot/vmlinuz-2.6.14-41hs ro root=/dev/hda2 1
=============================================

4. 다시 2번의 화면으로 돌아오게 되는데 b를 누르면 부팅을 시작한다.

5. 별도의 로그인 화면이 뜨지 않고 다음과 같이 프롬프트가 뜰 것이다. 이제 root 패스워드를 원하는 것으로 바꿀 수 있다.

===============================================
sh-3.00# passwd
Changing password for user root.
New UNIX password: _
================================================

6. 시스템을 재부팅한다.

=================================================
sh-3.00# reboot
=================================================

이상 GRUB를 사용한 싱글유저로긴 방법을 알아보았는데
실제 업무에서는 이 방법을 쓰지 않는다.
게다가 서버관리자가 루트패쓰워드를 해킹당하거나, 뭐였는지
기억을 못한다는건 있어서는 않되는일이며,
다른 관리자에게 물어보는것은 더더욱 않되는 일이다

2009. 4. 3.

방화벽 스크립트 사용하기

FD 코리아에서는 외부 방화벽 이외에 OS내에 iptables 가 동작하도록 스크립트를 기본적으로 제공해 드리고 있습니다.
방화벽 스크립트의 위치는 /etc/rc.d/ 디렉토리입니다.

[root@server21010910231 root]# cd /etc/rc.d/
[root@server21010910231 rc.d]# ls
init.d rc rc0.d rc1.d rc2.d rc3.d rc4.d rc5.d rc6.d rc.firewall rc.local rc.sysinit
[root@server21010910231 rc.d]#

/etc/rc.d/ 디렉토리 안에서 보시면 rc.firewall 파일을 확인 하실 수 있습니다. rc.firewall 스크립트는 부팅시 자동으로 동작 하도록 아래와 같은 내용이 /etc/rc.local 파일에 등록 되어 있습니다.

if [ -e /etc/rc.d/rc.firewall ];then
sh /etc/rc.d/rc.firewall
fi

스크립트 상에서는 기본적으로 20, 21, 22, 25, 53, 80, 110, 143, 443, 953, 3306 포트가 열려 있으며, 나머지 포트는 막혀 있습니다. rc.firewall 스크립트상에서 아래 부분이 해당 포트들을 허용하도록 설정 한 부분입니다.

$IPTABLES -A INPUT -p tcp --dport 20:22 -m state --state NEW,ESTABLISHED -j ACCEPT
$IPTABLES -A INPUT -p tcp --dport 25 -m state --state NEW,ESTABLISHED -j ACCEPT
$IPTABLES -A INPUT -p tcp --dport 53 -m state --state NEW,ESTABLISHED -j ACCEPT
$IPTABLES -A INPUT -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT
$IPTABLES -A INPUT -p tcp --dport 110 -m state --state NEW,ESTABLISHED -j ACCEPT
$IPTABLES -A INPUT -p tcp --dport 143 -m state --state NEW,ESTABLISHED -j ACCEPT
$IPTABLES -A INPUT -p tcp --dport 443 -m state --state NEW,ESTABLISHED -j ACCEPT
$IPTABLES -A INPUT -p tcp --dport 953 -m state --state NEW,ESTABLISHED -j ACCEPT
$IPTABLES -A INPUT -p tcp --dport 3306 -m state --state NEW,ESTABLISHED -j ACCEPT

열려포트를 막기를 원하신다면, 해당 포트에 대한 라인을 삭제하시거나 주석(#) 처리 하시면 됩니다.
그리고 특정 아이피 주소에서만 포트 접속이 가능하게 설정을 하시려면 해당 라인에 --source 아이피를 입력하시면 됩니다. 아래의 예는 210.109.102.31번의 아이피 에서만 ssh(22번 포트)로 접속 할수 있게 수정 한 것입니다.

$IPTABLES -A INPUT -p tcp --source 210.109.102.31 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT

추가로 다른 포트를 허용하려면, 위와 같은 라인에 허용할 포트에 대한 스크립트 한줄만 추가 하면 됩니다. 아래 스크립트는 8080포트 허용을 위한 스크립트 입니다.
$IPTABLES -A INPUT -p tcp --dport 8080 -m state --state NEW,ESTABLISHED -j ACCEPT

스크립트 수정이 완료되셨다면, /etc/rc.d/rc.firewall 명령을 실행 시키시면 iptables 룰셋이 적용되게 됩니다.
적용된 룰셋을 확인 하시려면 아래와 같이 iptables -L 명령으로 확인 하실수 있습니다.

[root@server21010910231 rc.d]# iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT all -- anywhere anywhere
DROP all -- anywhere anywhere state INVALID
ACCEPT tcp -- anywhere anywhere state RELATED,ESTABLISHED
ACCEPT tcp -- anywhere anywhere tcp dpts:ftp-data:ssh state NEW,ESTABLISHED
ACCEPT tcp -- anywhere anywhere tcp dpt:smtp state NEW,ESTABLISHED
ACCEPT tcp -- anywhere anywhere tcp dpt:domain state NEW,ESTABLISHED
ACCEPT tcp -- anywhere anywhere tcp dpt:http state NEW,ESTABLISHED
ACCEPT tcp -- anywhere anywhere tcp dpt:pop3 state NEW,ESTABLISHED
ACCEPT tcp -- anywhere anywhere tcp dpt:imap state NEW,ESTABLISHED
ACCEPT tcp -- anywhere anywhere tcp dpt:https state NEW,ESTABLISHED
ACCEPT tcp -- anywhere anywhere tcp dpt:rndc state NEW,ESTABLISHED
ACCEPT tcp -- anywhere anywhere tcp dpt:mysql state NEW,ESTABLISHED
DROP tcp -- anywhere anywhere

Chain FORWARD (policy ACCEPT)
target prot opt source destination

Chain OUTPUT (policy ACCEPT)
target prot opt source destination
ACCEPT all -- anywhere anywhere
DROP all -- anywhere anywhere state INVALID
DROP tcp -- anywhere anywhere tcp dpts:6666:ircd
[root@server21010910231 rc.d]#

그리고 아래와 같이 iptables -F 명령을 입력하시면 적용된 룰셋이 삭제 되며, 이경우 서버를 재부팅 하거나, /etc/rc.d/rc.firewall 명령을 재실행 하기 전까지 룰셋이 적용되지 않게 됩니다.

[root@server21010910231 rc.d]# iptables -F
[root@server21010910231 rc.d]# 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
[root@server21010910231 rc.d]#

디렉토리 크기 알아내기

리눅스/유닉스에서 디렉토리내의 파일들의 총 크기를 알고 싶은 경우 du 명령어를 사용하면 된다. du 명령의 사용법은 아래와 같다.



(1) 파일의 크기를 byte 로 계산하여서 보여준다.

# du -ab



(2) 파일의 크기를 사람이 보기 편하도록 보여준다.
# du -abh



(3) 현재의 디렉토리의 총 크기만 보고 싶으면 아래와 같이 실행한다.

# du -abch | grep -v "./"



# du --max-depth=1 -h .

특정포트 죽이기

유닉스/리눅스 계열에서 특정 포트를 사용하는 프로세스 죽이기



아.. 힘겹게 알아냈는데 결국엔 삽질이 되었고나.

아까워서라도 적어놔야지.. (나중에 써먹을때가 있을테야 ㅎㅎ)



kill `netstat -lnp | awk '{print $4, $7}' | grep $PORT | awk '{print $2}' | awk -F/ '{print $1}'`

TCPDUMP

TCPDUMP User Guide


Date : January 1999


written by Kwon, YongChul

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

-. 이 문서의 저작권은 저자(권용철:godslord@sparcs.kaist.ac.kr)에게 있습니다. 본문의 무단 인용, 복사는 저자와의 협의 없이 절대 불가능합니다.



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

Table of Contents


이 문서를 보기 전에 알아야 할 사전 지식

Tcpdump란?

Tcpdump의 패키지 구하기

Tcpdump의 설치

Tcpdump Source의 간략한 설명

Tcpdump의 옵션들

조건식
Tcpdump의 사용 예제들

Tcpdump의 평가

References



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

이 문서를 보기 전에 알아야 할 사전 지식
이 문서는 네트워크의 패킷들을 잡아내는 Tcpdump라는 프로그램에 대해서 설명하고 있다. 프로그램의 특성상, 네트워크에 관련된 많은 용어들과 특히 TCP/IP에 대한 내용 이 많이 나온다. 따라서 보다 잘 이해하기 위해서는 네트워크 설비 자료나, 네트워크 프로그래밍 가이드, 혹은 네트워크 프로토콜(TCP/IP)에 관련된 책들을 참조하는 것이 좋을 것이다.




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

Tcpdump란?
Tcpdump는 주어진 조건식을 만족하는 네트워크 인터페이스를 거치는 패킷들의 헤더들 을 출력해 주는 프로그램이다. 프로그램의 특성상, 네트워크 인터페이스를 아주 심도 있게 사용하기 때문에, 실행하는 사람은 반드시 네트워크 인터페이스에 대한 읽기 권 한이 있어야만 한다.
OS dependent)
위에서 말하는 읽기 권한을 가지고 있어야 하는 파일, 혹은 Tcpdump의 퍼미션 이다.


SunOS : /dev/nit, /dev/bpf*

Solaris(SunOS 5.x) : /dev/le 등

HP-UX & IRIX & Linux : root에서 실행하거나, root로 setuid를 설정해야 함

Ultrix & Digital UNIX : root가 pfconfig를 이용하여, promiscuous-mode를 가능하게 설정하면 어떤 유저라도 사용할 수 있다.

BSD : /dev/bpf*


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

Tcpdump의 패키지 구하기
Tcpdump는 ftp://ftp.ee.lbl.gov/tcpdump.tar.Z에서 최신 버전을 구할 수 있다. 유명 한 프로그램이기 때문에, 시스템소프트웨어를 패키지형태로 제공해 주는 OS들의 경우 Vendor에서 패키징된(컴파일된) 버전으로도 구할 수 있을 것이다.




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

Tcpdump의 설치
Tcpdump는 libpcap(Protocol Capture Library)라는 것을 사용한다. 이 라이브러리는 Platform에 상관없이 동일한 방법으로 사용자 레벨에서 패킷들을 캡춰할 수 있게 해 준다. 따라서 이 라이브러리가 없다면, ftp://ftp.ee.lbl.gov/libpcap.tar.Z에서 구하 여 설치하도록 한다.

ANSI C 컴파일러는 아마 대부분의 시스템에서 구비하고 있을 것이다. 만약 없다면 ftp://prep.ai.mit.edu/pub/gnu/gcc.tar.gz를 받아서 설치하기 바란다.

libpcap라이브러리가 완벽하게 설치되었다는 가정하에서 다음의 절차에 따라 설치를 시작한다.


Makefile.in의 BINDEST와 MANDEST 항목에 각각, tcpdump 실행파일과 메뉴얼 페이 지가 설치될 디렉토리들을 입력해 준다.
Tcpdump 패키지와 함께 제공되는 ./configure 스크립트를 실행시킨다. 이 스크립트는 현재 시스템의 환경들을 검사하고 이에 맞추어서 Makefile을 생성해 준다.
make를 실행한다.
컴파일이 다 됐으면, make install을 수행하여 실행파일을 설치하고, make install-man을 실행하여 메뉴얼 페이지도 설치한다.
tcpdump의 퍼미션이 제대로 되었는지를 검사한다. setgid가 설정되어 있기 때문에, 원하지 않는 사람이 실행하게 된다면 위험하다.
위에서 설명한 절차를 그대로 옮겨 본다.
# vi Makefile.in
# ./configure
# make
# make install
# make install-man

OS dependent)

DEC/OSF and BSD/386, etc : tcpdump가 OS와 함께 제공되는 경우가 있다. 이럴 경우 tcpdump를 업그레이드 하기 전에 반드시 기존의 tcpdump를 백업해 두도록 하자.

Linux : libpcap 라이브러리는 2.0.25 커널에서 테스트 됐다. 2.0.x 대 커널 에서 25이하의 버전에서는 실행이 아마 가능할 것이다. 그러나 1.x대의 커널에서는 동작 여부가 입증되지 않았으므로 주의해야 한다.

OSF 4 : OSF4에서는 stack C 컴파일러에 치명적인 버그가 있다. 이 버그를 피해가려면, ./configure를 실행한 후 컴파일 하기 전에 Makefile에서 다음의 문장을 삭제한 후 컴파일해 주면 된다.

-DETHER_HEADER_HAS_EA=1 -DETHER_ARP_HAS_EA=1



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

Tcpdump Source의 간략한 설명



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

Tcpdump의 옵션들

-a : Network & Broadcast 주소들을 이름들로 바꾼다.

-c Number : 제시된 수의 패킷을 받은 후 종료한다.

-d : comile된 packet-matching code를 사람이 읽을 수 있도록 바꾸어 표준 출력으로 출력하고, 종료한다.

-dd : packet-matching code를 C program의 일부로 출력한다.

-ddd : packet-matching code를 숫자로 출력한다.

-e : 출력되는 각각의 행에 대해서 link-level 헤더를 출력한다.

-f : 외부의 internet address를 가급적 심볼로 출력한다(Sun의 yp server와의 사용은 가급적 피하자).

-F file : filter 표현의 입력으로 파일을 받아들인다. 커맨드라인에 주어진 추가의 표현들은 모두 무시된다.

-i device : 어느 인터페이스를 경유하는 패킷들을 잡을지 지정한다. 지저되지 않으면 시스템의 인터페이스 리스트를 뒤져서 가장 낮은 번호를 가진 인터페이스를 선택한다(이 때 loopback은 제외된다).

-l : 표준 출력으로 나가는 데이터들을 line buffering한다. 다른 프로그램에서 tcpdump로부터 데이터를 받고자 할 때, 유용하다.

-n : 모든 주소들을 번역하지 않는다(port,host address 등등)

-N : 호스트 이름을 출력할 때, 도메인을 찍지 않는다.

-O : packet-matching code optimizer를 실행하지 않는다. 이 옵션은 optimizer에 있는 버그를 찾을 때나 쓰인다.

-p : 인터페이스를 promiscuous mode로 두지 않는다.

-q : 프로토콜에 대한 정보를 덜 출력한다. 따라서 출력되는 라인이 좀 더 짧아진다.

-r file : 패킷들을 '-w'옵션으로 만들어진 파일로 부터 읽어 들인다. 파일에 "-" 가 사용되면 표준 입력을 통해서 받아들인다.

-s length: 패킷들로부터 추출하는 샘플을 default값인 68Byte외의 값으로 설정할 때 사용한다(SunOS의 NIT에서는 최소가 96Byte이다). 68Byte는 IP,ICMP, TCP, UDP등에 적절한 값이지만 Name Server나 NFS 패킷들의 경우에는 프로토콜의 정보들을 Truncation할 우려가 있다. 이 옵션을 수정할 때는 신중해야만 한다. 이유는 샘플 사이즈를 크게 잡으면 곧 패킷 하나하나를 처리하는데 시간이 더 걸릴 뿐만아니라 패킷 버퍼의 사이즈도 자연히 작아지게 되어 손실되는 패킷들이 발생할 수 있기 때문이다. 또, 작게 잡으면 그만큼의 정보를 잃게되는 것이다. 따라서 가급적 캡춰하고자 하는 프로토콜의 헤더 사이즈에 가깝게 잡아주어야 한다.

-T type : 조건식에 의해 선택된 패킷들을 명시된 형식으로 표시한다. type에는 다음과 같은 것들이 올 수 있다. rpc(Remote Procedure Call), rtp(Real-Time Applications protocol), rtcp(Real-Time Application control protocal), vat(Visual Audio Tool), wb(distributed White Board)

-S : TCP sequence번호를 상대적인 번호가 아닌 절대적인 번호로 출력한다.

-t : 출력되는 각각의 라인에 시간을 출력하지 않는다.

-tt : 출력되는 각각의 라인에 형식이 없는 시간들을 출력한다.

-v : 좀 더 많은 정보들을 출력한다.

-vv : '-v'보다 좀 더 많은 정보들을 출력한다.

-w : 캡춰한 패킷들을 분석해서 출력하는 대신에 그대로 파일에 저장한다.

-x : 각각의 패킷을 헥사코드로 출력한다.

조건식(expression)

옵션의 제일 마지막인 조건식은 어떤 패킷들을 출력할지를 선택하는데 쓰인다. 조건식이 주어지지 않는 다면 모든 패킷들이 그 대상이 될 것이다. 일단 주어지면, 아무리 패킷들이 많아도 조 건식에 부합하는 패킷만을 출력한다.

조건식들은 하나 또는 몇 개의 primitive들로 구성되어 있다. primitive들은 보통 하나 혹은 몇개의 qualifier들 다음에 오는 하나의 값으로 이루어진다. Qualifier들은 모두 3 종류이며 다음과 같다.


type : 주어진 값의 종류가 무엇인지를 나타낸다. 가능한 type들은 'host', 'net', 'port'가 있다. type이 없는 값들은 type을 host라 가정한다.

dir : id로 부터의 어떤 특정한 전송 방향을 나타낸다. 가능한 방향은 'src', 'dst', 'src or dst', 'src and dst'이다. 만약 방향이 정해지지 않았다면, src or dst라 가정한다. "For `null' link layers (i.e. point to point protocols such as slip) the inb ound and out bound qualifiers can be used to specify a desired direction."

proto : 매칭을 특정 프로토콜에 한해서 수행한다. 가능한 프로토콜들은 ether, fddi, ip, arp, rarp, decnet, lat, sca, moprc, mopdl, tcp, udp이다. 만약 프로토콜이 명시되지 않았다면, 해당하는 값의 type에 관련된 모든 프로토콜들이 그 대상이 된다.

이 밖에도 위의 패턴을 따르지 않는 Primitive들이 존재한다(gateway, broadcst, less, greater, 산술식).

좀 더 정교한 조건식들을 사용하려면, 'and(&&)', 'or(||)', 'not(!)'들을 사용하여 여러 primitive들을 연결하면 된다. 같은 표현들은 생략될 수 있다.

사용 가능한 Primitive들


dst host HOST
packet의 IP destination 항목이 HOST일때 참이 된다.
src host HOST
packet의 IP source 항목이 HOST일때 참이 된다.
host HOST
IP source, IP destination 항목 중 어느 하나라도 HOST이면 참이다.
ether dst ehost
ethernet destination 주소가 ehost일 때 참이다.
ether src ehost
ethernet source 주소가 ehost일 때 참이다.
ether host ehost
ethernet source, destination 항목들 중 어느 하나라도 ehost이면 참이다.
gateway host
패킷이 host를 게이트웨이로 사용하면 참이다. 이 말의 의미는 ethernet sour ce나 destination 항목은 host이지만, IP source와 destination은 host가 아닐 때를 말한다.
dst net NET
패킷의 IP destination 주소가 NET의 network number를 가지고 있을 때 참이 다.
src net NET
패킷의 IP source 주소가 NET의 network number를 가지고 있을 때 참이다.
net NET
패킷의 IP source 주소 혹은 destination 주소가 NET의 network number를 가 지고 있을 때 참이다.
net netmask mask
IP 어드레스가 지정된 netmask를 통해서 net과 매칭되면 참이다.
net net/len
IP 어드레스가 netmask와 len 비트만큼 매치되면 참이다.
dst port PORT
패킷이 ip/tcp, ip/udp 프로토콜의 패킷이고 destination port의 값이 PORT일 때 참이다. port는 /etc/services에 명시된 이름일 수도 있고 그냥 숫자일 수도 있다. 만약 이름이 사용됐다면 port 번호와 프로토콜이 같이 체크될 것이다. 만약 숫자나 불 확실한 이름이 사용됐을 경우에는 port 번호만이 체크될 것이다.
src port PORT
패킷의 source port의 값으로 PORT를 가지면 참이다.
port PORT
패킷의 source, destination port 중에 하나라도 PORT이면 참이다.
less length
패킷이 length보다 짧거나 같으면 참이다.(len <= length)
greater length
패킷이 length보다 짧거나 같으면 참이다.(len >= length)
ip proto protocol
패킷이 지정된 종류의 프로토콜의 ip패킷이면 참이다. Protocol은 icmp, igrp, udp, nd, tcp 중의 하나 혹은 몇 개가 될 수 있다. 주의할 점은 tcp, udp, icmp들은 '\'로 escape되어야 한다.
ehter broadcast
패킷이 ethernet broadcast 패킷이라면 참이다. ehter는 생략 가능하다.
ip broadcast
패킷이 IP broadcast 패킷이라면 참이다.
ether multicast
패킷이 IP multicast 패킷이라면 참이다.
ether proto protocol
패킷이 ether type의 protocol이라면 참이다. protocol은 ip, arp, rarp 중에 하나 혹은 몇개가 될 수 있다. ip proto protocol에서와 마찬가지로 ip, arp, rarp는 escape 되어야 한다.
decnet src host
만약 DECNET의 source address가 host이면 참이다. 이 어드레스는 '10.123'이 나 DECNET의 host name일 수 있다. DECNET host name은 DECNET에서 돌아가도록 설정된 Ultrix 시스템에서만 사용 가능하다.
decnet dst host
DECNET destination address가 host이면 참이다.
decnet host HOST
DECNET source, destination address중의 하나라도 HOST이면 참이다.
ip, arp, rarp, decnet
ether proto [ip|arp|rarp|decnet]의 약어
lat, moprc, mopdl
ether proto [lat|moprc|mopdl]의 약어
tcp, udp, icmp
ip proto [tcp|udp|icmp]의 약어
expr relop expr

EXPR
proto [expr:size]의 형식을 띤다. proto, expr, size에 올 수 있는 것들은 다음과 같다.
proto : ether, fddi, ip, arp, rarp, tcp, udp, icmp
expr : indicate Byte offset of packet of proto
size : optional. indicate the size of bytes in field of interest
default is one, and can be two or four
RELOP
!=, =, <=, >=, etc.
이 조건식을 사용하기 위해서는 먼저 해당하는 Protocol(proto)의 헤더에 관련된 것들을 자세히 알아야만 한다. proto에는 대상이 될 프로토콜을 지정한다. expr에는 프로토콜 헤더의 처음부터의 Byte Offset을 지정하는 식이 들어가게 된다. Size는 Option이며 지정이 안 되어 있을 경우에는 자동으로 1byte를 지칭한다. 따라서 이 조건식을 사용하게 되면 헤더에 포함된 정보를 Bitmask를 사용하여 직 접 원하는 패킷인지를 가려낼 수 있기 때문에, 보다 정밀한 사용이 가능하게 된다.



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

Tcpdump의 사용 예제들

security라는 호스트로부터 날아오고, 날아가는 패킷들을 출력
# tcpdump host security
security와 mazinga, getarobo 사이에 날아다니고 있는 패킷들을 출력
# tcpdump host security and \( mazinga or getarobo \)
security에서 elgaim을 제외한 모든 호스트로 날아다니는 IP 패킷들을 출력
# tcpdump ip host security and not elgaim
gateway amurorei를 거치는 ftp에 관련된 패킷들을 출력
# tcpdump 'gateway amurorei and ( port ftp or ftp-data )'
local호스트가 아닌 호스트와 로컬호스트가 맺는 TCP 커넥션의 시작과 마지막 패 킷들을 출력한다(SYN, FIN 패킷).
# tcpdump 'tcp[13] & 3 != 0 and not src and dst net non-local'
gateway amurorei를 지나는 576Byte보다 큰 패킷들을 출력한다
# tcpdump 'gateway amurorei and ip[2:2] > 576'
Ethernet boradcast 혹은 multicast를 통해서 보내진 것이 아닌, IP broadcast 혹 은 multicast 패킷들을 출력한다.
# tcpdump 'ehter[0] & 1 = 0 and ip[16] >= 224'
Echo request/reply가 아닌 ICMP 패킷들을 모두 출력한다.
# tcpdump 'icmp[0] != 8 and icmp[0] != 0'


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

Tcpdump의 평가
TCPDUMP는 여러모로 좋은 툴이다. libpcap을 거의 100% 활용한 프로그램의 예이며, 실제로 많은 툴들이 TCPDUMP와 병행하여 돌아가거나, TCPDUMP를 기반으로 제작되었다. TCPDUMP의 막강한 packet filter는 현재 로컬 네트워크 상에서 날아다니고 있는 특정한 패킷들을 실시간으로 기록해 줄 수 있으며, 이를 이용하여 네트워크에서 벌어지는 일들을 네트워크 관리자가 원하는 대로 뽑아 볼 수 있게 해 준다. 또한, 시스템 관리자들에게는 로컬 유저의 외부로의 커넥션들을 감시하고, 또 특정 침입자가 침투 경로로 자주 이용하는 호스트, 혹은 원하지 않는 호스트로부터의 커넥션을 실시간으로 감시할 수 있게 해 준다. libpcap을 이용하여 비슷한 툴을 제작하고자 하는 사람들에게도 TCPDUMP는 가장 훌륭한 예제가 될 것이다.


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

References

TCP dump Manual page : written by Van Jacobson, Craig Leres and Steven McCanne, all of the Lawrence Berkeley National Laboratory, University of California, Berkeley, CA.
TCP dump Document included in TCP dump package

IPv6 비활성화 시키기

/etc/modprobe.conf 파일에 아래와 같이 입력한다.

alias net-pf-10 off
alias ipv6 off

/etc/sysconfig/network 파일을 아래와 같이 수정한다.

NETWORKING_IPV6=no

위와 같이 설정한 후, 재부팅하거나 /etc/init.d/network restart 를 실행한다.

NFS 사용을 위한 방화벽 설정

NFS가 사용하는 포트들을 iptables rule chain에 추가한다.


foo# /sbin/iptables -A INPUT -p tcp --dport 111 -j ACCEPT
foo# /sbin/iptables -A INPUT -p udp --dport 111 -j ACCEPT
foo# /sbin/iptables -A INPUT -p tcp --dport 2049 -j ACCEPT
foo# /sbin/iptables -A INPUT -p udp --dport 2049 -j ACCEPT
foo# /sbin/iptables -A INPUT -p tcp --dport 32766 -j ACCEPT
foo# /sbin/iptables -A INPUT -p tcp --dport 32767 -j ACCEPT
foo# /sbin/iptables -A INPUT -p tcp --dport 32769 -j ACCEPT

SELINUX 비활성화시키기

/etc/sysconfig/selinux 파일에서 SELINUX 를 disabled 로 설정하면 된다. /etc/sysconfig/selinux 설정 예제는 아래와 같다.



SELINUX=disabled

SELINUXTYPE=targeted

NFS 설정

리눅스에서 여러분의 홈디렉토리를 통해 자신의 모든 설정파일들 - 예를 들어 넷스케이프 북마크들, 여러분의 전자우편을(여러분이 컴퓨터마다 모두 같은 전자우편 프로그램을 사용한다고 가정하고) 공유하는 것은, 여러분이 컴퓨터와 컴퓨터 사이에서 옮겨 다닐 때 윈도우 매니저가 사용자 환경에 적절하게 맞춰졌던 것처럼 여러분 네트워크에 강력함을 더해준다.

리눅스 그리고 유닉스는 일반적으로 파일시스템을 공유하기 위해 nfs(network file system)라는 이름을 가진 프로그램을 사용한다. nfs는 몇 가지 보안 구멍이 알려져 있으므로 방화벽 컴퓨터 뒤에 nfs를 숨기는 것이 좋다. NFS Howto는 이 기사를 읽은 다음에 꼼꼼하게 읽어보아야 할 중요한 리소스이다.

UDI:

어떤 사용자가 접근했었는지 nfs가 기억하게 만드는 방법 가운데 하나는 UID - 사용자 식별 번호이다. UID는 패스워드 파일의 세 번째 항목에 기록된다. 내 시스템에서 이 파일은 다음과 같다:
jpollman:IxmI/XXxxrg/Y:501:100:JC Pollma
n:/home/jpollman:/bin/bash





501이라는 숫자가 있는 자리가 UID이다. 어떤 한 사용자를 위한 UID는, nfs를 사용하는 다른 모든 머신에서 항상 같아야 한다. 여러분은 패스워드 파일을 이용하여 모든 머신에서 같은 UID를 가지도록 할 수도 있고, NIS - 이 글의 주제를 넘어서는 것인데 - 를 사용할 수도 있다. 여러분이 UID를 바꾼다면 사용자 소유의 파일들에 대해서, chown 명령으로 소유권을 모두 설정해 주어야 한다. 꽤 성가신 일이기는 하지만, 딱 한 번만 해주면 된다.

서버쪽에서 NFS:

여러분이 실행해야 하는 프로그램이 몇 개 있다. 그리고, 커널도 필요한 옵션을 설정하여 컴파일해 두어야 한다.

여러분의 커널에서:

커널은 반드시 nfs 기능을 포함하여 컴파일되어야 한다. 다행스럽게도, 대부분의 배포판이 nfs를 지원하도록 컴파일된 커널을 가진다. 만약 여러분이 자신의 커널을 바꿀 계획이라면 Network File Systems 아래에서 다음 옵션들에 꼭 YES라고 답해야 한다.

NFS filesystem support
NFS server support

No라고 답해야 하는 것은:

Root filesystem on NFS

그 다음에 커널을 컴파일하고, 새로 만들어진 커널을 여느 때처럼 설치한다.

portmap:

여러분의 시스템에 portmap 프로그램이 반드시 설치되어 실행되고 있어야 한다. 일반적으로 portmap 프로그램은 배포판을 설치할 때 기본적으로 설치된다. 다음 명령으로 portmap이 실행 중인지 확인할 수 있다:

ps ax|grep port [Enter]

이미 실행했다면, 제대로 동작하고 있는지 다음 명령으로 점검할 수 있다:

rpcinfo -p [Enter]

portmap 프로그램은 /etc/host.allow와 /etc/host.
deny 파일을 이용하므로, rpcinfo -p 명령이 실패하더라도 여러분의 portmapper는 이들 파일이 있는지 점검해서 여러분이 원하는 대로 실행된다.

nfsd and mount:

nfsd와 mount 프로그램들이 반드시 여러분의 서버에 설치되어 있어야 한다. nfs 프로그램들은 커널 2.2에서는 knfsd라 불리고, 그 이전의 커널에서는 nfs-server2.2란 이름을 가지고 있었다.

exports:

/etc/exports 파일에는 nfs를 통해 다른 컴퓨터에 마운트 될 수 있는 디렉토리들을 설정한다. exports는 각각의 줄마다 마운트 될 수 있는 디렉토리와 허용된 사용자, 퍼미션 등으로 구성된 텍스트 파일이다. 내 시스템에 있는 exports 파일은 다음과 같다:

/home *.kulai.org(rw)

이 줄에서 첫 번째 항목은, 우리 네트워크의 다른 컴퓨터에서 마운트해서 홈디렉토리로 사용할 수 있는 디렉토리이다. 그 옆, 두 번째 아이템은 어떤 시스템에서 디렉토리를 마운트 할 수 있도록 할 것인지 정한 리스트이다. 우리는 kulai.org 네트워크에 속하는 모든 컴퓨터들이(*.kulai.org) 첫 번째 항목에서 설정한 디렉토리들을 마운트 할 수 있도록 설정했다. 세 번째는(괄호로 싸여 있는) 퍼미션을 설정한다. export 파일 설정에 대한 더 많은 정보가 필요하면, man 5 exports 명령을 실행한다. 여러분의 exports 파일을 바꾼 다음에는 설정 내용을 다시 읽어들이도록 nfsd와 mountd 데몬을 다시 시작해야 한다.

마지막 점검:

exports 파일을 고치고 필요한 데몬을 모두 다시 시작한 다음에는, 다음 명령을 실행한다:

rpcinfo -p [Enter]

명령을 실행하면 아래와 비슷한 메시지를 보게 될 것이다.(여러분이 다른 서비스들을 가동 중에 있고 mountd 포트가 다르다면 더 많은 메시지들을 보게 될지도 모르겠다):
program vers proto port
100000 2 tcp 111 portmapper
100000 2 udp 111 portmapper
100005 1 udp 745 mountd
100005 1 tcp 747 mountd
100003 2 udp 2049 nfs
100003 2 tcp 2049 nfs





클라이언트 쪽에서 NFS:

여러분은 반드시 nfs 클라이언트 프로그램들을 설치해야 한다: mountd와 portmap는 물론, 커널도 nfs를 지원하도록 설정되어야 한다. 이런 것들은 대부분의 배포판에서 처음 설치할 때 따라서 설치된다. 조건이 모두 갖추어진 다음, nfs 서버 - master.kulai.org - 를 루트로 마운트하기 위해서는, 클라이언트 머신에서 다음 명령을 실행한다:

mount -t nfs master.kulai.org:/home /mnt [Enter]

만약 모든 설정이 제대로 되었다면, 프롬프트가 다시 나타날 것이다. 그 다음, /mnt 디렉토리로 cd 하고, 디렉토리에서 ls 해보아 리스트가 보이면 모든 작업이 잘 된 것이다. 만약, 파일 시스템을 마운트하는 대신, mount 프로그램이 ‘mount:master.kulai.org://home failed’와 비슷한 에러 메시지를 보여준다면, 서버 쪽에 그 원인이 있는 것이다: exports 파일 설정이 잘못되어 접근권한이 없거나, exports 파일을 편집한 다음에 nfsd와 mountd 데몬을 다시 시작하는 것을 잊은 것이다. 만약 mount clntudp_create :RPC:Program not registered 라는 메시지가 보인다면 nfsd나 mountd 데몬이 서버에서 구동되지 않았다는 뜻이다. 또는 앞서 말했던 문제가 hosts.{allow,deny} 파일에 있는 것이다.

마운트된 파일시스템을 해제하기 위해서는 다음 명령을 사용한다:

umount /mnt [Enter]

마운트 작업들을 자동화하려면, 아래 항목을 여러분의 클라이언트 머신에 있는 /etc/fstab 파일에 추가한다 - 물론, master.kulai.org 대신 여러분 서버의 이름을 넣어야 한다.
master.kulai.org:/home /home nfs rw 0 0





흥미롭게도, 여러분이 다른 컴퓨터로부터 /home 디렉토리를 nfs 마운트 할 때, 여러분 하드 드라이브에서 /home 디렉토리는 사라진다 : 여전히 그 곳에 있지만, umount /home 할 때까지 여러분의 /home 디렉토리는 보이지 않는다.

이제, 모든 것들이 잘 동작하면, 여러분의 서버와 클라이언트 머신 둘 다 다시 부트 하는게 좋겠다. 리눅스 구루들이(Linux gurus) “reboot”를 보고 내게 포화를 쏘아 대겠지만, 여기서 시스템을 다시 부트하는 데는 그만한 까닭이 있다.

IPTABLES

명령어순례

iptables 명령은 리눅스 IPv4 방화벽을 설정하는 명령어이다. 1.1 시리즈 부터 리눅스 커널은 패킷 필터링을 포함하기 시작했다. 제 1세대는 BSD의 ipfw를 기본으로 했고 1994년 후반기에 알란 콕스(Alan Cox) 에 의해서 포트 됐다.
이것은 리눅스 2.0에서 Jos Vos와 다른이들에 의해서 개선됐고 커널의 필터링 규칙을 제어하는 사용자 툴로는 'ipfwadm'이 사용됐다.
1998년 중반에 리눅스 2.2를 위해 사용자 툴로 'ipchains'를 내놓았다. 마지막으로, 제 4세대 툴이 'iptables'이고 리눅스 2.4를 위해 1999년 중반에 커널을 재작성했다.


<리눅스매거진 편집부>

패킷 필터란? 네트워크를 통하는 모든 것은 패킷의 형태를 가지며, 패킷의 앞부분에는 패킷이 어디서 왔는지 어디로 향하는지, 어떤 프로토콜을 이용하는지 등과 같은 정보를 가지고 있다. 패킷 필터는 이렇게 지나가는 패킷의 헤더를 보고 패킷을 ‘DROP'(마치 전혀 전달되지 않는 것처럼 패킷을 거부) 하거나 ’ACCEPT‘(패킷이 지나가도록 내버려 둠)하는 등의 작업을 하는 프로그램을 말한다. iptables은 이런 패킷 필터링 기능을 설정하는데 사용할 수 있는 프로그램이다. 자신의 시스템에 설치돼 있는 iptables의 버전을 확인하는 방법은 아래명령을 통해 가능하다.

# iptables --version

iptables 1.2.4

커널은 3가지의 방화벽 체인(chain)을 기본적으로 가지고 패킷 필터링을 시작한다. 파이어월 체인 혹은 체인이라 부르는 이 3가지는 입력(Input), 출력(Output), 전달(Forward)이다. 입력체인은 들어오는 패킷을 조사하고 전달체인은 외부의 다른 시스템으로 전달될 패킷을 조사한다. 마지막으로 출력체인은 외부로 나가는 패킷을 조사한다.


■ 패킷검사방법

1. 패킷이 커널에 도착하면 그 패킷의 목적지를 확인한다. 이것을 '라우팅' 이라고 한다.

2. 패킷의 목적지가 이곳이면, 패킷은 전달돼 입력체인에 도달한다. 패킷이 입력체인을 통과하면 패킷을 기다리고 있던 프로세서가 받게 된다.

3. 그렇지 않고 커널이 포워딩 불능이나, 패킷을 어떻게 포워딩해야 하는가를 알지못하면, 그 패킷은 ‘DROP‘ 된다. 포워딩이 가능하게 돼있고 다른 곳이 목적지이면 패킷은 그림의 오른쪽 방향으로 전달돼 포워딩 체인으로 간다. 이 체인이 ’ ACCEPT‘ 하게 되면 이것은 포워딩 할 네트워크로 보내진다.

4. 마지막으로, 로컬에서 수행하던 프로그램은 네트워크 패킷을 전송할 수 있다.
이 패킷은 즉시 출력 체인에 보내지며 이 체인이 ‘ACCEPT’되면 이 패킷은 그 목적지가 어디든지 보내진다.


:::: 사 용 법 ::::

iptables -[ADC] chain rule-specification [options]

iptables -[RI] chain rulenum rule-specification [options]

iptables -D chain rulenum [options]

iptables -[LFZ] [chain] [options]

iptables -[NX] chain

iptables -P chain target [options]

iptables -h (print help information)


# Commands

-A : 새로운 규칙을 추가한다.(--append)

-D : 규칙을 삭제한다.(--delete)

-C : 패킷을 테스트한다.(--check)

-R : 새로운 규칙으로 교체한다.(--replace)

-I : 새로운 규칙을 삽입한다.(--insert)

-L : chain에 설정된 규칙을 출력한다.(--list)

-F : chain으로부터 규칙을 모두 방출(삭제)한다.(--flush)

-Z : 모든 chain의 패킷과 바이트 카운터 값을 0으로 만든다.(--zero)

-N : 새로운 chain을 만든다.(--new)

-X : chain을 삭제한다.(--delete-chain)

-P : 기본정책을 변경한다.(--policy)


# chain

INPUT : 입력에 대한 사용

OUTPUT : 출력에 대한 사용

FORWARD : 전달(forwarding)에 대한 사용


# Options

-s : 패킷의 발신지를 명시한다.(--source)

-p : 패킷의 프로토콜을 명시한다.(--protocol)

-d : 패킷의 도착지를 명시한다.(--destination)

-i : 규칙을 적용할 인터페이스 이름을 명시한다.(--interface)

-j : 규칙에 맛는 패킷을 어떻게 처리할 것인가를 명시한다.(-jump)

-y : 접속 요청 패킷인 SYN패킷을 허용하지 않는다.(--syn)

-f : 두 번째 이후의 조각에 대해서 규칙을 명시한다.(--fragment)


# 사용예

127.0.0.1 IP 주소로부터 오는 모든 ICMP 패킷을 무시하는 경우 사용되는 프로토콜은 ICMP이고 발신 주소는 127.0.0.1 이어야 한다. 그리고 패킷 필터의 목표는 드롭(DROP)이다. 테스트하는 프로그램은 ping이며 ping은 단순히 ICMP type 8로 반응요구를 보내며 이에 협조하는 대상 호스트는 ICMP 타입 0 (echo reply)를 보내어 응답하도록 돼 있다. 이제 iptables의 패킷필터를 통해 로컬호스트가 ping 명령에 반응하지 않도록 하겠다.


# ping -c 1 127.0.0.1

PING 127.0.0.1 (127.0.0.1): 56 data bytes

64 bytes from 127.0.0.1: icmp_seq=0 ttl=64 time=0.2 ms

--- 127.0.0.1 ping statistics ---

1 packets transmitted, 1 packets received, 0% packet loss

round-trip min/avg/max = 0.2/0.2/0.2 ms


# iptables -A INPUT -s 127.0.0.1 -p icmp -j DROP

; `INPUT' 체인에 127.0.0.1로부터 오고(`-s 127.0.0.1') ICMP(`-p
ICMP') 패킷에 대해 DROP로 점프하라는 (`-j DROP') 규칙을 추가(-A).

# ping -c 1 127.0.0.1

PING 127.0.0.1 (127.0.0.1): 56 data bytes

--- 127.0.0.1 ping statistics ---


1 packets transmitted, 0 packets received, 100% packet loss


■ 설정된 iptables 규칙의 삭제

지금 현재 입력돼 있는 chain이 하나밖에 없으므로 숫자를 지정하는 명령으로 삭제가 가능하며, 앞의 명령과 똑같이 하되 -A를 -D로 바꾸어 지우는 방법이 있다.

#iptables -D INPUT 1

#iptables -D INPUT -s 127.0.0.1 -p icmp -j DROP


■ 체인 규칙 나열하기

설정돼 있는 체인의 규칙을 모두 볼 수 있다. 명령으로 -L을 사용해 가능하며 -v 옵
션과 같이 사용해 각 체인에 대한 패킷과 바이트 카운터 등의 자세한 정보를 함께
볼 수 있다.




# iptables -A INPUT -s 127.0.0.1 -p icmp -j DROP

# iptables -L -v

Chain INPUT (policy ACCEPT 709 packets, 35362 bytes)

pkts bytes target prot opt in out source
destination

0 0 DROP icmp -- any any localhost.localdomain
anywhere


Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)

pkts bytes target prot opt in out source
destination


Chain OUTPUT (policy ACCEPT 423 packets, 39549 bytes)

pkts bytes target prot opt in out source
destination


■ 체인 비우기

하나의 체인 안의 모든 규칙을 비우는 것은 ‘-F’ 명령을 사용해 간단하게 할 수
있다. 체인을 지정하지 않으면 모든 체인의 규칙을 지울 수 있다.

# iptables -F INPUT


■ 출처와 목적지 지정

출처('-s', '--source', '--src')와 목적지('-d', '--destination', '--dst') IP 주소를 지정하는데 4가지 방법이 있다. 가장 보편적인 방법은 'www.linuzine.com', 'localhost'처럼 도메인 네임을 이용하는 것이다. 두번째 방법은 '127.0.0.1'과 같은 IP 주소를 이용하는 것이다.

세번째와 네번째 방법은 IP 주소의 그룹을 지정하는 것으로 '199.95.207.0/24' 또는 '199.95.207.0/255.255.255.0' 같은 형태이다. 이 둘은 모두 199.95.207.0
부터 199.95.207.255 사이의 모든 IP 주소를 지정한다. '/' 다음의 숫자는 IP 주
소의 어떤 부분이 의미 있는가를 나타낸다. '/32' 나 '/255.255.255.255' 가 기
본 값이다.(IP 주소의 모든 부분이 일치해야 한다.) 모든 IP 주소를 지정하는
데 '/0' 가 사용된다.


# iptables -A INPUT -s 0/0 -j DROP


많은 지시자들('-s'나 '-d' 같은)은 일치하지 않는 주소를 나타내기 위해 '!'('not'을 의미한다)로 시작하는 설정을 할 수 있다. 예로, '-s ! localhost' 는 localhost로부터 오는 패킷이 아닌 경우를 나타낸다.


■ 프로토콜 지정

프로토콜은 '-p' 지시자로 지정할 수 있다. 프로토콜을 숫자가 될 수 있고(IP의 프로토콜 번호를 알고 있다면) 'TCP', 'UDP', 'ICMP' 같은 이름이 될 수도 있다.
그리고 'tcp'는 'TCP'와 같은 역할을 한다. 프로토콜 이름 지정에도 '!'을 이용
할 수 있다. '-p ! TCP'


■ TCP 확장

TCP 확장은 '--protocol tcp' 가 지정되고 다른 적용이 지정되지 않으면 자동으로 적재된다. 이것은 다음과 같은 옵션을 제공한다.

--tcp-flags
뒤에 두개의 단어를 사용한다. 첫번째 것은 검사하고자 하는 지시자 리스트의 마스크이다. 두번째 단어는 지시자에게 어떤 것이 설정 될 것인지를 말해준다.

# iptables -A INPUT --protocol tcp --tcp-flags ALL SYN,ACK -j DROP

이것은 모든것이 검사돼야 함을 말한다. 그러나 SYN과 ACK만 설정된다.

--syn
'!' 옵션이 선행될 수 있다. 이것은 '--tcp-flags SYN,RST,ACK,SYN'의 약어이다.

--source-port,
'!' 옵션이 선행될 수 있다. 이후에 하나의 TCP 포트나 포트의 범위를 지정한다.

--sport
/etc/services 에 기록된 것과 같은 포트 이름이 사용될 수 도 있고 숫자로 나타낼 수도 있다. 범위는 두 개의 포트 이름을 '-'으로 연결해서 사용하거나 하나의 포트 뒤에 '-'를 사용하거나 하나의 포트 앞에 '-' 를 덧붙일 수 있다.

--destination-port, --dport
위의 내용과 같으나 목적지를 지정한다.

--tcp-option
'!' 나 숫자가 옵션에 선행될 수 있는데 숫자가 앞에 올 경우 그 숫자 와 TCP 옵션이 같은 경우의 패킷을 검사한다. TCP 옵션을 검사하려 할 때 완전한 TCP 헤더를 갖지 않는 것은 자동으로 드롭 된다.


■ iptables를 통한 포트관리

iptables는 테이블 형식으로 관리를 한다. 그리고 먼저 등록된 것이 효력을 발생하기 때문에 등록을 하는 순서가 중요하다. 모든 것을 거부하는 설정이 먼저 오게 되면 그 이후에 포트를 열어주는 설정이 와도 효과가 없다. 그러므로 허용하는 정책이 먼저 오고 나서 거부하는 정책이 와야 한다.


iptables -A INPUT -p tcp --dport 25 -j ACCEPT

iptables -A INPUT -p tcp --dport 22:30 -j DROP


이렇게 하면 먼저 25번 포트로 들어오는 것을 허용하고 난 후에 다른 것을 막아내기 때문에 제대로 된 설정이 된다.


iptables -A INPUT -p tcp --dport 22 -j ACCEPT


등록된 라인은 ssh를 사용하는 것을 허용하는 것이다. 출처(source)와 목적지 (destination)는 명시하지 않았기 때문에 전체포트와 IP가 대상이 된다. -dport 는 패킷이 대상으로 삼는 포트를 명시한 것이다 여기에서 22라고 표기한 것은 ssh서비스 포트이다. 그리고 마지막에 -j ACCEPT는 허용하도록 정책을 정하는 것이다.
따라서 여기로의 ssh서비스를 요청하는 패킷은 허용되도록 설정을 한 것이다.


■ 전체적인 설정

#!/bin/sh

# iptables 모듈 등록하기

modprobe iptable_filter

# ssh 열기

/usr/local/bin/iptables -A INPUT -p tcp --dport 22 -j ACCEPT

# httpd 열기

/usr/local/bin/iptables -A INPUT -p tcp --dport 80 -j ACCEPT

# pop3 열기

/usr/local/bin/iptables -A INPUT -p tcp --dport 109 -j ACCEPT

# pop2 열기

/usr/local/bin/iptables -A INPUT -p tcp --dport 110 -j ACCEPT

# imap 열기

/usr/local/bin/iptables -A INPUT -p tcp --dport 143 -j ACCEPT

# mysqld 열기

/usr/local/bin/iptables -A INPUT -p tcp --dport 3306 -j ACCEPT

# ftpd 열기

/usr/local/bin/iptables -A INPUT -p tcp --dport 21 -j ACCEPT

# ftp-data 열기

/usr/local/bin/iptables -A INPUT -p tcp --dport 20 -j ACCEPT

# ircd 열어주기

/usr/local/bin/iptables -A INPUT -p tcp --dport 6667 -j ACCEPT

/usr/local/bin/iptables -A INPUT -p udp --dport 6667 -j ACCEPT

# 전부 거절하기

/usr/local/bin/iptables -A INPUT -p tcp --dport 1:30000 -j DROP

/usr/local/bin/iptables -A INPUT -p icmp --icmp-type echo-request -j
DROP


이처럼 허용하는 서비스가 한정적이다. 우선 ssh, http, pop3, pop2, imap,
mysql, ftp, ircd를 위해서 서비스를 요청하는 패킷은 허용하고 나머지는 전부 거부하는 설정이다. 이 설정을 자세히 보면 tcp와 icmp를 대상으로 했다. 거절하는 줄인


/usr/local/bin/iptables -A INPUT -p tcp --dport 1:30000 -j DROP


이 라인에서 --dport 다음에 1:30000 으로 지정돼 있다. 이 부분은 서버를 경유해서 다른 곳으로 가고자하는 경우에 클라이언트 프로그램이 사용할 포트를 남겨주기 위함이다. 1번포트에서 30000번 포트까지는 완전히 tcp에 대해서 막는 것이다.

만약에 서버에서 나갈 이유가 없으면 전부 막으면 된다. 1:65535 로 설정하면 전체포트가 막힌다. iptables 설정은 조금만 공부를 하면 쉽게 습득이 가능하다. 그러므로 문서를 보는 것이 중요하다. 이 설정은 기본이므로 좀더 많은 것은 관련 문서를 이용하기를 바란다.