고급 Linux 커맨드 마스터 가이드
저자 – Arup Nanda
게시일: 2006년 8월
쉐릴 칼리시가 Linux 입문자들을 위해 기고한 “Linux 파일 커맨드 마스터 가이드(한글)"를 통해 일반적으로 자주 사용되는 Linux 커맨드에 대해 설명 드린 바 있습니다. 이제 기본을 마스터하였다면, 다음 단계로 넘어가 좀 더 복잡하지만 활용도가 높은 커맨드들에 배워 볼 차례입니다.
4 부에 걸쳐 연재되는 이번 시리즈에서는, 여러분이 알고 있는 커맨드들의 잘 알려지지 않은 사용법에 대해 소개하고 커맨드의 활용도를 높이기 위한 여러 가지 변칙적인 용례들을 설명합니다. 또 연재가 진행되면서 좀 더 난이도가 높은 커맨드들에 대해 배우실 수 있을 것입니다.
여기에서 소개되는 커맨드들이 Linux 버전 또는 커널 버전에 따라 차이가 있을 수 있음을 참고하시기 바랍니다(하지만 그 차이는 미미한 수준입니다).
오너, 그룹, 권한의 변경
쉐릴의 아티클에서 chown, chgrp 커맨드를 이용하여 파일의 오너십과 그룹을 변경하는 방법을 이미 설명하였습니다. 아래와 같은 파일이 있다고 가정해 봅시다.
# ls -l
total 8
-rw-r--r-- 1 ananda users 70 Aug 4 04:02 file1
-rwxr-xr-x 1 oracle dba 132 Aug 4 04:02 file2
-rwxr-xr-x 1 oracle dba 132 Aug 4 04:02 file3
-rwxr-xr-x 1 oracle dba 132 Aug 4 04:02 file4
-rwxr-xr-x 1 oracle dba 132 Aug 4 04:02 file5
-rwxr-xr-x 1 oracle dba 132 Aug 4 04:02 file6
이제 모든 파일의 권한을 첫 번째 파일과 동일하게 변경해야 합니다. 물론 “chmod 644 *”를 실행하면 간단하게 해결이 가능합니다. 하지만 스크립트를 작성하면서 첫 번째 파일의 권한을 모르고 있는 경우라면 어떻게 해야 할까요? 또 여러 번의 권한 변경 작업을 반복적으로 수행해야 하는 상황에서, 각각의 파일 권한을 일일이 확인하기 어려운 경우에는 어떻게 할 수 있을까요?
이런 경우 파일의 권한을 다른 파일과 동일하게 설정하는 명령을 활용할 수 있습니다. 아래 커맨드는 파일2의 권한을 파일 1과 동일하게 설정합니다.
chmod --reference file1 file2
이제 설정된 권한을 확인해 보면 아래와 같이 나타납니다.
# ls -l file[12]
total 8
-rw-r--r-- 1 ananda users 70 Aug 4 04:02 file1
-rw-r--r-- 1 oracle dba 132 Aug 4 04:02 file2
파일 2의 권한이 파일 1와 같게 변경되었습니다. 파일 1의 권한을 먼저 확인할 필요는 없었습니다.
같은 방법을 파일의 그룹 멤버십 설정에 이용할 수도 있습니다. 파일 2의 그룹을 파일 1과 동일하게 설정하기 위한 명령이 아래와 같습니다:
# chgrp --reference file1 file2
# ls -l file[12]
-rw-r--r-- 1 ananda users 70 Aug 4 04:02 file1
-rw-r--r-- 1 oracle users 132 Aug 4 04:02 file2
물론 오너십의 설정에도 같은 방법을 적용할 수 있습니다. 오너십을 변경하는 방법이 아래와 같습니다. 권한이 아래와 같이 설정되어 있는 경우,
# ls -l file[12]
-rw-r--r-- 1 ananda users 70 Aug 4 04:02 file1
-rw-r--r-- 1 oracle dba 132 Aug 4 04:02 file2
오너십을 아래와 같은 방법으로 변경할 수 있습니다.
# chown --reference file1 file2
# ls -l file[12]
-rw-r--r-- 1 ananda users 70 Aug 4 04:02 file1
-rw-r--r-- 1 ananda users 132 Aug 4 04:02 file2
위의 경우 그룹과 오너가 함께 변경되었습니다.
오라클 사용자를 위한 팁
이 방법을 사용하여 특정 실행 파일을 기준으로 디렉토리 내의 전체 오라클 실행 파일에 설정된 오너십과 권한을 일괄 변경하는 것이 가능합니다. 이 방법은 다른 사용자 계정으로 마이그레이션하거나 기존에 설치된 환경을 다른 오라클 소프트웨어 소유자에게 할당할 때 유용하게 활용됩니다.
기타 파일 관련 커맨드
ls 명령과 매개변수를 이용하여 파일에 관련한 매우 유용한 정보들을 확인할 수 있습니다. stat 커맨드는 ls보다 덜 알려지긴 했지만, 더욱 유용한 정보들을 제공합니다.
stat 커맨드를 이용해서 $ORACLE_HOME/bin 디렉토리에 위치한 “oracle” 실행 파일의 정보를 확인하는 방법이 아래와 같습니다.
# cd $ORACLE_HOME/bin
# stat oracle
File: `oracle'
Size: 93300148 Blocks: 182424 IO Block: 4096 Regular File
Device: 343h/835d Inode: 12009652 Links: 1
Access: (6751/-rwsr-s--x) Uid: ( 500/ oracle) Gid: ( 500/ dba)
Access: 2006-08-04 04:30:52.000000000 -0400
Modify: 2005-11-02 11:49:47.000000000 -0500
Change: 2005-11-02 11:55:24.000000000 -0500
위 커맨드를 통해 출력된 정보를 눈 여겨 보시기 바랍니다. (ls -l을 통해서도 얻을 수 있는) 파일 사이즈 정보와 별도로, 파일이 점유하고 있는 블록의 수가 표시되고 있습니다. 일반적으로 Linux의 블록 사이즈는 512 바이트입니다. 따라서 93,300,148 바이트는 (93300148/512=) 182226.85 개의 블록을 점유합니다. 블록은 한꺼번에 채워지므로, 이 파일은 이렇게 계산한 결과와 근사한 수의 블록을 사용하고 있을 가능성이 높습니다. 하지만 이렇게 추측을 하는 대신, stat 커맨드를 이용해서 정확한 블록 수를 산정할 수 있습니다.
또 위의 실행 결과에서 파일 오너십의 GID, UID와 권한의 8진법 표현(6751)을 확인할 수 있습니다. 나중에 파일의 권한을 현재의 상태로 되돌리고 싶으면, 명시적으로 권한을 표시하는 대신 “chmod 6751 oracle ”과 같이 명령을 실행할 수 있습니다.
위의 출력 결과에서 가장 유용한 부분이 바로 파일 액세스 타임스탬프 정보입니다. 위에서는 파일이 2006-08-04 04:30:52(“Access”의 오른쪽 부분), 즉 2006년 8월 4일 오전 4:30:52에 마지막으로 액세스되었음을 알 수 있습니다. 이 값은 사용자가 데이터베이스에 최초 접근한 시점을 의미합니다. 파일은 2005-11-02 11:49:47(Modify의 오른쪽)에 수정되었습니다. 마지막으로 “Change” 옆의 타임스탬프는 파일의 상태가 변경된 시점을 의미합니다.
stat 커맨드의 –f 옵션은 파일이 아닌 파일 시스템의 정보를 표시하라는 의미를 갖습니다:
# stat -f oracle
File: "oracle"
ID: 0 Namelen: 255 Type: ext2/ext3
Blocks: Total: 24033242 Free: 15419301 Available: 14198462 Size: 4096
Inodes: Total: 12222464 Free: 12093976
또 –t는 동일한 정보를 하나의 라인으로 표시하는 옵션입니다.
# stat -t oracle
oracle 93300148 182424 8de9 500 500 343 12009652 1 0 0 1154682061
1130950187 1130950524 4096
이 옵션은 커맨드 실행 결과로부터 값을 추출하여 처리 작업을 수행하는 쉘 스크립트 환경에서 유용하게 활용됩니다.
오라클 사용자를 위한 팁
오라클을 ”relink”하는 경우 (이 작업은 패치 설치 과정에서 자주 발생합니다), 오라클은 새로운 실행 파일을 생성하기 전에 기존의 실행 파일을 다른 이름으로 저장합니다. 예를 들어 아래 명령을 이용하여 전체 유틸리티를 relink 할 수 있습니다.
relink utilities
위 명령을 수행하면 sqlplus 실행 파일이 다른 유틸리티와 함께 재컴파일 됩니다. 기존의 sqlplus 실행 파일은 sqlplusO라는 이름으로 저장됩니다. 재컴파일 작업이 실패하는 경우, relink 프로세스는 sqlplusO의 파일 이름을 다시 sqlplus로 변경함으로써 기존 상태를 복구합니다. 또 패치 적용 후 문제가 발견된 경우, 직접 기존 파일의 이름을 다시 변경하는 방법으로 상태를 원상 복귀시킬 수 있습니다.
이 파일에 stat 명령을 실행한 결과입니다:
# stat sqlplus*
File: 'sqlplus'
Size: 9865 Blocks: 26 IO Block: 4096 Regular File
Device: 343h/835d Inode: 9126079 Links: 1
Access: (0751/-rwxr-x--x) Uid: ( 500/ oracle) Gid: ( 500/ dba)
Access: 2006-08-04 05:15:18.000000000 -0400
Modify: 2006-08-04 05:15:18.000000000 -0400
Change: 2006-08-04 05:15:18.000000000 -0400
File: 'sqlplusO'
Size: 8851 Blocks: 24 IO Block: 4096 Regular File
Device: 343h/835d Inode: 9125991 Links: 1
Access: (0751/-rwxr-x--x) Uid: ( 500/ oracle) Gid: ( 500/ dba)
Access: 2006-08-04 05:13:57.000000000 -0400
Modify: 2005-11-02 11:50:46.000000000 -0500
Change: 2005-11-02 11:55:24.000000000 -0500
sqlplusO가 2005년 11월 11일에 수정된 반면 sqlplus는 2006년 8월 4일에 수정되었음을 확인할 수 있습니다. 이 결과는 sqlplusO의 상태가 마지막으로 변경된 시점과도 일치합니다. 따라서 sqlplus의 기존 버전이 2005년 11월 11일에서 2006년 8월 4일까지 사용되었음을 알 수 있습니다. 기능적인 문제의 원인을 해명하고자 한다면, 이 데이터가 좋은 참고가 될 수 있습니다. 또 파일 변경 시점과 권한 변경 시점을 함께 연계하여 문제 해결 작업에서 참고할 수 있습니다.
위 실행 결과에서 또 한 가지 중요한 점은 두 파일의 사이즈가 다르다는 사실입니다(sqlplus는 9865 바이트인 반면 sqlplusO는 8851 바이트입니다). 그러므로 파일이 단순히 재컴파일된 것이 아니며 새로운 라이브러리가 추가되었을 가능성이 높다고 추측할 수 있습니다. 또는 현재 겪고 있는 문제의 원인이 여기에 숨어 있을 수도 있습니다.
파일 타입
파일이 어떤 타입인지 확인하려면 어떻게 해야 할까요? 이를 위해 사용되는 명령이 바로 file 커맨드입니다. 실행 예가 아래와 같습니다:
# file alert_DBA102.log
alert_DBA102.log: ASCII text
alert_DBA102.log는 ASCII 텍스트 파일임을 알 수 있습니다. 다른 예를 살펴 봅시다:
# file initTESTAUX.ora.Z
initTESTAUX.ora.Z: compress'd data 16 bits
파일이 압축된 파일임을 알 수 있습니다. 하지만 압축된 파일 안에 어떤 타입의 파일이 포함되어 있는지 어떻게 알 수 있을까요? 물론 파일의 압축을 풀고 다시 file 커맨드를 실행하면 되겠지만, 이는 결코 효율적인 방법이 아닙니다. 훨씬 간단한 방법으로 –z 옵션을 사용할 수 있습니다.
# file -z initTESTAUX.ora.Z
initTESTAUX.ora.Z: ASCII text (compress'd data 16 bits)
또 문제가 될 수 있는 예로 심볼릭 링크(symbolic link)를 들 수 있습니다:
# file spfile+ASM.ora.ORIGINAL
spfile+ASM.ora.ORIGINAL: symbolic link to
/u02/app/oracle/admin/DBA102/pfile/spfile+ASM.ora.ORIGINAL
물론 위 출력만으로도 유용한 정보입니다. 하지만 링크가 가리키는 파일의 유형은 어떻게 확인할까요? file 명령을 반복해서 수행하는 대신, -l 옵션을 사용하면 됩니다.
# file -L spfile+ASM.ora.ORIGINAL
spfile+ASM.ora.ORIGINAL: data
파일이 데이터 파일임을 쉽게 확인할 수 있습니다. init.ora와 달리 spfile은 바이너리 파일이며 따라서 데이터 파일로 표시됨을 참고하시기 바랍니다.
오라클 사용자를 위한 팁
사용자 덤프 디렉토리에 위치한 트레이스 파일을 찾고 있지만, 파일이 실제로는 다른 디렉토리에 위치하고 있고 이 디렉토리에는 심볼릭 링크만이 존재할 수 있습니다. 또는다른 사용자가 파일을 압축하거나 이름을 변경했을 수도 있습니다. 우리가 분명하게 아는 사실은 단 한 가지뿐, 즉 이 파일이 아스키 파일이라는 사실입니다. 이런 경우라면 아래와 같은 명령을 활용할 수 있습니다.
file -Lz * | grep ASCII | cut -d":" -f1 | xargs ls -ltr
이 커맨드는 디렉토리에 있는 ASCII 파일을 점검하고, 파일이 압축된 경우에도 시간 순서대로 정렬하여 표시합니다.
파일의 비교
서로 다른 두 개의 파일이 동일한 내용임을 어떻게 확인할 수 있을까요? 여러 가지 방법이 가능하며, 각각 나름의 장단점이 있습니다.
diff. 가장 간단한 커맨드인 diff는 두 파일 간의 차이를 비교하여 보여 줍니다. 두 파일의 내용이 아래와 같습니다:
# cat file1
In file1 only
In file1 and file2
# cat file2
In file1 and file2
In file2 only
diff 커맨드를 사용하면 아래와 같이 두 파일의 차이를 확인할 수 있습니다
# diff file1 file2
1d0
< In file1 only
2a2
> In file2 only
#
첫 번째 라인의 "<" 기호는 해당 라인이 첫 번째 파일, 즉 file1에만 존재함을 의미합니다. 마찬가지로 “>” 기호는 해당 라인이 두 번째 파일(file2)에만 존재함을 의미합니다. 출력 결과의 첫 번째 라인에서 문자 1d0은 file1을 file2와 동일하게 만들기 위해 sed 유틸리티에서 사용하는 옵션을 의미합니다.
-y 옵션을 사용하면 결과를 나란히 비교할 수 있습니다:
# diff -y file1 file2 -W 120
In file1 only <
In file1 and file2 In file1 and file2
> In file2 only
-W 옵션은 출력 결과의 길이를 지정합니다. 위에서는 120 문자 길이의 화면을 사용하도록 지정하고 있습니다.
파일이 같은지 다른지의 여부만을 확인하고 싶다면 –q 옵션을 사용합니다.
# diff -q file3 file4
# diff -q file3 file2
Files file3 and file2 differ
file3과 file4의 내용은 동일하므로 아무 결과도 출력되지 않습니다. –q 옵션은 파일의 내용이 서로 다른 경우에만 결과를 보고합니다.
쉘 스크립트를 작성하는 경우에는, 파싱이 가능한 형태로 결과를 출력하는 것이 유용할 수 있습니다. 이런 경우라면 -u 옵션이 유용하게 활용됩니다:
# diff -u file1 file2
--- file1 2006-08-04 08:29:37.000000000 -0400
+++ file2 2006-08-04 08:29:42.000000000 -0400
@@ -1,2 +1,2 @@
-In file1 only
In file1 and file2
+In file2 only
위의 결과는 두 가지 파일의 컨텐트를 비교하면서 중복되지 않은 컬럼에 대해서만 +, - 기호를 사용하여 비교하고 있습니다. 앞 컬럼에 아무 기호도 표시되지 않은 라인은 해당 컨텐트가 두 파일에 모두 존재함을 의미합니다.
이 커맨드는 공백 기호도 함께 비교합니다. 공백 기호를 무시하고 싶다면 –b 옵션을 사용합니다. 빈 라인을 무시하려면 –B 옵션을 사용합니다. 마지막으로 대소문자 구분을 무시하려면 –i 옵션을 사용합니다.
diff 커맨드를 디렉토리 비교를 위해 사용할 수도 있습니다. 아래 명령을 실행하면,
diff dir1 dir2
양쪽 디렉토리 모두, 또는 한 쪽 디렉토리에만 포함된 파일이 구분되어 표시됩니다. 동일한 이름의 서브디렉토리가 발견되는 경우, 서브디렉토리에 포함된 파일은 비교하지 않습니다. 실행 예가 아래와 같습니다:
# diff DBA102 PROPRD
Common subdirectories: DBA102/adump and PROPRD/adump
Only in DBA102: afiedt.buf
Only in PROPRD: archive
Only in PROPRD: BACKUP
Only in PROPRD: BACKUP1
Only in PROPRD: BACKUP2
Only in PROPRD: BACKUP3
Only in PROPRD: BACKUP4
Only in PROPRD: BACKUP5
Only in PROPRD: BACKUP6
Only in PROPRD: BACKUP7
Only in PROPRD: BACKUP8
Only in PROPRD: BACKUP9
Common subdirectories: DBA102/bdump and PROPRD/bdump
Common subdirectories: DBA102/cdump and PROPRD/cdump
Only in PROPRD: CreateDBCatalog.log
Only in PROPRD: CreateDBCatalog.sql
Only in PROPRD: CreateDBFiles.log
Only in PROPRD: CreateDBFiles.sql
Only in PROPRD: CreateDB.log
Only in PROPRD: CreateDB.sql
Only in DBA102: dpdump
Only in PROPRD: emRepository.sql
Only in PROPRD: init.ora
Only in PROPRD: JServer.sql
Only in PROPRD: log
Only in DBA102: oradata
Only in DBA102: pfile
Only in PROPRD: postDBCreation.sql
Only in PROPRD: RMANTEST.sh
Only in PROPRD: RMANTEST.sql
Common subdirectories: DBA102/scripts and PROPRD/scripts
Only in PROPRD: sqlPlusHelp.log
Common subdirectories: DBA102/udump and PROPRD/udump
위 결과에서 공통되는 서브디렉토리를 보고하고 있지만, 서브디렉토리의 비교는 수행되지 않고 있음을 참고하십시오. 서브디렉토리 레벨까지 파일을 비교하려면 아래와 같이 커맨드를 실행합니다:
diff -r dir1 dir2
이 커맨드는 재귀적인 방법을 각각의 서브디렉토리를 비교하고, 동일한 이름을 갖는 파일들의 차이를 보고합니다.
오라클 사용자를 위한 팁
오라클 환경에서 diff 커맨드를 활용하는 대표적인 예로 서로 다른 init.ora 파일 간의 차이를 비교하는 경우를 들 수 있습니다. 필자는 안전을 보장 위해 init.ora 파일을 변경하지 전에 항상 파일을 다른 이름으로 복사해 둡니다. (예: initDBA102.ora를 initDBA102.080306.ora로 변경하여 2006년 8월 3일 변경한 내용임을 명시해 둡니다.) 이렇게 저장된 여러 버전의 파일에 대해 diff 커맨드를 실행하여 어떤 내용이 언제 변경되었는지 확인할 수 있습니다.
diff는 오라클 Home 관리를 위한 매우 유용한 커맨드로 활용됩니다. 필자는 패치를 적용할 때 Oracle Home을 업데이트하지 않는 원칙을 세우고 있습니다. 예를 들어, 현재 오라클 버전이 10.2.0.1이라 가정해 보겠습니다. ORACLE_HOME은 /u01/app/oracle/product/10.2/db1으로 설정되어 있습니다. 여기에 10.2.0.2 버전의 패치를 적용할 때, 필자는 Oracle Home에 패치를 적용하지 않습니다. 그 대신 /u01/app/oracle/product/10.2/db2 디렉토리를 새로 구성하고 이 디렉토리에 패치를 적용합니다. 그런 다음, 아래와 같이 실행합니다:
# sqlplus / as sysdba
SQL> shutdown immediate
SQL> exit
# export ORACLE_HOME=/u01/app/oracle/product/10.2/db2
# export PATH=$ORACLE_HOME/bin:$PATH
# sqlplus / as sysdba
SQL> @$ORACLE_HOME/rdbms/admin/catalog
...
and so on.
이 방법은 기존의 Oracle Home을 건드리지 않고, 나중에 문제가 생기더라도 쉽게 환경을 복구할 수 있다는 장점이 있습니다. 또 데이터베이스의 셧다운, 재시작 과정이 매우 신속하게 진행된다는 부가적 이점이 있습니다. Oracle Home에 패치를 직접 적용하는 경우라면, 패치 애플리케이션이 실행되는 동안 데이터베이스를 내내 셧다운 상태로 유지해야 할 것입니다. 또 패치 애플리케이션이 어떤 이유로든 정상적으로 동작하지 않는다면, 온전한 Oracle Home을 다시 구성하기 어려울 것입니다.
이렇게 해서 여러 개의 Oracle Home이 만들어졌다고 가정해 봅시다. 변경된 내용을 어떻게 확인할 수 있을까요? 그 방법은 아주 간단합니다:
diff -r /u01/app/oracle/product/10.2/db1 /u01/app/oracle/product/10.2/db2 |
grep -v Common
위 명령은 두 Oracle Home 간의 차이를 비교하고, 동일한 이름을 갖는 파일 간의 차이를 비교합니다. tnsnames.ora, listener.ora, sqlnet.ora와 같은 중요한 파일에 변경된 사항이 많다면, 그 이유가 무엇인지 확인해 보아야 합니다.
cmp. cmp 커맨드는 diff와 유사합니다.
# cmp file1 file2
file1 file2 differ: byte 10, line 1
diff 커맨드는 두 파일에서 차이가 발생하는 첫 번째 위치를 반환합니다. 이 커맨드를 이용하여 파일의 내용이 다른 위치를 분석할 수 있습니다. cmp 와 마찬가지로 diff에도 다양한 옵션이 제공됩니다. 그 중 가장 중요한 옵션인 -s는 아래와 같은 코드를 반환합니다:
- 0 – 두 파일이 동일한 경우
- 1 – 두 파이에 차이가 존재하는 경우
- 다른 숫자 – 비교 작업이 수행될 수 없는 경우
실행 예가 아래와 같습니다:
# cmp -s file3 file4
# echo $?
0
특수 변수 $?는 마지막으로 실행된 커맨드에서 반환된 코드를 의미합니다. 위의 경우 0이 반환되었으며, 결국 file1과 file2가 동일함을 알 수 있습니다.
# cmp -s file1 file2
# echo $?
1
위 결과는 file1과 file2가 서로 다름을 의미합니다.
cmp 커맨드의 -s 옵션은 두 파일에 차이가 있는지의 여부만을 검사하는 스크립트에서 매우 유용합니다. 또 cmp 커맨드는 바이너리 파일을 비교하는 경우에도 사용됩니다. diff는 바이너리 파일에 대해 안정적으로 동작하지 않습니다.
오라클 사용자를 위한 팁
앞에서 설명한, 오라클 실행 파일의 relink 작업 과정에서 이전 버전의 파일을 별도 저장하는 방법에 대한 팁을 상기하시기 바랍니다. relink를 수행하는 과정에서, sqlplus 실행 파일의 이름은 “sqlplusO”로 변경되고 새로 컴파일된 sqlplus가 $ORACLE_HOME/bi에 저장됩니다. 그렇다면 새로 생성된 sqlplus가 이전 버전과 어떤 차이를 갖는지 어떻게 비교할 수 있을까요? 아래와 같이 실행하면 됩니다:
# cmp sqlplus sqlplusO
sqlplus sqlplusO differ: byte 657, line 7
이번에는 파일의 크기를 비교해 봅시다.
# ls -l sqlplus*
-rwxr-x--x 1 oracle dba 8851 Aug 4 05:15 sqlplus
-rwxr-x--x 1 oracle dba 8851 Nov 2 2005 sqlplusO
파일의 크기가 같음에도 불구하고 두 프로그램의 내용이 다르다는 사실을 cmp 커맨드로 확인할 수 있었습니다.
comm.comm 커맨드는 앞의 두 가지와 유사하지만, 결과가 탭으로 구분된 3 개의 컬럼으로 표시된다는 차이를 갖습니다. 실행 예가 아래와 같습니다:
# comm file1 file2
In file1 and file2
In file1 only
In file1 and file2
In file2 only
설명된 커맨드의 요약
|
이 커맨드는 다른 파일에 존재하지 않고 특정 파일에만 존재하는 컨텐트를 직접 확인하고자 하는 경우에 유용합니다(이런 점에서 SQL 언어의 MINUS 유틸리티와 유사합니다). -1옵션을 사용하면 첫 번째 파일에서만 확인되는 컨텐트가 표시되지 않게끔 할 수 있습니다:
# comm -1 file1 file2
In file1 and file2
In file2 only
md5sum. 이 커맨드는 파일의 32비트 MD5 해쉬 값을 생성합니다:
# md5sum file1
ef929460b3731851259137194fe5ac47 file1
동일한 체크섬(checksum)을 갖는 파일은 동일하다고 인정됩니다. 이 커맨드는 파일 간의 비교만을 위해 사용되는 것이 아닙니다. md5sum 커맨드는 파일의 무결성을 보장하기 위한 메커니즘을 제공하기도 합니다.
보호 대상에 포함되는 두 개의 중요한 파일(file1과 file2)이 있다고 가정해 봅시다. --check 옵션을 사용하면 파일이 변경되지 않았음을 확인할 수 있습니다. 먼저 두 파일의 체크섬을 생성하여 안전한 장소에 보관합니다:
# md5sum file1 file2 > f1f2
나중에 파일이 변경되지 않았음을 확인하려면 아래와 같이 실행합니다:
# md5sum --check f1f2
file1: OK
file2: OK
파일이 변경되지 않았음을 분명히 확인할 수 있습니다. 이제 파일 하나를 변경한 뒤 다시 MD5 해쉬 값을 비교해 봅시다:
# cp file2 file1
# md5sum --check f1f2
file1: FAILED
file2: OK
md5sum: WARNING: 1 of 2 computed checksums did NOT match
file1이 변경되었음을 분명히 확인할 수 있습니다..
오라클 사용자를 위한 팁
md5sum는 보안 구현 과정에서 매우 유용하게 활용됩니다. listener.ora, tnsnames.ora, init.ora와 같은 설정 파일은 오라클 인프라스트럭처에서 매우 중요하며, 잘못 변경된 경우 다운타임을 초래할 수 있습니다. 따라서 변경 관리 프로세스에 이 파일들을 포함시키는 것이 일반적인 관행입니다. 다른 사용자의 말만 믿고 이 파일이 변경되지 않은 것으로 간주하는 대신, MD5 체크섬을 사용하여 변경 여부를 검증할 수 있습니다. 변경 작업을 수행하거나 파일을 재생성해야 하는 경우, 항상 사전에 체크섬을 생성해 둡니다. 그리고 md5sum 커맨드를 이용하여 파일을 정기적으로 점검합니다. 다른 사용자가 실수로 이 파일들을 변경한 경우에도, 변경 내역을 즉각적으로 감지할 수 있습니다.
또 $ORACLE_HOME/bin 디렉토리에 존재하는 모든 실행 파일에 대해 MD5 체크섬을 생성하고 정기적으로 비교하여 불법적인 변경 작업이 발생하지 않았는지 확인할 수 있습니다.
결론
지금까지 여러분의 작업 효율성을 개선하는데 도움이 될 만한 몇 가지 Linux 커맨드를 소개 드렸습니다. 다음 연재에서는 strace, whereis, renice, skill 등 조금 더 복잡하지만 유용한 커맨드들을 소개하도록 하겠습니다.
Arup Nanda (arup@proligence.com )는 12 년 이상의 경력을 보유한 오라클 DBA로, 성능 튜닝, 보안, 재해 복구 등 다방면에 걸친 데이터베이스 운영 경험을 가지고 있습니다. 그는 PL/SQL for DBAs (O'Reilly Media, 2005)>의 공저자이며, 2003년에는 오라클 매거진의 “올해의 DBA” 상을 수상하였습니다. 또 Oracle ACE 자격증을 보유하고 있습니다.
[출처] http://www.oracle.com/technology/global/kr/pub/articles/advanced-linux-commands/part1.html
'LinuX' 카테고리의 다른 글
split 명령어 (0) | 2014.10.13 |
---|---|
고급 Linux 커맨드 마스터 가이드, 제 2 부 (0) | 2009.06.23 |
Linux find 명령어 완전 정복 가이드 (0) | 2009.06.18 |
klogin과 rlogin (0) | 2009.06.08 |
linux 파티션 나누기 (0) | 2009.05.08 |