운영체제에서 주어진 일을 하는 최소단위는 프로세스라는 것을 알고 있을 것이다. 프로세스는 프로그램의 실행된 이미지로 운영체제의 메인메모리에 위치한다.

이렇게 프로그램이 실행되어서, 프로세스가 생성되면 프로세스는 컴퓨터의 여러가지 기본자원을 사용할 수 있게 된다. 이 기본자원에 3개의 파일이 포함되어 있다. 바로 입력출력, 에러를 담당하는 3개의 파일들이다. 이것들을 표준입력, 표준출력, 표준에러라고 한다.

  • 표준입력 : 키보드로 부터 입력을 받기 위해서 사용한다.
  • 표준출력 : 모니터로 출력하기 위해서 사용된다.
  • 표준에러 : 에러도 역시 모니터를 통해서 출력된다는 점에서는 표준출력과 마찬가지다. 그러나 어떠한 구분도 없다면, 화면에 출력된 값이 정상적으로 처리된 메시지인지, 에러메시지 인지 확인할 수 없을 것이다. 때문에 표준에러라는 것을 따로 둬서 구분할 수 있게끔하고 있다.

이들 표준입/출력/에러 역시 파일의 형태로 다루어지며, 운영체제는 이를 위해서 예약된 숫자를 파일지시자로 할당한다. 표준입력은 0, 표준출력은 1, 표준에러는 2로 예약되어 있다.

간단한 예를 들어서 설명해보도록 하겠다.
#include <unistd.h> 
#include <string.h>

int main(int argc, char **argv)
{
char data[80];
char *msg = "Input Msg : ";
memset(data, 0x00, 80);

write(1, msg, strlen(msg)); // 1

read(0, data, 80); // 2
write(1, data, strlen(data)); // 3
write(2, "Error\n", 6); // 4
}
  1. "Input Msg"메시지를 모니터에 표준출력 한다.
  2. 표준입력을 통해서 데이터를 읽어들인다. 읽어들인 데이터는 data 에 복사한다.
  3. data에 복사된 내용을 data의 길이 만큼 모니터에 표준출력 한다.
  4. Error라는 메시지를 모니터에 표준에러형태로 출력한다.
이 프로그램을 실행시키면 다음과 같은 결과를 확인할 수 있을 것이다.
# ./write 
Input Msg : hello world
hello world
Error
  • write(2)
    이 함수는 파일지시자(첫번째 인자)가 가리키는 파일에 "쓰기" 위해서 사용한다.
  • read(2)
    이 함수는 파일지시자가 가리키는 파일에서 데이터를 "읽기" 위해서 사용한다.

표준입력과 표준출력을 이해하는데에는 별 어려움이 없을 것이다. 그럼 표준에러와 표준출력을 어떻게 구분할 수 있느냐 하는 문제가 남는다.

표준에러는 쉘의 재지향을 이용해서 따로 분리해서 읽을 수 있다. 재지향은 >을 쓰면 된다. - 2장 리눅스와 C언어참고 - 또한 2>와 같이 표준에러만을 분리해서 재지향 시킬 수가 있다. 여기에서 2가 바로 표준출력을 가리키는 파일지시자 번호다. 이제 다음과 같이 표준에러만 별도의 파일에 재지향 시켜보도록 하자.
# ./write 2> dump.log 
Input Msg : hello world
hello world
# cat dump.log
Error
표준에러가 모니터 화면이 아닌, dump.log 파일에 저장된걸 확인할 수 있을 것이다. 이로써, 표준에러와 표준출력이 모니터를 출력방향으로 하고 있지만, 명백히 구분되는 것임을 이해했을 것이다.

출처 : http://www.joinc.co.kr/modules/moniwiki/wiki.php/Site/C/Documents/CprogramingForLinuxEnv/Ch13_Input_Output

'It's IT > It's System(linux,win)' 카테고리의 다른 글

Linux 공부를 함 해볼까??????  (0) 2019.12.24
linux, unix shell script 조건문에서 사용하는 기호  (0) 2008.01.17
퍼미션, CHMODE  (0) 2007.12.14
VI명령어  (0) 2007.12.14
PING  (0) 2007.12.14

정적라이브러리

static library라고 부르기도 한다. 이 라이브러리는 단순한 오브젝트의 모음일 뿐이다. 정적라이브러리는 ar이라는 프로그램을 통해서 만들 수 있다. 그럼 ar을 이용해서 위의 사칙연산을 위한 4개의 오브젝트를 모아서 libmycalc.a라는 이름의 정적라이브러리를 생성해보도록 하자. rc 옵션을 이용하면, 정적라이브러리를 만들 수 있다.

r은 정적라이브러리를 만들겠다는 옵션이고, c는 새로 생성을 하겠다는 옵션이다.
# ar rc libmycalc.a sum.o sub.o mul.o div.o 
libmycalc.a 라는 파일이 생성된걸 확인할 수 있을 것이다. t 옵션을 이용하면, 해당 라이브러리가 어떤 오브젝트를 포함하고 있는지도 확인할 수 있다. t 옵션을 사용하면 된다. 참고로 정적 라이브러리의 이름은 libNAME.a의 형식을 따라야 한다.
# ar t libmycalc.a 
div.o
mul.o
sum.o
sub.o

그럼 정적라이브러리를 이용해서 실행파일을 만들어 보도록 하자. 이전에는 4개의 오브젝트 파일을 모두 링크시켜줘야 했지만, 이제는 libmycalc.a 만 링크시켜주면 된다.

라이브러리의 링크방식은 오브젝트를 링크하는 것과는 약간 차이가 있다. library의 위치를 명확히 명시해 주어야 한다. -L 옵션을 이용해서 라이브러리가 있는 디렉토리의 위치를 명시해주고, -l옵션을 이용해서, 라이브러리 파일의 이름을 정해줘야 한다. 다음은 simplecalc.c 를 정적라이브러리를 이용해서 컴파일하는 방법을 보여준다.
# gcc -o simplecalc simplecalc.c -L./ -lmycalc 
-L./은 현재 디렉토리를 라이브러리 찾기 디렉토리로 하겠다는 의미가 된다. -l 옵션뒤에 붙이는 라이브러리 파일의 이름에 주목할 필요가 있다. 라이브러리 이름은 lib .a를 제외한 이름을 사용한다.

공유 라이브러리

공유 라이브러리는 함께 사용하는 라이브러리라는 의미다. 즉 정적 라이브러리 처럼 실행파일에 붙는 것이 아니고, 시스템의 특정디렉토리에 위치하면서, 다른 모든 프로그램들이 공유해서 사용할 수 있게끔 제작된 라이브러리다. 그러므로 공유 라이브러리를 사용하도록 제작된 프로그램은 실행시에 사용할 라이브러리를 호출하는 과정을 거치게 된다.

공유 라이브러리역시 오브젝트를 이용해서 만든다는 점에서는 정적라이브러리와 비슷하지만, 호출시에 링크하기 위한 부가적인 정보를 필요로 하므로, 정적라이브러리와는 전혀 다른 형태로 만들어 진다. 정적라이브러리와 이름이 헛갈릴 수 있으니, 라이브러리 이름은 mycalcso 로 하겠다.
# gcc -fPIC -c sum.c sub.c mul.c div.c 
# gcc -shared -W1,-soname,libmycalcso.so.1 -o libmycalcso.so.1.0.1 sum.o sub.o mul.o div.o

  1. 오브젝트 파일을 만들때 부터 차이가 있는데, -fPIC 옵션을 줘서 컴파일 한다.
  2. 그다음 -shared 옵션을 이용해서 공유라이브러리 파일을 생성한다.
위의 과정을 끝내고 나면, libmycalcso.so.1.0.1 이라는 파일이 생성이 된다. 이 라이브러리는 프로그램을 컴파일할때와 실행시킬때 호출이 되는데, 호출될때는 libmycalcso.so 를 찾는다. 그러므로 ln 명령을 이용해서 libmycalcso.so 링크파일을 생성하도록 하자.
# ln -s libmycalcso.so.1.0.1 libmycalcso.so 
이렇게 링크를 만들게 되면, 여러가지 버전의 라이브러리 파일을 이용할 수 있으므로 관리상 잇점을 가질 수 있다. 새로운 버전의 라이브러리가 나올 경우, 오래된 버전의 라이브러리를 쓰는 프로그램은 실행시 문제가 발생할 수 있는데, 이런 문제를 해결할 수 있기 때문이다.

이제 링크하는 과정이 남았다. 링크과정은 정적 라이브러리를 사용할때와 동일하다.
# gcc -o simplecalcso simplecalc.c -L./ -lmycalcso 

이제 프로그램을 실행시켜 보도록 하자. 아마 다음과 같은 에러메시지를 만나게 될 것이다.
# ./simplecalcso 
./simplecalcso: error while loading shared libraries: libmycalc.so:
cannot open shared object file: No such file or directory

이러한 에러가 발생하는 원인에 대해서 알아보도록 하자. 정적라이브러리는 실행파일에 라이브러리가 붙여지므로, 일단 실행파일이 만들어지면, 독자적으로 실행이 가능하다. 그러나 공유라이브러리는 라이브러리가 붙여지는 방식이 아니고, 라이브러리를 호출해서 해당 함수코드를 실행하는 방식이다. 그러므로 공유라이브러리 형식으로 작성된 프로그램의 경우 호출할 라이브러리의 위치를 알고 있어야만 한다.

위의 simplecalcso 프로그램을 실행시키면, 이 프로그램은 libmycal.so 파일을 찾을 것이다. 이때 파일을 찾는 디렉토리는 /etc/ld.so.conf에 정의 되어 있다.
# cat /etc/ld.so.conf 
/usr/lib
/usr/local/lib
만약 위에서 처럼되어 있다면, 프로그램은 /usr/lib 와 /usr/local/lib 밑에서 libmycal.so 를 찾게 될 것이다. 그런데 libmycal.so 가 없으니, 위에서와 같은 에러가 발생하는 것이다.

가장 간단한 방법은 라이브러리 파일을 ld.so.conf에 등록된 디렉토리중 하나로 복사하는 방법이 될 것이다. 혹은 환경변수를 이용해서, 새로운 라이브러리 찾기 경로를 추가할 수도 있다. 이때 사용되는 환경변수는 LD_LIBRARY_PATH 다.
# export LD_LIBRARY_PATH=./:/home/myhome/lib 
이제 프로그램을 실행시키면 LD_LIBRARY_PATH 에 등록된 디렉토리에서 먼저 검색하게 되고, 프로그램은 무사히 실행 될 것이다.

공유라이브러리와 정적라이브러리의 장단점

이들 2가지 라이브러리의 장단점에 대해서 알아보도록 하자. 장단점을 알게되면 어떤 상황에서 이들 라이브러리를 선택할 수 있을지 알 수 있을 것이다.

정적라이브러리의 장점은 간단한 배포방식에 있다. 라이브러리의 코드가 실행코드에 직접 붙어버리는 형식이기 때문에, 일단 실행파일이 만들어지면 간단하게 복사하는 정도로 다른 컴퓨터 시스템에서 실행시킬 수 있기 때문이다. 반면 동적라이브러리는 프로그램이 실행될때 호출하는 방식이므로, 라이브러리까지 함께 배포해야 한다. 라이브러리의 호출 경로등의 환경변수까지 덤으로 신경써줘야 하는 귀찮음이 따른다.

일반적으로 정적라이브러리는 동적라이브러리에 비해서 실행속도가 빠르다. 동적라이브러리 방식의 프로그램은 라이브러리를 호출하는 부가적인 과정이 필요하기 때문이다.

정적라이브러리는 실행파일 크기가 커진다는 단점이 있다. 해봐야 얼마나 되겠느냐 싶겠지만, 해당 라이브러리를 사용하는 프로그램이 많으면 많을 수록 X 프로그램수만큼 디스크 용량을 차지하게 된다. 반면 공유라이브러리를 사용할 경우, 라이브러리를 사용하는 프로그램이 10개건 100개건 간에, 하나의 라이브러리 복사본만 있으면 되기 때문에, 그만큼 시스템자원을 아끼게 된다.

마지막으로 버전 관리와 관련된 장단점이 있다. 소프트웨어 개발 세계의 불문율이라면 버그 없는 프로그램은 없다이다. 어떠한 프로그램이라도 크고작은 버그가 있을 수 있으며, 라이브러리도 예외가 아니다.

여기 산술계산을 위한 라이브러리가 있다. 그리고 정적 라이브러리 형태로 프로그램에 링크되었어서 사용되고 있다고 가정해보자. 그런데 산술계산 라이브러리에 심각한 버그가 발견되었다. 이 경우 산술계산 라이브러리를 포함한 A 프로그램을 완전히 새로 컴파일 해서 배포해야만한다. 문제는 이 라이브러리가 A 뿐만 아니라 B, C, D 등의 프로그램에 사용될 수 있다는 점이다. 결국 B, C, D 프로그램 모두를 새로 컴파일 해서 배포해야 하게 된다. 더 큰 문제는 어떤 프로그램이 버그가 있는 산술계산 라이브러리를 포함하고 있는지 알아내기가 힘들다는 점이다.

공유라이브러리 형태로 작성하게 될경우에는 라이브러리만 새로 컴파일 한다음 바꿔주면된다. 그러면 해당 라이브러리를 사용하는 프로그램이 몇개이던간에 깔끔하게 문제가 해결된다.

실제 이런 문제가 발생한 적이 있었다. zlib 라이브러리는 압축을 위한 라이브러리로 브라우저, 웹서버, 압축관리 프로그램등에 널리 사용된다. 많은 프로그램들이 이 zlib를 정적라이브러리 형태로 포함해서 배포가 되었는데, 심각한 보안문제가 발견되었다. 결국 zlib를 포함한 모든 프로그램을 새로 컴파일해서 재 설치해야 하는 번거로운 과정을 거치게 되었다. 공유라이브러리였다면 문제가 없을 것이다.

이상 정적라이브러리와 공유라이브러리를 비교 설명했다. 그렇다면 선택의 문제가 발생할 것인데, 자신의 컴퓨터나 한정된 영역에서 사용할 프로그램을 제작하지 않는한은 공유라이브러리 형태로 프로그램을 작성하길 바란다. 특히 인터넷을 통해서 배포할 목적으로 작성할 프로그램이라면, 공유라이브러리 형태로 작성하는게 정신건강학적으로나 프로그래밍 유지차원에서나 좋을 것이다.

출처  : http://www.joinc.co.kr/modules/moniwiki/wiki.php/Site/C/Documents/CprogramingForLinuxEnv/Ch12_module

'It's my study ^^ 과연' 카테고리의 다른 글

TCP 헤더 구조  (0) 2007.12.15
open  (0) 2007.12.15
구조체(Struct)  (0) 2007.12.13
이중 포인터  (0) 2007.12.13
대입연산자  (0) 2007.12.12

 1. chmod
파일 또는 디렉토리의 접근 권한을 변경하는 명령이다.

1.1 chmod의 기본적인 사용법
chmod [-옵션] [모드] [파일명]

[옵션]
chmod 명령에는 몇가지 옵션이 존재하지만 -R 옵션 외에는 사용할 일이 없기 때문에 -R 옵션만 설명을 하겠다.
-R : 퍼미션 변경 대상이 디렉토리일 경우 그 하위 경로에 있는 모든 파일과 디렉토리의 퍼미션을 변경한다.
 
[모드(심볼릭)]
심볼릭 모드와 8진수 모드를 사용할 수 있는데 대부분의 사용자들은 심볼릭 모드 보다 8진수 모드를 선호한다. 그럼 심볼릭
모드부터 공부해 보도록 하자.
심볼릭 모드에서 "u = 소유자, g = 소유 그룹, o = other, a = all, r = 읽기, w = 쓰기, x = 실행"을 의미한다.
심볼릭 모드에서는 권한 추가에 대해서 '+' 를 사용하고 권한 박탈에 대해서는 '-' 를 사용한다. '=' 를 사용하면 현재 설정
된 권한은 제거되고 오직 '='로 설정한 권한만 부여한다.

file1에 대해 소유 그룹에게 쓰기 권한을 추가할 때
[root@rootman root]# chmod g+w file1

소유자에게 file1에 대해 쓰기 권한을 주고 소유 그룹에게는 쓰기 권한을 박탈할 할 때
[root@rootman root]# chmod u+w,g-w file1
--> 위와 같이 동시에 여러 대상에 대해 설정할 때는 각 대상을 콤마(,)로 구분하면 된다. 절대 공백이 들어가서는 안된다.

[모드(8진수)]

8진수 모드에서 4 = 읽기, 2 = 쓰기, 1 = 실행을 의미한다. 8진수 모드는 소유자와 소유그룹, other에 대해서 8진수 3자리로
표현하는데 첫째 자리수가 소유자를 의미하고 둘째 자릿수가 소유 그룹, 셋째 자릿수가 other을 의미한다.
예를 들어 751 라는 퍼미션은 소유자에게 7, 소유 그룹에게 5, other에게 1 에 해당하는 퍼미션을 설정한 것이다.
퍼미션의 계산은 주어진 권한에 해당하는 8진수 값을 모두 더해서(+) 설정된다.

소유자에게 읽기, 쓰기, 실행 권한을 소유 그룹에게는 읽기, 실행 권한을 other에게는 실행 권한만을 설정한 8진수 모드
소유자 = 4(읽기) + 2(쓰기) + 1(실행) = 7
소유그룹 = 4(읽기) + 1(실행) = 5
other = 1(실행) = 1
--> 이걸 정리하면 751 이라는 8진수 모드로 표현할 수 있다. 물론 초보자를 위한 설명이니까 덧셈까지 하면서 설명을 했지만 몇번 사용하다 보면 금방 익힐 수 있을 것이다.

file1에 대해 소유자에게 읽기, 쓰기 권한을 소유 그룹과 other에게는 읽기 권한을 갖도록 설정할 때
[root@rootman root]# chmod 644 file1

1.2 특별한 퍼미션 setuid, setgid, sticky bit

setuid, setgid
실행 퍼미션에는 setuid와 setgid라는 특별한 퍼미션이 있다. setuid는 심볼릭 모드로 's'로 표현되고 8진수 모드로는 4000
으로 표현된다. setuid 퍼미션이 설정되어 있는 실행 파일은 실행되는 동안에는 그 파일의 소유자 권한을 가지게 된다.
이러한 이유때문에 root 소유의 setuid 퍼미션이 포함되어 있는 파일은 아주 신중히 관리를 해야 된다. 저는 사용 안하는
setuid 실행 파일은 setuid 퍼미션을 제거해서 따로 보관하고 있습니다. setgid 퍼미션이 포함되어 있는 실행 파일은 실행되는 동안은 그 파일의 소유 그룹의 권한을 가지는 것 빼고는 setuid와 같다. setgid의 8진수 모드는 2000 이다.
setuid 퍼미션을 포함하고 있는 실행 파일을 ls -al 명령으로 확인해 보면 다음과 같이 소유자 실행퍼미션에 's'라고 되어
있는 것을 확인할 수 있다.
[root@rootman root]# ls -al /bin/su
-rwsr-xr-x    1 root     root        14112  1월 16  2001 /bin/su

setgid가 포함되어 있는 실행 파일을 ls -al 명령으로 확인하면 소유 그룹의 실행 퍼미션에 's'가 설정되어 있는 것을 확인
할 수 있을 것이다.
[root@rootman root]# ls -al /usr/bin/man
-rwxr-sr-x    1 root     root        14112  2월 5  2001 /usr/bin/man

file1 이라는 실행 파일에 setuid 퍼미션을 설정할 때
[root@rootman root]# chmod 4755 file1

▶ file1 이라는 실행 파일에 setgid 퍼미션을 설정할 때

[root@rootman root]# chmod 2755 file1

sticky bit
sticky bit도 특별한 퍼미션이다. other의 쓰기 권한에 대한 특별한 퍼미션인데 /tmp 디렉토리와 /var/tmp 디렉토리에의
퍼미션이 stickbit가 포함되어 있다. sticky bit는 8진수 모드로는 1000으로 설정되고 심볼릭 모드로는 't' 또는 'T'
로 설정된다. 이 sticky bit가 포함되어 있는 디렉토리에 other에 쓰기 권한이 있을 경우 other에 해당하는 사용자들은
디렉토리 안에 파일을 만들 수는 있어도 디렉토리 삭제는 할 수 없다.
sticky bit가 포함되어 있는 대포적인 디렉토리가 /tmp 디렉토리인데 분명히 /tmp 디렉토리의 퍼미에는 other에게 쓰기 권한이 주어져 있다. 그렇기 때문에 /tmp 디렉토리에는 누구나 디렉토리와 파일을 만들 수 있다. 하지만 other에 해당하는 사용자는 쓰기 권한이 있음에도 불고 하고 /tmp 디렉토리를 지울수 없는 것이다. 그 이유는 /tmp 디렉토리에는 sticky bit가 설정되어 있기 때문이다. 당연히 소유자는 sticky bit가 설정되어 있는 디렉토리를 삭제할 수 있다.
디렉토리가 아닌 파일에 sticky bit가 설정되어 있을 때는 other 에게 쓰기 퍼미션이 있어도 파일을 수정할 순 있지만 그 파일을 삭제할 수는 없다. sticky bit의 이런 특징을 이용하면 공개 서버에서는 여러모로 요기나게 사용할 수 있을 것이다.
sticky bit를 적용할려면 당연히 쓰기 권한도 주어야 되다.

sticky bit가 포함되어 있는 디렉토리의 ls -al 결과
[root@rootman root]# ls -ald /tmp

drwxrwxrwt   14 root     root         4096 Aug 30 02:05 /tmp

dir1 이라는 디렉토리에 sticky bit를 설정할 때
[root@rootman root]# chmod 1707 dir1    -->  또는 chmod 1777 dir1

sticky bit가 설정되어 있는 디렉토리를 other에 해당되는 사용자가 디렉토리 삭제 명령을 했을 때
[rootman@rootman /tmp]# rm -rf dir1
rm: cannot remove directory `dir1': Operation not permitted  

[rootman@rootman /tmp]# ls -ald dir1
drwx---rwt  2 root     root         4096 Aug 30 18:42 dir1

2. chattr, lsattr
루트도 지우지 못하는 파일을 설정할 수 있다는 말을 들어 본적이 있나요?
chattr을 이용하면 파일의 소유자라도 read-only로만 파일을 열수 있게 할수 있고 root도 chattr로 설정한 것을 해제하지
않으면 절대 chattr +i 로 설정한 파일을 지울 수 없다. 단, root만 사용 가능하다.
간혹 짖궂은 해커는 멍청한 관리자를 위해(?) 해킹한 시스템의 특정 파일에 chattr +i 를 설정해 놓고 chattr 명령을 모르는
관 리자가 파일을 수정할려고 끙끙 대는 모습을 즐기기도 한다. 어떤 관리자는 시스템의 문제라고 생각하고 포멧을 하는 관리자를 본적도 있다. 저의 경우는 rootman의 텔넷 서버의 guest 계정에 chattr을 적용한 적이 있다. .bash_profile, .bashrc 같은 파일에 chattr +i 를 설정해서 default 설정을 변경하지 못하도록 하기 위해 사용했었다. 또 chattr에는 파일의 수정을 추가 모드로만 열 수 있도록 설정하는 옵션도 있다.
lsattr 이라는 명령으로 파일의 chattr 모드를 확인할 수 있다.

chattr [옵션] [+=-모드] [파일명]

모드를 추가 할때는 '+모드' , 모드를 제거할 때는 '-모드'를 사용하면 되고 '=모드'를 사용할 경우 현재의 모드는 제거되고
오직 '=모드'로 설정된 모드만 적용된다.

[옵션]
-R : 대상이 디렉토리일 경우 그 하위 경로에 있는 파일과 디렉토리까지 모드를 적용한다.
[모드]
i : 파일을 read-olny로만 열 수 있게 설정한다. 링크도 허용하지 않고 루트만이 이 모드를 제거할 수 있다.
a : 파일의 수정을 할 때 내용을 추가할 수만 있다. 단, vi편집기로는 내용을 추가 할 수 없다.

file1에 i 모드를 추가할 때
[root@rootman /tmp]# chatr +i file1


file2에 a 모드를 추가할 때
[root@rootman /tmp]# chattr +a file2


파일의 chattr 모드 확인
[root@rootman /tmp]# lsattr file1 file2
---i-------- file1
----a------- file2


i 모드가 설정된 파일을 제거할려고 할 때 나타나는 메시지
[root@rootman /tmp]# rm -f file1
rm: cannot unlink `file1': 명령이 허용되지 않음

▶ a 모드가 설정된 file2 에 내용을 추가할 때
[root@rootman /tmp]# cat >> file2
a 모드가 설정되어 있는 파일.
내용을 추가합니다.
^D  
--> a 모드가 설정된 파일은 내용 추가만 할 수 있는데 vi편집기에서는 추가되지 않았다.  위의 예제에는 >>(출력 리다이렉션)을 사용해 내용을 추가 하였다.

▶ i, 또는 a 모드가 설정된 파일에 모드를 제거할 때는 '-모드' 를 이용한다.
[root@rootman /tmp]# chattr -i file1

이 글은 스프링노트에서 작성되었습니다.

'It's IT > It's System(linux,win)' 카테고리의 다른 글

linux, unix shell script 조건문에서 사용하는 기호  (0) 2008.01.17
표준입력, 표준출력, 표준에러  (0) 2007.12.14
VI명령어  (0) 2007.12.14
PING  (0) 2007.12.14
LINUX 자주쓰는 명령어  (0) 2007.12.14

 


삽입
I: 줄의 제일 앞에서 입력
A: 줄의 제일 끝에서 입력

콤보command
4w: 4단어 skip후 이동
4b: 4단어 skip후 이동
4j,h,k,l: 커서이동시 지정한 수만큼 건너뛰므로 이동을 좀 더 빨리 할 수 있다.

줄의 결합(J)
2줄이 있고, 2째줄을 1째줄 끝에 붙이고 싶다면, 1째줄에서 J를 입력하면 된다.

커서이동
0: 줄의 처음
^: 줄의 처음(글자가 시작되는 처음)
$: 줄의 끝
w: 단어단위 이동
e: w와 같으나 단어의 끝으로 이동
b: w의 반대방향으로 이동
H, M, L: 커서를 화면 상,중,하로 이동

검색(/후 검색할 단어입력)
n: 뒤로 검색
N: 앞으로 검색

매크로
ab aa aaaa: aa를 입력하면 aaaa로 자동변환

치환
s/pattern/replace:   현재줄의 첫번째 matching pattern치환
s/pattern/replace/g: 현재줄의 모든 matching pattern치환
%s/pattern/replace/g:  모든 줄의 치환
line,lines/pattern/replace: 해당 범위의 치환

저장
w>> file: 지정한 파일에 추가

윈도 split
vi내에서 위아래로 윈도가 분활되면서 2개의 파일을 동시에 open/편집할 수 있다.
ex-mode(:프롬프트상태)에서 'sp 파일이름'
윈도우가 전환은 Ctrl+ww

기타
1. d의 경우 command모드로 계속 남아 있으나 c는 삭제후 insert모드로 변환한다.
   cc, c$, cw등은 유용하게 사용될 수 있다.
2. .은 마지막 명령을 되풀이한다.

visual모드
윈도의 텍스트 에디터와 같이 선택부분이 반전되면서 복사,삭제등을 할 수 있다.
v로 visual모드로 집입하여 커서키를 사용해 원하는 부분을 선택한다.
복사는 y, 삭제/잘라내기는 d로 할 수 있다.

vi설정(vim설정)
자신의 홈디렉토리에 .vimrc를 생성하고 다음과 같이 할 수 있다.

set ai
set ts=4
set nu

각각 auto-indent, tab stop, numbering

윈도에서 작업중 vi에 붙여넣기시 계단현상발생 방지
:set paste

위치기억(UltraEdit의 ALT-F2, F2와 동일한 기능)
m{a-z}: 현재위치를 {a-z}로 북마크함
`{a-z}: 기억해둔 {a-z}로 이동. 보통 한개만 등록했다면 그냥 ``를 사용하면 된다.

레코딩
설정파일의 주석추가/삭제시 유용하게 사용할 수 있다.(이미 vi에 매크로기능이 있지만, 레코딩이 UltraEdit의 매크로기능과 유사하다.)
q{a-z}: {a-z}로 레코딩 시작. {a-z}만 가능한게 아니고 실제 {0-9a-zA-Z"}를 적기 번거로워 이렇게 표시만 한 것이다.
q:      레코딩 종료
@{a-z}: 레코딩 내용 적용(@@를 하면 바로 이전의 레코딩내용을 적용, N@@은 N으로 지정한 숫자만큼 적용)

ctags사용
쉘에서 ctags -R하여 모든 소스에 대해 인덱스 생성
vi를 실행하고 검색할 단어를 :ta tag로 지정하든지, 단어가 있는 곳에 커서를 둔다.
해당함수(오브젝트)가 정의된 곳으로 가기: Ctrl + ]
되돌아가기: Ctrl + t

여러 파일 편집
vi a.c b.c c.c와 같이 여러 파일을 지정한다.
args: 파일목록 표시
n: 다음파일 편집(vi시작지 지정하지 않는 파일은 'n 파일이름'이로 지정하면 된다.)
rew: 이전 파일 편집(vim에선 prev를 사용해도 된다)
*현재 편집중인 파일을 저장해야 다음 파일을 수정할 수 있음에 주의
(불편한 편집이 아닐 수 없다.)

여러줄을 주석으로 처리할때
10줄을 주석기호 #을 사용하여 주석처리하려면 다음과 같이 하면 된다.
우선, 첫째줄에 #를 붙이고, 두째줄로 넘어와 9.를 입력하면 된다.
.(period)는 마지막에 수행한 명령어를 반복하는 명령이다.


This article comes from dbakorea.pe.kr (Leave this line as is)

이 글은 스프링노트에서 작성되었습니다.

'It's IT > It's System(linux,win)' 카테고리의 다른 글

표준입력, 표준출력, 표준에러  (0) 2007.12.14
퍼미션, CHMODE  (0) 2007.12.14
PING  (0) 2007.12.14
LINUX 자주쓰는 명령어  (0) 2007.12.14
linux tar  (0) 2007.12.14

 

Ping은 네트워크로 연결된 두 호스트 사이에서 연결할 수 있는지 점검하는 진단도구이다. 우리가 Ping명령을 실행하면 ICMP Echo Request 패킷을 원격 IP 주소에 송신하고 ICMP 응답을 기다린다. 요즘 우리가 사용하는 ping 프로그램의 첫 버전을 만든 이는 Mike Muss이다. 그 후로 다른 많은 이들이 성능을 향상시키고, 고쳐 작성하고, 다양한 곳에 함부로 사용해왔다.

ping이라는 이름이 무엇을 뜻하는지에 대해서는 많은 의견들이 있다. 어떤 사람들은 Packet INternet Groper 라는 구문의 머릿글자를 따온 것이라 말한다. 그럴 듯 해 보이기는 하지만 맞는 말은 아니다. 사실 Ping은 소나(sonar: 수중 음파 탐지기) 추적 시스템의 소리를 흉내 내어 붙여진 이름이다.

심지어 어떤 시스템 관리자가 네트워크상의 호스트에 되풀이해서 핑을 날리고 성공할 때마다 “핑” 하는 소리가 나도록 설정한 스크립트를 만들었다는 이야기까지 있다. 그 시스템 관리자는 네트워크를 괴롭혀 온 불안정한 커넥터를 찾을 때까지 규칙적으로 그의 네트워크에 설치된 BNC 커넥터들을 점검한다 -- 소리가 멈추었을 때, 그 나쁜 놈이 걸렸다는 것을 알아냈다는 것이다.

Ping은 일반적으로 어떤 머신이 데이터를 수신하고 IP 패킷을 보낼 수 있는지 점검하는 매우 유용한 도구이다. 여러분이 호스트에 핑을 보낼 수 있다면 ftp나 http 연결도 할 수 있을 것이다. 하지만, 보안을 위해 패킷 필터링을(packet filtering) 적용하는 호스트들이 많아지면서 인터넷에서 ping은 신뢰성을 잃어간다.

많은 방화벽들이 아래에 소개한 두 가지 이유로 ICMP 패킷을 걸러내도록 규정한다.

1) 여러분의 내부 네트워크가 어떻게 생겼는지 다른 사람들이 알 필요는 없다.
2) 그리고, 모든 프로토콜이 시스템을 공격하는데 이용될 수 있다. ICMP라 해서 예외는
    아니다.

여러분의 방화벽에 ICMP를 허용하도록 결정했다면 고생길을 자청한 것이다. 이 경우 ICMP가 항상 좋은 의도로 사용된다고 가정해야 하지만, 어떻게 ICMP 기반 공격들이 없을 수 있겠는가. (예를 들어 “죽음의 핑”은 버퍼 크기를 초과하는 핑 패킷으로 공격대상의 IP 스택을 넘치게 한다 -- 때에 따라 매우 극적인 결과를 맞기도 한다). 여러분의 네트워크에서 ICMP를 허용한다면 그 틈을 타고 누군가 공격할 것은 뻔하다.

다른 목적으로 쓰기 위해 ping 명령에 특별한 기능을 추가한 도구들이 있다. 가장 일반적인 것 하나는 fping 명령이다. 이 명령은 일정한 주소 범위에 ping을 보내기 위한 명령인데 일반적으로 네트워크 스캐너로 쓰이고, 또 saint와 mon처럼 네트워크 모니터로도 쓰인다. 또 다른 변종은 외부 프로그램을 소환하지 않고 스크립트 안에서 쉽게 사용할 수 있도록 Ping 기능을 perl로 구현한 Net::Ping 모듈이다. 아래 예문에서처럼 스크립트를 사용할 수 있다:

Example 1. Using Net::Perl
 

#!/usr/bin/perl -w

use strict;
use Net::Ping;

my $host = $ARGV[0];

my $p = Net::Ping->new(“icmp”);

if ($p->ping($host)) {
     print “$host is alive.\n”;
} else {
     print “$host is not reachable.\n”;
}

 

ping at Work

Ping은 인수를 덧붙이지 않고 사용하는 것이 일반적인데 프로그램 실행을 마칠 때에는 Ctrl-c 키를 누른다. 아마 아래 예문처럼 보일 것이다:
 

[pate@cherry pate]$ ping mango
PING mango (192.168.1.1) from 192.168.1.10 : 56(84) bytes of data.
64 bytes from mango (192.168.1.1): icmp_seq=0 ttl=255 time=0.5 ms
64 bytes from mango (192.168.1.1): icmp_seq=1 ttl=255 time=0.3 ms
64 bytes from mango (192.168.1.1): icmp_seq=2 ttl=255 time=0.3 ms
64 bytes from mango (192.168.1.1): icmp_seq=3 ttl=255 time=0.3 ms
64 bytes from mango (192.168.1.1): icmp_seq=4 ttl=255 time=0.3 ms
64 bytes from mango (192.168.1.1): icmp_seq=5 ttl=255 time=0.3 ms
--- mango ping statistics ---
6 packets transmitted, 6 packets received, 0% packet loss
round-trip min/avg/max = 0.3/0.3/0.5 ms
[pate@cherry pate]$

 

이 화면은 세 개의 섹션으로 나눌 수 있다. 첫 번째 섹션은, “PING”이라는 글자로 시작하는 한 줄인데 여러분의 명령에 대한 결과를 미리 보여준다. “64 bytes”라는 문자열로 시작하는 두 번 째 섹션은 응답시간을 계산해서 보여준다. 세 번 째, “--- mango ping statistics ---”이라는 줄로 시작하는 마지막 섹션에서는 결과를 요약해서 보여준다. 위 예문에서 결과가 꽤 좋은데 잃어버린 패킷도 없고 응답시간도 빠른 편이어서 결과가 좋은 모습이다.

여러분의 네트워크를 점검하는데 싱글 패킷에 의존할 필요는 없다. 싱글 패킷보다는 다섯이나 열로 짝지어진 패킷이 훨씬 좋다. 네트워크가 혼잡한 곳에서 특히 싱글 패킷보다 더 유용한 정보를 얻을 수 있다.

ping 명령에는 몇 가지 유용한 옵션들이 있다. 이 옵션들을 아래 표에 정리했다:

< 표 1. Ping 명령의 옵션들 >
 

스위치

기능

-c count

지정한 숫자만큼 패킷을 주고 받으면 프로그램을 멈춘다.

-d

소켓에 사용되는 SO_DEBUG 기능을 켠다.

-f

할 수 있는 한 가장 빠른 속도로 패킷을 보낸다. (flood)

-i wait

패킷 사이에서 대기시간에 간격을 둔다.

-I [device]

출력 인터페이스를 지정한다.

-l preload

미리 로드한 패킷을 가능한 빨리 전송한 다음 일반 모드로 돌아간다.

-n

호스트 이름을 찾지 않고 IP 주소만 보인다. (numeric)

-p pattern

pattern은 16진수이며 pad data를 지정한다.

-q

요약한 줄만 출력한다. (quiet)

-r

패킷을 보낼 때에 라우팅 테이블을 사용하지 않고, 로컬 인터페이스에만 보낸다.

-R

라우트를 기록하는 옵션을 설정한다.

-s packetsize

보낼 패킷의 데이터 바이트 크기를 설정한다.

-T tsonly

timestamp 옵션과 함께 ping을 보낸다.

-T tsandaddr

timestapm와 주소를 모은다.

-T tsprespec[host1 [host2 [host3 [host4]]]]
 열거한 홉들에서 timestamp와 주소를 모은다.

 

이런 옵션들은 몇 개를 조합해서 더 유용하게 쓸 수 있다. 이전 섹션에서 사용한 ping 명령이 실행하고 결과를 돌려주는데 몇 초 시간지연이 있다. -f 스위치를 사용하면 명령을 기다리느라 버리는 시간을 줄일 수 있다. -c 10 옵션과 -q 옵션을 조합하면 좀더 빠르고 더 읽기 쉽게 결과를 출력한다.
 

[root@cherry /root]# ping -c 10 -fq mango
PING mango (192.168.1.1) from 192.168.1.10 : 56(84) bytes of data.

--- mango ping statistics ---
10 packets transmitted, 10 packets received, 0% packet loss
round-trip min/avg/max = 0.2/0.2/0.9 ms
[root@cherry /root]#

 

주의:  -f와 -l 스위치는 root만 사용할 수 있다. 이 스위치들을 잘못 사용하면 네트워크에
         심각한 혼란이 생길 수 있기 때문이다.

더 큰 패킷들을 사용할 경우 테스트하는 데 좀더 유리하다면, ping -c10 -s 1024 -qf 명령으로 더 큰 패킷들을 보낸다. 이 명령은 네트워크에서 발생한 문제가 패킷들이 잘게 쪼개지는 현상 때문에 발생한다고 생각할 때 특히 유용하다.

여러분의 패킷이 라우터를 통과하는지 알아보고 싶다면, ping -c10 -R 명령을 사용한다. 이 명령은 아래와 같은 메시지를 보여줄 것이다:
 

PING tbr.nailed.org (206.66.240.72) from 192.168.1.10 : 56(124) bytes of data.
64 bytes from bigfun.whirlycott.com (206.66.240.72): icmp_seq=0 ttl=239 time=217.2 ms
RR: 192.168.1.10
216.41.39.90
serial0.mmgw32.bos1.Level3.net (209.244.39.25)
208.218.130.22
166.90.184.2
so-6-0-0.mp2.NewYork1.level3.net (209.247.10.45)
137.39.52.10
180.ATM7-0.BR2.NYC9.ALTER.NET (152.63.22.229)
lo0.XR2.NYC9.ALTER.NET (137.39.4.175)

64 bytes from bigfun.whirlycott.com (206.66.240.72): icmp_seq=1 ttl=239 time=1940.8 ms (same route)
64 bytes from bigfun.whirlycott.com (206.66.240.72): icmp_seq=2 ttl=239 time=250.6 ms (same route)
64 bytes from bigfun.whirlycott.com (206.66.240.72): icmp_seq=3 ttl=239 time=230.3 ms (same route)
64 bytes from bigfun.whirlycott.com (206.66.240.72): icmp_seq=4 ttl=239 time=289.8 ms (same route)
64 bytes from bigfun.whirlycott.com (206.66.240.72): icmp_seq=5 ttl=239 time=1261.4 ms (same route)
64 bytes from bigfun.whirlycott.com (206.66.240.72): icmp_seq=6 ttl=239 time=469.4 ms (same route)
64 bytes from bigfun.whirlycott.com (206.66.240.72): icmp_seq=7 ttl=239 time=1272.3 ms (same route)
64 bytes from bigfun.whirlycott.com (206.66.240.72): icmp_seq=8 ttl=239 time=353.1 ms (same route)
64 bytes from bigfun.whirlycott.com (206.66.240.72): icmp_seq=9 ttl=239 time=1281.1 ms (same route)

--- tbr.nailed.org ping statistics ---
10 packets transmitted, 10 packets received, 0% packet loss
round-trip min/avg/max = 217.2/756.6/1940.8 ms

 

주의:  -R 스위치로 설정하는 라우트 기록 옵션은 모든 라우터와 호스트에서 환대받는 것은
         아니다. 패킷들이 네트워크를 다니는 경로를 확인하는 데 traceroute가 훨씬 좋은
         도구일 것이다.

ping 명령은 여러분 네트워크의 문제해결에 매우 유용한 도구이고, 대충 아무렇게나 사용해서는 안된다.

이 기사는 Pat Eyler와 New Riders Press가 저작권을 소유한다. 원문을 수정하거나 보태어서는 안되며, 열린 출판물 라이선스(Open Publication License)에 따라 배포된다. 이 글은 “A Practical Guide to TCP/IP”라는 이름으로 New Riders 출판에서 겨울에 출간할 리눅스 네트워킹 책에 포함될 섹션의 초고이다:

이 글은 스프링노트에서 작성되었습니다.

'It's IT > It's System(linux,win)' 카테고리의 다른 글

퍼미션, CHMODE  (0) 2007.12.14
VI명령어  (0) 2007.12.14
LINUX 자주쓰는 명령어  (0) 2007.12.14
linux tar  (0) 2007.12.14
리눅스 libc 패키지 (The Linux libc Package)  (0) 2007.12.13

 


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

크기가 가장 큰 파일, 디렉토리 찾기
가장 큰 디렉토리를 찾으려면,
du -S | sort -n

cf) 솔라리스의 경우
du -sk `ls -1 | grep '/$'`|sort +n

가장 큰 파일을 찾으려면,
ls -lR | sort +4n

디스크 Full발생시 쓸모없는 파일 제거
오브젝트파일만 제거하는 예제
find . -name '*.o' -print -exec rm -f {} \;

실행파일들 출력
find . -type f -perm +u+x -print

find의 일반적인 용례
name 파일명 지정한 파일명에 해당하는 파일을 검색
메타문자를 사용할 경우 파일명을 ''기호 내에 기입

-size  파일 크기 지정된 크기의 파일을 검색. 크기는 블록 단위, 1 블록 = 512 바이트
-mtime 숫자 지정된 날짜 이전에 수정된 파일을 검색
-ctime 숫자 가장 최근에 변경된 것이 지정된 날짜 전인 파일 검색
-user  사용자명 지정된 사용자 수용의 파일 검색
-print 검색 결과를 화면에 표시
-atime 숫자 지정된 날짜 이전에 접근 된 파일을 검색
-perm  접근권한 지정

-type 파일 유형 지정된 유형의 파일을 검색
b: 블록 특수 파일
c: 문자 특수 파일
d: 디렉토리
f: 일반파일
l: 링크파일
p: 파이프 파일

-exec 명령어 {} \;
실행 결과를 입력 파일로 받아들여 명령어 실행.
명령어의 끝은 \;
{} : 현재 경로명으로 대치

현재 디렉토리의 크기만을 파악할때
[root@dev2 local]# du -c -h --max-depth=0 *
6.4M    apache
35M     bin
43M     dns
1.7M    doc
42k     etc
1.0k    games
42k     geektalkd
1.1M    gnuws
1.1M    include
41k     info
19M     jakarta-tomcat-3.2.3
0       jre
15M     jre118_v3
25M     lib
62k     libexec
1011k   man
1.3M    mm.mysql.jdbc-1.2c
937k    sbin
3.8M    share
1.8M    shoutcast-1-8-3-linux-glibc6
5.2M    ssl
159M    total

시스템 정보 감추기
/etc/inetd.conf 파일을 열어서,
telnet stream tcp nowait root /usr/sbin/tcpd in.telnetd -h


어떤 프로세스가 메모리를 가장 많이 잡아먹고 있는지 알아내기
ps -aux | sort +4n
또는
ps -aux | sort +5n

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


원하지 않는 사용자 죽이기
[root@dream /root]# skill -KILL sunny
위의 명령을 내리면 sunny 라는 사용자를 완전히 추방시킬수 있습니다.
그런데 이렇게 완전히 추방시키는게 아니구, 특정 터미널에 접속해있는 사용자만 추방시켜야 할 때도 있겠죠?
그럴때는

[root@dream /root]# skill -KILL -v pts/14
이런식으로 하면 된다 그럼 pts/14 에 연결되어 있는 사용자가 죽게 됩니다.

less 결과를 vi로 보기
less상태에서 v를 누르면 바로 vi로 감


vi에서 블럭 설정하기
alt+v 하면, 라인 단위로 블럭 설정을 할 수 있으며, 해제 하시려면 Esc를 누르면 됩니다.

또한 ctl+v를 하시면, 블럭 단위로 블럭을 설정하실 수 있습니다.

블럭을 설정 하신 뒤,

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

man 페이지 프린트하기
vi에 대한 매뉴얼을 ps(postscript파일)로 저장
man -t vi > vi.ps

man 페이지를 일반파일로 갈무리하려면 man vi | col -b > aa.txt

ping 무시하기
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all
echo 0 > /proc/sys/net/ipv4/icmp_echo_ignore_all

동시에 여러개의 하위 디렉토리 만들기
mkdir -p music/koreanmusic/ost

리로 다시 살리기
boot : vmlinuz root=/dev/hda6

특정 사용자 ftp 접근 막기
/etc/ftpusers 파일에 로그인 네임을 추가하면 됩니다.

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

TV 카드를 리눅스에 인식시키기 위해서 /etc/conf.modules 파일에 다음과 같은 내용을 삽입하고 컴퓨터를 다시 시작합니다.

alias char-major-81 bttv

# 필립스 튜너의 경우 pre-install bttv modprobe -k tuner

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

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

ls라는 파일이 포함된 rpm패키지 찾기
일단 ls의 절대경로를 알아야 한다. which ls
which로 알아낸 ls의 절대경로로 rpm질의를 한다.rpm -qf /bin/ls
[root@piruks /etc]# which ls
/bin/ls
[root@piruks /etc]# rpm -qf /bin/ls
fileutils-4.0i-2mz

현재 rpm패키지의 의존패키지
rpm -qR 패키지명

현재 디렉토리크기
du -h --max-depth=1 .

바로 이전 디렉토리로 가기
cd -

프로세스명으로 프로세스 죽이기
[리눅스]
killall 프로세스명
kill -9 `pidof 프로세스명`

하드웨어 시계맞추기
배포본을 설치하고 나면 시간이 맞지 않는 경우가 많다.
간단히 어느정도 정확한 시간을 설정하는 방법이다.
[root@dev /down]# rdate -s time.kriss.re.kr
[root@dev /down]# clock -w

원격에서 리모트서버의 X application실행시
X윈도 app를 실행할때 다음과 같은 에러가 나면 조치
[kang@dev /home/kang] xclock
Xlib: connection to "211.222.186.170:0.0" refused by server
Xlib: Client is not authorized to connect to Server
Error: Can't open display: 211.222.186.170:0.0

export DISPLAY=211.222.186.170:0
xhost +211.222.186.170

파일내 문자열 치환
mysql에 replace라는 프로그램이 딸려있다.

현재 디렉토리내 모든 파일에서 a를 b로 변경
replace a b -- *

현재 디렉토리내 모든 파일에서 a는 b로, b는 a로 변경
replace a b b a -- *

하위 디렉토리를 포함하여 위의 작업을 할때
replace a b -- `find . -type f -name '*' -print`
or
find . -type f -name '*' -exec replace a b -- {} \;

PERL로 한다면 다음과 같이 해도 된다.
find . -type f -name '*' -exec perl -pi -e 's/a/b/g' {} \;

ex)
find . -type f -name '*.html' -exec /usr/local/mysql/bin/replace myunggyu@orgio.net kang@dbakorea.pe.kr -- {} \;

ISO이미지 만들기
/down/Disk1 디렉토리의 내용을 Linux9i_1.iso라는 ISO이미지파일로 만든다.
mkisofs -r -o Linux9i_1.iso /down/Disk3

위에서 만들어진 Linux9i_1.iso파일을 레코더로 구울때
cdrecord -v -isosize speed=12 dev=0,0 Linux9i_1.iso

XMMS에서 한글출력
메뉴중 옵션-선택사항-폰트'에 다음과 같이 지정
옵션: 폰트셋 사용하기(멀티바이트 지원설정) 체크
연주목록에 다음과 같이 설정
-adobe-helvetica-bold-r-*-*-10-*, -baekmuk-gulimbdf-medium-r-normal-*-*-120-*-*-m-*-ksc5601.1987-0

기본창- X폰트사용 체크 하고 다음과 같이 설정
-adobe-helvetica-medium-r-*-*-8-*, -baekmuk-gulimbdf-medium-r-normal-*-*-120-*-*-m-*-ksc5601.1987-0

ISO파일 처리
CD이미지(ISO 9660) 만들기
dd if=/dev/cdrom of=ora817.iso
or
mkisofs -R -V Oracle817 -o ora817.iso /dev/cdrom
  
CD이미지(ISO 9660) 마운트
mount -r -t iso9660 -o loop ora817.iso /mnt/iso

CD이미지(ISO 9660) 굽기
cdrecord -scanbus로 가능한 dev파악
cdrecord -v -eject speed=12 dev=0,0,0 ora817.iso


file: 파일의 종류와 정보를 알려준다.

[kang@ns work]$ file signal_reset.c
signal_reset.c: C program text

[kang@ns work]$ file signal_reset
signal_reset: ELF 32-bit LSB executable, Intel 80386, version 1, dynamically linked (uses shared libs), not stripped


stat: Unix system함수인 stat(fstat)가 가지는 정보를 보여주기 위해 명령어로 구현되어진 것

[kang@ns work]$ stat signal_reset.c
File: "signal_reset.c"
Size: 175 Filetype: Regular File
Mode: (0664/-rw-rw-r--) Uid: ( 512/ kang) Gid: ( 512/ kang)
Device: 3,7 Inode: 96199 Links: 1
Access: Wed Oct 18 21:12:01 2000(00000.00:01:33)
Modify: Wed Oct 18 21:11:43 2000(00000.00:01:51)
Change: Wed Oct 18 21:11:43 2000(00000.00:01:51)

[kang@ns work]$ stat signal_reset
File: "signal_reset"
Size: 11991 Filetype: Regular File
Mode: (0775/-rwxrwxr-x) Uid: ( 512/ kang) Gid: ( 512/ kang)
Device: 3,7 Inode: 96198 Links: 1
Access: Wed Oct 18 21:12:06 2000(00000.00:01:30)
Modify: Wed Oct 18 21:11:50 2000(00000.00:01:46)
Change: Wed Oct 18 21:11:50 2000(00000.00:01:46)


reset: 키보드설정 reset(? 매뉴얼에도 없다. 잘모르겠다.)

[kang@ns work]$ reset
Erase is delete.
Kill is control-U (^U).
Interrupt is control-C (^C).

whatis : whatis데이터베이스에서 완전한 단어를 검색한다.
ex) whatis ls whereis

apropos : whatis데이터베이스에서 문자열을 검색한다. man -k와 같다.
ex) apropos socket

whereis : 바이너리,소스,매뉴얼 파일의 위치 출력
ex) whereis cp

cal : 달력 출력
ex) cal 2004   : 2004년 달력 출력
     cal 5 2004 : 2004년 5월 달력 출력
    
tty : 자신이 사용하는 터미널명을 출력. kill명령으로 해당 터미널유저를 처리할때 쓰도록..




쉘에서...

?은 한문자를 의미
*은 모든 문자를 의미

ls dbakorea[0-9] : dbakorea0 ~ dbakorea9
ls dbakorea[09]  : dbakorea0, dbakorea9


SORT
[kang@dbakorea test]$ cat sort.dat
aaa,강명규,관리자
ccc,홍길동,도둑놈
bbb,강감찬,장군
ddd,임꺽정,도적놈
[kang@dbakorea test]$ sort sort.dat
aaa,강명규,관리자
bbb,강감찬,장군
ccc,홍길동,도둑놈
ddd,임꺽정,도적놈
[kang@dbakorea test]$ sort -t , +1 sort.dat 2번째 컬럼을 기준으로 정렬. -t는 필드구분자로 콤마 지정
bbb,강감찬,장군
aaa,강명규,관리자
ddd,임꺽정,도적놈
ccc,홍길동,도둑놈

대소문자 변환
[kang@dbakorea test]$ tr "[a-z]" "[A-Z]" < sort.dat
AAA,강명규,관리자
CCC,홍길동,도둑놈
BBB,강감찬,장군
DDD,임꺽정,도적놈

PASTE
[kang@dbakorea test]$ cat > paste.data1
홍길동
이순신
김유신
[kang@dbakorea test]$ cat > paste.data2
부산
서울
대구
[kang@dbakorea test]$ paste paste.data1 paste.data2
홍길동  부산
이순신  서울
김유신  대구
[kang@dbakorea test]$ paste -d"\n" paste.data1 paste.data2
홍길동
부산
이순신
서울
김유신
대구
[kang@dbakorea test]$ paste -s -d"::\n" paste.data1
홍길동:이순신:김유신
[kang@dbakorea test]$

JOIN : DBMS의 조인기능과 유사
[kang@dbakorea test]$ cat > join.data1
maddog:강명규
gildong:홍길동
superman:슈퍼맨
batman:배트맨
[kang@dbakorea test]$ cat > join.data2
maddog:DBA    
maddog:Programmer
superman:Hero
batman:American Hero
[kang@dbakorea test]$ join -j1 1 -j2 1 -t: join.data1 join.data2
maddog:강명규:DBA
maddog:강명규:Programmer
superman:슈퍼맨:Hero
[kang@dbakorea test]$


SPLIT
[kang@dbakorea test]$ split -100000 wf_cleaner_20040418.log wf_cleaner_            
[kang@dbakorea test]$ ls -l
총 322816
-rw-r--r--   1 sky      other    82509153  4월 21일  16:15 wf_cleaner_20040418.log
-rw-r--r--   1 sky      other    4817168  4월 21일  16:16 wf_cleaner_aa
-rw-r--r--   1 sky      other    4826953  4월 21일  16:16 wf_cleaner_ab
-rw-r--r--   1 sky      other    4819016  4월 21일  16:16 wf_cleaner_ac
-rw-r--r--   1 sky      other    4818664  4월 21일  16:16 wf_cleaner_ad
-rw-r--r--   1 sky      other    4815234  4월 21일  16:16 wf_cleaner_ae
-rw-r--r--   1 sky      other    4826339  4월 21일  16:16 wf_cleaner_af
-rw-r--r--   1 sky      other    4822263  4월 21일  16:16 wf_cleaner_ag
-rw-r--r--   1 sky      other    4814657  4월 21일  16:16 wf_cleaner_ah
-rw-r--r--   1 sky      other    4816299  4월 21일  16:16 wf_cleaner_ai
-rw-r--r--   1 sky      other    4817442  4월 21일  16:16 wf_cleaner_aj
-rw-r--r--   1 sky      other    4807225  4월 21일  16:16 wf_cleaner_ak
-rw-r--r--   1 sky      other    4816881  4월 21일  16:16 wf_cleaner_al
-rw-r--r--   1 sky      other    4805557  4월 21일  16:16 wf_cleaner_am
-rw-r--r--   1 sky      other    4824945  4월 21일  16:16 wf_cleaner_an
-rw-r--r--   1 sky      other    4800172  4월 21일  16:16 wf_cleaner_ao
-rw-r--r--   1 sky      other    4813110  4월 21일  16:16 wf_cleaner_ap
-rw-r--r--   1 sky      other    4795892  4월 21일  16:16 wf_cleaner_aq
-rw-r--r--   1 sky      other     651336  4월 21일  16:16 wf_cleaner_ar
[kang@dbakorea test]$ cat wf_cleaner_a[a-r] > wf_cleaner_orig
[kang@dbakorea test]$

CUT : 컬럼단위 필터링 cf) grep은 행단위 필터링
필드,문자단위로 컬럼 출력
[kang@dbakorea test]$ cat sort.data
aaa,강명규,관리자
ccc,홍길동,도둑놈
bbb,강감찬,장군
ddd,임꺽정,도적놈
[kang@dbakorea test]$ cut -f1,3 -d , sort.data 1,3번째 필드만 출력. 필드구분자는 콤마
aaa,관리자
ccc,도둑놈
bbb,장군
ddd,도적놈
[kang@dbakorea test]$ cut -c5-7 sort.data  5~7컬럼값 출력
강명규
홍길동
강감찬
임꺽정


EGREP
grep과 달리 Regular Expression을 지원한다.

b                        : 일치되는 행의 블록 번호 출력                  
c           : 문자열을 포함하는 행수 출력                    
h           : 파일 이름을 출력하지 않음                      
i           : 대소문자를 구별하지 않음                      
l           : 문자열을 포함하는 파일 이름만 출력            
n           : 일치되는 행번호를 함께 출력                    
s           : 오류가 발생할 경우에만 메시지 출력            
v           : 일치되지 않는 행만 출력                        
w           : 문자열이 하나의 단어인 경우만 검색(grep만 가능)
e 표현식    : 정규 표현식이 - 문자로 시작할 때 유용          
e 문자열    : fgrep에서만 사용, 문자열은 단순 문자열을 의미  
f 파일명    : 검색문자열을 파일명으로 부터 받아들임          

^  : 행의 시작
$  : 행의 끝
.  : 임의의 한문자
[] : []속에 표현되는 문자 중 임의의 한 문자
*  : * 앞의 정규표현식이 0회 이상 나타남
+  : + 앞의 정규표현식이 1회 이상 나타남(egrep에서만 가능)
?  : ? 앞의 정규표현식이 0 또는 1회 나타남(egrep에서만 가능)
\  : 메타문자의 의미 제거(예 : '\*'는 *문자를 의미)
|  : 문자열간의 OR연산자(egrep에서만 가능)
() : 정규 표현식을 둘러 쌈(egrep에서만 가능)

[kang@dbakorea test]$ cat sort.data
aaa,강명규,관리자
ccc,홍길동,도둑놈
bbb,강감찬,장군
ddd,임꺽정,도적놈
[kang@dbakorea test]$ egrep '강명규|강감찬' sort.data
aaa,강명규,관리자
bbb,강감찬,장군

This article comes from dbakorea.pe.kr (Leave this line as is)

이 글은 스프링노트에서 작성되었습니다.

'It's IT > It's System(linux,win)' 카테고리의 다른 글

VI명령어  (0) 2007.12.14
PING  (0) 2007.12.14
linux tar  (0) 2007.12.14
리눅스 libc 패키지 (The Linux libc Package)  (0) 2007.12.13
리눅스 디렉토리  (0) 2007.08.17

 

tar

여러개의 파일을 하나로 묶는 명령어이다.
압축명령어라고 잘못알고 계시는 분들이 있는데, tar는 분명 여러개의 파일을 하나로 묶어주는 일종의 유틸리티라고 할 수 있다.
하지만, 거의 대부분 tar는 gzip이나 compress등과 같은 압축유틸리티와 함께 사용을 하는 것이 일반적이다.

또한 tar옵션에는 z라는 옵션이 있기 때문에 tar명령어만으로 압축하고 풀 수 있기때문에 tar만으로도 효율적인 파일관리를 할 수있다.


사용형식

 파일묶기       : tar cvf 파일명.tar 파일(디렉토리)
 묶은컥瞿릴?  : tar cvf 파일명.tar
 파일풀기       : tar xvf 파일명.tar

 묶고압축하기     : tar cvfz 파일명.tar.gz 파일(디렉토리)
 묶고압축된 파일 보기 : tar tvfz 파일명.tar.gz 
 묶고압축된파일 풀기 : tar xvfz 파일명.tar.gz

이 글은 스프링노트에서 작성되었습니다.

'It's IT > It's System(linux,win)' 카테고리의 다른 글

VI명령어  (0) 2007.12.14
PING  (0) 2007.12.14
LINUX 자주쓰는 명령어  (0) 2007.12.14
리눅스 libc 패키지 (The Linux libc Package)  (0) 2007.12.13
리눅스 디렉토리  (0) 2007.08.17


libc: ISO 8859.1, , YP 함수들, crypt 함수들, 기본적인 Shadow 루틴들 (기본적으로는 포함되지 않음), ... libcompat에 있는 호환성을 위한 기존의 루틴들 (기본적으로 수행되지 않음),영어,불어 또는 독어 에러 메세지들, libcourses에 있는 bsd 4.4 lite와 호환성 있는 화면 핸들링 루틴들, libbsd에 있는 bsd와 호환되는 루틴들, libtermcap에 있는 화면 핸들링 루틴들, libdbm에 있는 데이타베이스 관리 루틴들, libm에 있는 수학계산 루틴들, crt0.o???에 있는 프로그램 실행을 위한 항목, libieee???에 있는 바이트 sex 정보 (우스운 ???를 대신할 정보를 보내주세요.), libgmon에 있는 사용자 공간 프로파일링(Profiling). 리눅스 libc 개발자들 중 누군가가 이 장을 써 주기를 바랍니다. 지금 내가 말할 수 있는 것은 실행할 수 있는 형태인 a.out이 공유 라이브러리 만들기의 변화를 의미하는 elf(executable and linkable format)으로 바뀔 것이라는 것뿐이다. 현재는 두 형태(a.out과 elf)가 모두 지원된다.

'It's IT > It's System(linux,win)' 카테고리의 다른 글

VI명령어  (0) 2007.12.14
PING  (0) 2007.12.14
LINUX 자주쓰는 명령어  (0) 2007.12.14
linux tar  (0) 2007.12.14
리눅스 디렉토리  (0) 2007.08.17

+ Recent posts