리눅스/유닉스 QNA 게시판
제 2 장 유닉스는 없다.
0절 유닉스의 시작
1절 유닉스의 특징
2절 유닉스의 구성
3절 유닉스를 항해하자(기본 명령어)
4절 vi 에디터
5절 프로그래머를 위한 유닉스 유틸리티
0 절 유닉스의 시작
유닉스의 년대별 동향
- AT&T의 Bell 연구소. Ken Thompson에 의해 UNICS(Uniplexed Information and Computing System)
이 만들어 짐. 이후 UNIX로 이름이 바뀜
- Richie와 Thompson은 C언어로 커널을 재 작성. 이식성을 증가. 소스 배포.
- Berkeley 버젼의 유닉스 시스템이 개발
여러 유틸리티를 패키지로 묶어 BSD라 칭함
BSD의 많은 변종 중 대표적인 하나가 Sun Microsystems가 개발한 SunOS이다.
- 유닉스 시스템 III를 상업적 제품으로 판매
- AT&T사. UNIX System Release 1 을 도입
1985 UNIX System V Release 2 (시스템 관리 강화)
- UNIX System V Release 3
- UNIX System V Release 4
다양한 유닉스 버젼의 장점을 흡수하는 과정에서 네트웍 기능을 강화
(BSD, SunOS, XENIX등을 통합)
AT&T와 Sun Microsystems가 SVR4를 개발하자 경쟁 세력들이 대항하기 위해 OSF연합을 형성
- 핀란드의 University of Helsinki 대학. 23살의 Linus Torvalds 학생에 의해 LINUX 탄생.
Sun Microsystems는 OS 개발과 판매를 위해 SunSoft를 설립
이하 생략.
유닉스의 변종
Solaris UNIX System V Release + BSD 4.3 -> SunOS -> Solaris1.0
LINUX 인텔 프로세서용으로 설계. SVR4에 기반.
그외 생략.
유닉스는 1969년 AT&T사의 Bell 연구소에서 Ken Thompson이라는 사람이 MULTICS 운영체제를 본따서 만들었다. Uni 는 Multi 의 반대되는 개념으로 그 당시 MULTICS가 제대로 기능을 수행하지 못 해 최소한 한 명의 사용자는 제대로 지원하겠다는 취지로 UNIX라는 이름을 가진 운영체제가 만들어졌다. UNIX는 소량의 에셈블리어와 대부분의 C언어로 작성이 되었으며 처음부터 그 소스를 여러 기관과 대학에 공개했다. 때문에 많은 사람들이 UNIX의 어셈블리어로 된 부분만 수정을 하면 쉽게 새로운 운영체제를 만들 수 있다는 것을 알았으며, 그 후 유닉스의 변종이 수 없이 생겨기 시작했다.
현재 여러 종류의 유닉스 시스템이 존재하는 데 주로 System V와 BSD(Berkeley Software Distribution)라는 두 계열로 나누어 구분한다. System V 계열은 AT&T사가 발전 시킨 것이고 BSD 계열은 Berkly(The University of Califonia at Berkly) 대학에서 개발한 것이다.
이 두 계열을 각 각 지원하는 두 개의 연합체가 있는 데 System V 은 AT&T와 Sun Microsystems가 이끄는 UI(UNIX International) 연합이 있고 이에 대하는 세력(IBM, DEC, HP)이 형성한 OSF(Open Software Foundation)이 있다.
최근에 나오는 유닉스는 System V와 BSD 계열의 복합적인 성격을 띄고 있다.
다른 OS에 비해 유닉스의 취약점이라면 Windows의 사용자 인터페이스 환경을 따라가지는 못한다는 데 있다. 물론 유닉스에서도 다른 여러 가지 훌륭한 그래픽적인 관리 환경을 제공한다. 그러나 그것은 시스템을 직접 관리하는 관리자에게나 적합한 말이지 실제 계정을 얻어서 원격으로 접속하는 일반 사용자에게는 그런 이야기가 통하지 않는다.
뿐만 아니라 앞으로 나오게 될 윈도우98이나 윈도우 NT 5.0에서는 그 성능이나 보안적인 측면에서 현재의 유닉스보다 훨씬 뛰어날 텐데 그렇게 된다면 유닉스의 앞길은 불을 보듯 뻔하다.
만약 이러한 사태가 벌어진다면 유닉스는 어떻게 될까?
"유닉스는 없다."라는 제목을 지어놓고 많은 고민을 했다. 그러면서 이 글을 어떻게 전개해 나갈까를 덧붙여서 고민했다. 결론은 이 글을 쓰고 있듯이 현재 유닉스가 절실히 필요하다는 것을 느꼈다.
유닉스가 뛰어난 OS라는 점은 다른 OS(도스 부터 시작해서 윈도우 NT, NeXT-STEP등)들이 유닉스를 기본 모델로 채택해 만들었다는 것에서 알 수 있고 윈도우즈 NT와 유닉스만을 놓고 비교해 볼 때 쉽게 알아 차릴 수 있는 뚜렷한 성능 차이 하나는 유닉스가 지원하는 만큼 NT가 멀티유저를 지원하지 못한다는 것이다. 이와 같이 아직 까지는, 특히 인터넷에서는, 유닉스와 힘을 견줄만한 운영체제가 드물다는 것을 인정한다.
하지만 현재 유닉스는 위태로운 위기에 처해있으며 현상태로는 가다가는 곧 다른 OS에 뒤지고 말 것이다. 유닉스는 그 뿌리가 상당히 깊어 한 순간에 세상에서 사라지리라고는 생각지 않는다. 또 현재 윈도우즈 NT에서는 유닉스에서 제공하는 쿼터나 텔넷 서비스가 기본적으로 제공이 되지 않고 있다는 것을 볼 때 앞으로 얼마 동안은 유닉스가 건재하리라 생각한다. 하지만 윈도우즈 NT 4.0의 다음 버젼인 카이로(윈도우즈 NT 5.0)가 나온다면 그 때는 어떤 현상이 벌어질지 자신할 수가 없다.
유닉스를 모체로 해서 더 낳은 OS가 나오기를 바라며 이 글을 썼다.
이 글은 유닉스에서 웹 프로그래밍을 하기 위한 준비과정으로 여러분들에게 소개하는 것이다. 여러분이 작성하는 프로그램은 유닉스 웹 서버에서 돌아갈 것이므로 유닉스에 대한 기본적인 명령어는 알고 있어야 실제 프로그래밍 단계에 들어 갈 수 있다. 여기서는 여러분이 일반 유닉스 사용자로 생각하고 앞으로 꼭 필요한 내용만을 짧고 간단하게 짚고 넘어가려한다.
여기에 설명되어 있는 주 내용들은 여러 시스템의 맨 페이지를 종합하여 작성하였으며 시스템간의 차이는 나름대로 다듬었으며 대부분의 (일반 사용자로서 할 수 있는) 예는 나우누리나 하이텔과 같은 대형 호스트에서 테스트하였다.
제 1 절 유닉스의 특징
- Mulit-user, Multi-tasking
- Network (Ethernet, TCP/IP)
- 이식성(소스레벨 호환)
- 계층적 파일 구조
- 가상메모리와 Shared Library지원
- 프로세스간의 통신을 위해 Pipe 지원
제 2 절 유닉스의 구성
- Kernel (유닉스가 부팅할 때 커널을 로드)
- Shell (사용자로 부터 명령을 입력받아 해석/실행)
- Utilities 대부분의 명령이 외부 Utilitie를 실행시켜서 함.
Device
디바이스란 하드디스크, 키보드, 포트, 프린터, 화면 출력장치, 소리 출력장치 등 시스템에 설치된 여러가지 장치들을 말한다.
유닉스에서는 이러한 장치들을 하나의 파일로 다룬다.
유닉스의 파일 구조
- .은 현재 디렉토리
- ..은 상위 디렉토리
- /은 루트 디렉토리
파일이름 작성법
- 유닉스의 종류마다 다름
- . 으로 시작하는 것은 히든 파일
파일 속성
- 퍼미션 (r w x)
Pipe
프로세스간의 통신을 위해 도입된 것으로 어떤 프로세스의 표준 출력이 다른 프로세스의 표준입력으로 쓰이는 것을 말한다.
dir |sort |more
dir 의 결과인 자료들을 sort를 통해서 정렬하고 more를 통해 한 화면씩 출력한다.
Redirectioin
흔히 재지향이라고 일컬는 것을 말하며 어떤 프로세스의 표준 출력의 방향을 바꿔 주는 것이다.
cat > index.html
표준 입력, 표준 출력, 표준 에러 출력
유닉스는 대부분 C로 작성되었으며 C에서 볼 수 있는 표준 입력(stdin)과 표준 출력(stdout) 그리고 표준 에러 출력(error)을 사용자의 터미날에 기본적으로 적용하고 있다.
위에서 보았듯이 redirection 등에서 입력으로 사용되는 것이 표준 입력에 해당하며 출력은 프로그램마다 다르지만 기본 적으로 사용자 터미날에 해서 사용자가 사용할 수 있도록한다.
표준 에러 출력은 프로그램에서 에러를 출력하기 위해서 유닉스에서 제공하는 것이다. 이 또한 사용자의 터미널로 기본적으로 적용된다.
가상메모리
하드 디스크의 일부분을 메모리처럼 쓰는 것이다. 메모리 보다는 속도가 아주 느림. 그래서 많은 접근이 필요한 데이터는 메모리에 두고 적게 쓰이는 데이터는 하드디스크에 둔다.
이 때 하드 디스크에 있는 데이터를 액세스하려면 다시 메모리로 실어야하는 데 메모리와 하드디스크를 교체해 가면서 데이터를 읽기 때문에 이것을 Swapping이라 부른다.
Shared library
많이 쓰이는 루틴(함수)들을 라이브러리로 미리 만들어 놓고 필요할 때 마다 불러서 링크 해 실행 파일을 만든다면 그 라이브러리에 있는 동일한 루틴들이 각각의 실행 파일마다 중복해서 들어간다. 그렇게 되면 실행 파일의 크기가 늘어나게 되고 그에 따라 실행시간이 길어지며 시스템의 자원도 많이 사용하게 된다. 이러한 방식의 링크를 static link라 부른다.
상식적으로 생각해 볼 때 동일한 라이브러리가 다른 프로그램에서 계속 쓰인다면 특정 위치에 그것을 저장을 해 놓고 공유하도록 하면 위와 같은 문제는 해결된다는 것을 알 수 있다.
유닉스에서는 위와 같은 문제를 해결하기 위해 shared library를 개념을 사용하는 데 실행 파일을 만들 때 필요한 라이브러리의 이름만 적어 넣어 링크하면 프로그램이 실행 될 때 나머지는 운영체제가 알아서 처리한다.
사용자 관리
- 고유 ID, 패스워드, 홈 디렉토리
제 3 절 유닉스를 항해하자(기본 명령어)
현재 유닉스에서 가장 많이 쓰이는 두 가지 쉘은 bourne shell 과 C shell이다. 따라서 이 두 종류의 쉘을 가지고 비교해 가면서 설명을 하겠다.
만약 bourne shell을 쓰다가 C shell로 바꾸고 싶다면 쉘을 바꾸는 명령인 chsh 명령을 사용면 된다.
먼저 유닉스에 접속을 하면
login:
이 나타난다. 자기 아이디를 입력하면
pasword:
가 나타나는 데 자기 패스워드 입력하면 시스템에 들어간다.
프롬프트는 쉘마다 틀린데 $는 bourne shell에서 사용하며 #는 C shell에서 사용한다.
작업을 마치고 쉘을 빠져나갈 때는 logout 이나 exit, 혹은 CTRL + D 를 사용한다.
유닉스 유틸리티에서 옵션을 줄 때 - 을 사용한다. 그리고 -- 을 사용하면 긴 옵션 심볼에 해당하는 단어를 쓸 수 있다. 예를 들면 ‘gzip -h’ 대신에 ‘gzip --help’을 사용할 수도 있다.
그러나 -- 을 쓰고 공백을 한 칸 뛰우면 전혀 다른 뜻으로 그 다음부터 사용되는 -은 옵션으로 인식하지 않는다.
예를 들어 ‘cat > -abcdef’라는 파일을 작성한 뒤 ‘rm -abcdef’를 사용해 그 파일을 지우려면 옵션 a, b, c, d, 그리고 e 가 없다는 메세지가 뜬다. - 다음에 오는 것은 옵션지정으로 인식하기 때문이다. 그러나 f라는 옵션은 rm에 있으므로 당연히 뜨지 않는다. - 다음에 오는 것은 무조건 옵션으로 처리를 해 버리는 데 어떻게 -abcdef파일을 지울 수 있을까?
이럴 때 -- 를 사용하면 된다. 이 것은 그 다음에 오는 - 은 옵션으로 인식을 하지 않고 -abcdef를 파일로 인식해 지워버린다.
유닉스 시스템에서는 도스에서 사용하는 와일드 카드와 비슷한 메터문자를 제공하는 데 이는 특정 문자를 대체하기 위해 사용된다.
*는 임의의 문자열을 대신한다.
*o o로 끝나는 모든 문자열
hello* hello로 시작하는 모든 문자열
*hello* hello가 들어가는 모든 문자열
he*o he로 시작하고 o로 끝나는 모든 문자열
? 는 임의의 한 문자를 대신한다.
hel?? hel로 시작하고 뒤에 두개의 문자가 있는 모든 문자열
?ello 어떤 임으의 문자로 시작하로 반드시 ello로 끝나는 문자열
[ ]는 [와 ] 사이의 문자중 하나를 대신한다. - 를 사용해 문자나 숫자의 범위를 지정할 수 있다.
[hH]ello hello 나 Hello중 하나가 있는 문자열
[A-Z]ello Aello, Bello, ..., Zello 중 하나가 있는 문자열
[A-Za-z]ello Aello, Bello, ..., Zello, aello, bello, ..., zello 중 하나가 있는 문자열
메타 문자 외에서 먼저 설명한 Pipe나 Redirection 혹은 그룹 명령어( 괄호와 ;를 사용)를 복합적으로 사용할 수 있다.
가장 기본 적인 유틸리티
처음에는 유닉스에 쓰이는 모든 유틸리티에 대해서 모두 다룰까 생각했었는 데, 여러분들 중 처음 접하는 사람들이 있테고 혹은 기존에 유닉스를 배웠지만 어려워 포기를 한 사람들 도 있을 것이다. 이 사람들에게는 지금 부터 설명이 되는 유틸리티들이 상당히 지루할 게 느낄 것이고 어렵게 느낄 것인데 쉽게 설명하기 위하여 정말 필요한 유닉스 유틸리티만 소개하기로 한다.
과거 도스를 사용한 경험이 있다면 아래에서 설명되는 유틸리티 정도는 쉽게 익힐 수 있으리라 생각된다.
여기서 유닉스 명령이라고 사용하지 않고 굳이 유틸리티라고 부른 이유는 유닉스는 자체에서 지원되는 명령어 보다는 GNU와 같은 외부에서 많들어진 프로그램을 더 많이 그리고 표준적으로 사용하고 있기 때문이다. 지금부터는 유틸리티와 명령어라는 말을 혼용하여 동일하게 취급하겠다.
ls
ls 는 list의 약자로 도스의 dir과 비슷하다. 실제 dir이라는 명령이 있는 시스템이 있으며 둘 다 디렉토리의 내용을 보여준다.
ls 다음에 파일 이름이나 디렉토리를 적어주면 그 것들에 대한 파일 이름이 알파벳 순으로 정렬되어 나온다.
형식
ls [옵션] [파일들 or 디렉토리들]
-a 히든 파일을 보여준다.
.으로 시작하는 파일은 히든 파일로서 그냥 ls를 입력하면 화면에 나타나지 않는다.
-A -a 비슷한데 현재 디렉토리와 상위 디렉토리를 나타내는 . 이나 ..은 보여주지 않는다.
-d ls의 인자가 디렉토리인 경우 디렉토리안의 내용은 보여주지 않고, 디렉토리 이름만 보여준다.
-g 파일의 소유자는 보여주지 않고 그룹만 보여준다.
-i 파일의 i-node number 를 보여준다.
-R 재귀적으로 서브 디렉토리까지 보여준다.
-1 한 줄에 한 파일의 이름만 나타낸다.(한 칼럼으로 화면에 표시)
-l 파일들을 긴 형식으로 보여준다. (The lost list)
파일 속성, 링크된 갯수, 소유자, 그룹, 파일 크기, 마지막 갱신된 날짜/시간 그리고 파일 이름 순으로 파일에 대한 정보를 나타낸다.
-n -1과 똑 같지만 파일의 소유자 이름과 소유 그룹 이름 대신에 사용자 번호와 그룹 번호를 표시한다.
파일을 긴 형식으로 보면 맨 첫 문자는 다음중 하나가 된다.
d 디렉토리
l 심볼릭 링크
c 캐릭터 디바이스
b 블럭 디바이스
- 보통 파일
ls -lR
이 명령은 -l 과 -R을 합친 명령으로 써 하위 디렉토리의 모든 파일을 긴 형식으로 나타낸다.
아래에는 그 예로 하위 디렉토리의 모든 파일을 긴 형식으로 볼 수 있다.
$ ls -lR
.:
총 6
-rw------- 1 redpig stu 0 5월 19일 14:59 dead.letter
drwxrwxrwx 2 redpig stu 512 5월 23일 20:15 htdocs
drwxr-xr-x 2 redpig stu 512 5월 23일 20:29 tmp
-rw-r--r-- 1 redpig stu 61 5월 23일 20:29 typescript
./htdocs:
총 0
./tmp:
총 2
-rw-r--r-- 1 redpig stu 16 5월 23일 20:28 tst
ls -F
F 옵션은 파일의 속성에 따라 파일을 다르게 표시해 준다. 실행 파일은 *을 디렉토리에는 /을 심볼릭 링크에는 @을 붙임.
ls -alF
히든 파일, 긴 파일 형식, 그리고 파일 속성 옵션들이 하나로 합쳐진 것이다.
ls -1R
이 옵션은 하위 디렉토리의 모든 파일을 나타내는데 한 줄에 하나의 파일 이름만 나타낸다.
mkdir
디렉토리를 생성한다.
형식
mkdir [옵션] 디렉토리(들)
예)
mkdir redpig bluepig
현재 디렉토리에 redpig, bluepig, whitepig 디렉토리를 만든다.
다른 사용자가 디렉토리를 만들기 위해서는 상위 디렉토리의 쓰기 퍼미션이 열려있어야한다.
pwd
print working 디렉토리의 약자로서 현재 디렉토리의 절대 결로를 보여준다.(표준 출력)
cd
change working directory라는 뜻으로 디렉토리를 변경한다.
chdir, pushd, popd, 그리고 dirs가 cd 와 같은 일을 한다.
rm
remove의 약자로 파일을 지운다.
형식
rm [옵션] 파일들
-f
메세지 없이 강제로 지우기
-i
파일을 지울 때 마다 확인
-r
서브 디렉토리의 내용 까지 지운다.
rm -rf redpig
-rf 옵션은 파일을 지울 것인지 지우지 않을 것인지를 물어 보지 않고 그 하위 디렉토리까지 몽땅 지우버리므로 중요한 데이터를 한순간에 잃어 버리는 경우가 많으니 주의해서 사용하자.
rmdir
remove directory의 약자로서 디렉토리를 제거한다. 이때 디렉토리 비어있지 않다면 -r 옵션을 준다.
형식
rmdir [옵션들] 디렉토리들
cp
파일 복사
형식
cp file1 file2
cp [옵션] source_파일들 destination_directory
옵션 -r
-i
mv
디렉토리나 파일 이동
형식
mv [옵션들] oldname newname
mv [옵션들] 파일들 directory
chmod
change mode 앞에서 파일의 속성을 주는 것으로 그룹이나 다른 사람이게 어떤 읽기/쓰기/실행 중의 어떤 허가를 할 것인가를 결정한다.
4 읽기 허용
2 쓰기 허용
1 실행 허용
위의 숫자를 각각 더하여 허가 권한을 설정할 수 있다.
숫자 대신 문자를 사용할 수 있다.
r 읽기 허용
w 쓰기 허용
x 실행 허용
u 파일의 소유자
g 그룹
o 기타 사용자
a 전체
+ 설정
- 해제
= 그 모드만 설정하고 나머지는 해제
옵션에 -R 을 주면 서브 디렉토리까지 적용
chmod o-r,o-w *
chmod o-rwx *
chmod a+r *.pl
.pl 로 끝나는 모든 파일을 전체 사용자가 읽을 수 있도록 한다.
chown
change owner의 약자로서 파일이나 디렉토리의 소유자를 바꾼다.
형식
chown
chown -R redpig *
chgrp
change group의 약자로서 파일의 소유 그룹을 바꾼다.
chown이나 chgrp는 루트가 아닐 때는 사용상 여러가지 제한이 있다.
ln
링크를 만들 때 쓰는 명령이다. 링크란 하나의 파일을 두 개 이상의 이름으로 참조할 수 있게 하는 것으로 상당히 유용한 유틸리티이다. 링크에는 심볼릭 링크와 하드 링크 두 가지 타입이 있다.
유닉스 시스템에서는 사용자가 어떤 파일을 참조할 때 먼저 디렉토리에서 원하는 파일 이름의 i-node를 얻는다. 그리고 그 i-node에 적혀 있는 위치에서 데이터를 읽는다. 여기서 중요한 부분은 i-node이다. 링크를 걸면 그 파일에 대해 또 다른 이름(별명을 붙이는 것 비슷)을 부여할 수 있는 데 하드 링크를 하면 그 파일의 i-node와 링크된 새로운 파일의 i-node가 동일하다. 그러므로 파일 이름만 다를 뿐 그 외에는 모두 동일한 속성과 내용을 같는다. 만약 하드 링크된 파일의 내용을 변경한다면 링크된 다른 파일 이름으로 참조해도 변경 내용이 똑 같이 적용된다.
ls -l 명령을 하면 링크된 갯수를 볼 수 있는 데 owner 앞에 나오는 숫자가 링크의 갯수이다.
-rwx-r-x-r-x 3 redpig stu 312 Jan 31 01:12 easyMake.c
위에서 하드 링크가 세개인 것을 알 수 있다.
유닉스에서 파일을 처음 생성할 때는 파일 이름과 i-node를 연결할 수 있도록 어떤 고리를 하나 만든다. ln 명령은 그 i-node와 새로운 파일 이름 사이에 연결할 수 있는 고리를 하나 더 만드는 것과 같다.
심볼릭 링크를 하여 생성되는 파일은 원래 파일의 위치에 대한 정보를 가지는 데 원래 파일과는 다르게 취급된다.
심볼릭 링크된 파일을 참조하면 커널은 심볼릭 링크가 가지고 있는 정보를 가지고 원래 파일을 찾아 가게 되는 것이다.
심볼릭 링크된 파일은 원래 파일의 정보만 가지고 있기 때문에 지워도 원래 파일에는 아무런 손상이 없다.
디렉토리나 다른 파일 시스템에는 하드 링크를 만들 수는 없으나 심볼릭 링크는가능하다.
형식
ln [옵션] file1 [file2]
ln [옵션] 파일들 directory
처음의 경우 file1에 file2라는 새로운 링크를 만든다. 이 때 아무런 옵션없이 링크를 하면 하드 링크가 된다. file2를 생략하면 현재 디렉토리에 file1의 이름으로 생성한다.
두 번째의 경우는 여러 파일들을 하나의 디렉토리 안에 링크만든다.
-s 이 옵션을 사용하면 심볼릭 링크를 만들 수 있다.
예)
ln -s /usr/bin/* usrbin
/usr/bin 디렉토리에 있는 모든 내용을 usrbin 디렉토리에 심볼릭 링크를 한다.
cat
파일의 내용을 표준 출력으로 보내준다. 여러개의 파일 이름을 적어주면 차례로 출력시키므로 파이프나 리다이렉션을 통해 여러 파일들을 하나로 합치는 기능도 할 수 있다.
형식
cat [옵션] [파일들]
파일 이름이 정해지지 않으면 표준입력을 사용한다.
-b 줄 번호를 붙여준다.
-u 버퍼를 붙여준다.
cat > index.html
cat a.txt b.txt c.txt > d.txt
a. txt b.txt c.txt를 d.txt에 붙인다.
file
파일의 종류를 나타낸다.
도스에서는 파일 확장자로 파일의 종류를 구분하지만 유닉스에는 이에 대한 아무런 제한이 없으므로 어떤 종류의 파일인지 알아보기 위해서는 이 유틸리티가 꼭 필요하다.
형식
file 파일들
파일의 종류
directory
ascii text
commands text(shell scripts)
c program text
executable not stripped
English text
empty
등이 있다.
find
파일을 찾는데 주로 사용되며 찾은 파일로 특별할 일을 할 수 있다.
형식
find path-list [옵션들]
path-list아래의 모든 파일을 찾는다.
-name 문자열 문자열에 일치하는 파일만 찾는다.
-print 파일 이름을 보여준다.
-ls 파일 속성을 보여준다.
-exec 찾은 파일로 다른 작업을 할 수가 있다. 다른 명령을 사용할 때는 차은 파일 이름을 {}를 치환해 인수로 사용하며 그 끝은 반드시 \;로 끝나야한다.
-type 파일 유형에 따라 찾는다. 쓸 수 있는 파일 유형에는 다음과 같은 것들이 있다.
d 디렉토리
f 일반파일
l 심볼릭 링크
expr1 -o expr2 expr1이나 expr2를 만족하는 것을 대상으로 한다.
예)
find . -name ".redpig" -print
현재 디렉토리 아래(서브 디렉토리 포함)에 있는 파일들 중 .redpig로 끝나는 파일을 찾는다.
find / -name "*.redpig" -exec rm {} \;
디스크에서 *.redpig로 끝나는 모든 파일을 지운다.
find / -name \(-name *.redpig -o -name *.bluepig\) -exec rm {} \;
디스크에서 *.redpig와 *.bluepig로 끝나는 모든 파일들을 지운다.
head
텍스트 파일에서 주어진 수 만큼 행을 보여준다.
형식
head [-count] [파일들]
파일의 처음부터 count로 주어진 수 만큼의 행을 보여준다. count가 생략되면 디폴트 값으로 10이 지정되어 파일의 처음부터 10 행을 보여준다.
예)
head -5 *
현 디렉토리의 모든 파일에서 각 5줄씩 보여준다.
tail
사용 방법은 head와 같지만 tail은 파일의 끝 부터 보여준다.
형식
tail [-count][파일들]
디폴트 값은 head와 마찬가지로 10이다.
예)
head -30 redpig.txt | tail > 10 tmp.txt
redpig.txt라는 파일에서 21번째 행 부터 30번째 행까지를 tmp.txt에 저장한다.
more
cat 명령을 사용하여 파일의 내용을 볼 경우 파일의 크기가 한 화면에 다 출력이 안되면 그 내용이 지나가 버리는 데 이 명령을 써서 페이지 단위로 내용을 볼 수 있다.
형식
more [옵션] [-lines][파일들]
h 도움말
SPACE 다음 페이지
RETURN 한 줄 스크롤
q, Q 종료
b, ^B 이전 페이지를 보여준다.
/pattern pattern에 일치하는 문자열을 검색하여 해당 부분을 보여준다.
= 현재 line number를 보여준다.
:f 현재의 파일 이름과 현재 line number를 보여준다.
!cmd 새로운 shell을 구동하여 cmd를 실행시킨다.
예
more redpig.txt
wc
텍스트 파일의 단어수, 문자수, 행의 수를 알려준다.
당장 쓸모 없는 유틸리티 같으나 알아 놓으면 사당히 유용하게 쓰일 때가 있으리라 장담한다.
형식
wc [옵션들] [파일들]
-l 행 수를 센다
-w 단어 수를 센다
-c 문자수를 센다
-b bye수를 센다.
옵션 없이 실행하면 행수, 단어수, 문자수 순서를 보여준다.
예
wc redpig
123 456 789 redpig
(행수 단어수 문자수 파일이름)
wc *
현재 디렉토리의 모든 파일에 대해 행, 단어, 문자 수를 보여준다.
grep
Global Regular Expression Print 의 약자로 특정 패턴을 갖는 라인을 탐색한다.
저정한 파일에서 찾고자 하는 문자열을 검색해 있으면 화면에 출력해 준다.
만약 파일 이름이 지정되지 않으면 표준 입력을 사용한다.
형식
grep [옵션] 문자열 [파일들]
-c 파일안에 찾고자하는 문자열과 일치하는 행이 몇개인지 알려준다.
-h 여러개의 파일을 검색할 때 화면에 출력되는 내용 중 파일명을 없앤다.
-i 탐색할 때 대소문자 구별을 하지 않는다.
-y -i와 똑같다.
-n 일치하는 줄이 파일의 몇번재 줄인지를 출력한다.
-v expression과 일치하지 않는 줄만을 출력한다.
예)
grep redpig *
grep -n redpig *
찾는 문자열이 파일의 몇 번째 줄인지를 보여준다.
sort
파일의 내용을 정렬한다.
형식
sort [옵션][파일들]
파일 이름이 생략되면 표준 입력을 사용한다.
-b 선행하는 공백문자를 무시한다.
-f 대소문자를 무시한다
-r 정렬 순서를 반대로 하여 내림차순으로 정력한다.
diff
이것은 텍스트 파일을 비교한다. 예를 들어 두 파일이 내용상으로 완전히 같은데 한쪽 파일에만 빈줄이 하나 더 있다든지 하는 경우 diff는 같은 파일이라고 표시해준다.
touch
파일의 최종 수정 날짜와 시간을 바꾼다. 모든 파일은 마지막으로 수정된 날짜와 시간을 가지고 있는 데 가끔씩은 이를 현재 시간으로 갱신해야 할 때가 있는 데 이 때 자주 사용된다.
만약 저정한 파일이 존재하지 않는다면 0바이트 크기의 새로운 파일을 만들어 낸다.
형식
touch [옵션] 파일들
-c 지정한 파일이 존재하지 않는다면 0 바이트 크기의 파일을 생성하지 않는다.
script
여러분에게 아주 유용한 유틸리티를 하나 소개할까 한다.
레포트를 할 때 화면에 나오는 모든 것을 파일에 저장하거나 프린트해야 할 경우가 자주 생기는 데 유닉스에서 이런 작업을 하기에는 조금 까다로운 면이 있다.
이때 그냥 script를 입력하면 여러분 화면에 출력되는 모든 내용들이 typescript 라는 파일에 저장이 된다. 원하는 모든 것이 화면에 출력되었다면 쉘을 빠져나갈 때 쓰는 exit 명령이나 CRTL + D를 입력하면 된다.
형식
script [-a][파일]
-a 기존의 파일에 붙여 쓴다.
파일 이름을 생략하면 typescript라는 파일에 기본적으로 저장이 된다.
tar
여러개의 파일을 하나로 묶는다.
tar는 파일의 속성이나, 하드 링크, 심볼릭 링크등이 고스란히 보존되므로 어떤 디렉토리 구조를 다른 곳으로 통째로 옮기려고 할 때 아주 편리하게 쓸 수 있다.
형식
tar 명령 [파일들]
-c 새로운 tar 파일을 생성
-r 기존의 tar 파일에 새로운 파일을 추가한다.
-x tar 파일을 푼다.
-t tar 파일에 들어 있는 리스트를 보여준다.
-v 어떤 명령을 실행할 때 대상이 되는 파일을 보여준다.
-f 파일명 작업 대상이 되는 tar 파일의 이름을 지정한다.
예)
tar cvf redpig.tar *
tar xvf redpig.tar
gzip
압축률이 뛰어나서 유닉스에서 전통적으로 쓰여왔던 압축 유틸리티를 따돌리고 요즘은 거의 이 gzip 이 사용된다. 인터넷에서 사용되는 많은 파일들이 이 유틸리티를 사용해 압축되어있다. gzip 은 파일을 압축하기만 할 뿐 여러 파일을 한꺼번에 묶는 기능이 없다.
형식
gzip [옵션] [파일들]
gunzip [옵션][파일들]
-1 파일의 압축시간을 최소화 함
-9 파일의 압축을 최소화함
-r 서브 디렉토리에 있는 파일까지 재귀적으로 찾아서 압축
-c 출력을 표준 출력으로 보냄
-d 압축을 푼다. gzip에서 사용하는 옵션. gunzip에는 디폴트로 -d 옵션이 들어감.
gzip과 gunzip의 차이점이라면 -d 옵션이 기본적으로 들어 가는 것과 그렇지 않다는 것 뿐이다.
gzip redpig.tar
tar cvf - * |gzip -9 > current.tgz
현재 디렉토리의 모든 파일을 tar로 묶어 최대 효율로 압축한 후 current.tgz라는 파일에 저장한다. 보통 파일을 gzip으로 압축하게 되면 .gz가 붙게 되는 데 특별히 .tgz라는 접미어를 두어 .tar.gz 로 인식하게 할 수있다.
man
주어진 명령의 설명을 출력한다.
맨 페이지는 기본적으로 8가지의 섹션이 있는 데 그 중 첫 번째가 사용자 명령어이다.
형식
man [옵션][섹션] command
man man
매뉴얼 자체에 대한 설명을 한다.
whereis
파일에 대한 소스, 실행 파일, 메뉴얼 페이지 등이 어느 위치에 있는지 알려준다.
형식
whereis [option] 파일들
-b 실행 파일만 찾는다.
-m 메뉴얼 페이지만 찾는다.
-s 소스만 찾는다.
예)
whereis perl
which
명령어의 위치나 alias를 보여준다. 이것은 사용하고자 하는 명령어의 위치를 알고 싶을 때 사용한다.
만약 alias를 지정해 놓으면 사용자가 그 명령을 찾을 때 alias로 지정된 명령이 출력된다.
형식
which 명령들
예)
which perl
tty
컴퓨터 시스템에 연결되어 사용하고 있는 터미널의 경로 이름을 알려준다.
stty
set tty의 약자로 터미널에 관련된 사항을 세팅한다.
형식
stty [-a] [옵션]
-a 이 옵션을 주면 현재 성정된 내용을 보여준다.
echo 사용자가 입력하는 문자들을 보여준다.
-echo 사용자가 입력하는 문자들을 감춘다.(비밀번호 입력시 유용)
lcase 터미날에 나타나는 문자를 모두 대문자로 표시한다.
-lcase 터미날에 나타나는 문자를 소문자로도 나타내게 한다.
-eof End Of File. 보통 표준 입력의 끝을 나타내는 eof값을 설정한다.(^D)
stty -a
ps
process status의 약자로 현재 프로세스들의 상태를 보여준다.
BSD 계열의 형식
ps [옵션]
-a 다른 사용자에 의해서 생성된 프로세스들도 보여 줌
-u 프로세스의 소유자에 대한 정보를 보여준다.
-l 프로세스의 정보를 옆으로 길게 보여준다.
-x daemon process등의 모든 프로세스들을 보여준다.
System V 계열에서는 -x 옵션 대신에 -e 옵션을 -u 옵션 대신에 -uf옵션을 사용하면 된다.
ps -aux
시스템에서 활동하고 있는 모든 프로세스의 정보를 보여준다.
ps -au
터미날과 관련이 있는 프로세스의 정보만 보여준다.
예)
kill
실행중인 프로세스에 종료 신호를 보낸다.
csh를 사용하는 경우 PID(프로세스 아이디)대신에 작업번호를 써 줄 수도 있다.
형식
kill [-신호번호] PID들
-l 사용가능한 시그널 리스트를 보여준다.
- 그냥 kill 명령을 사용하면 프로세스가 잘 죽지 않는 경우 이 옵션을 사용한다.
su
substitue user의 약자로 다른 사용자의 권한으로 새로운 쉘을 실행시키는 것이다.
형식
su [사용자아이디]
사용자아이디를 입력하지 않으면 root의 권한으로 쉘을 실행하게 된다. exit를 하면 su를 호출하기 이전의 상태로 돌아온다.
sleep
주어진 시간만큼 실행을 중지시킨다. 주로 쉘 스크립트에서 사용됨.
형식
sleep 초
예)
sleep 5
5초 동안 잠을 잔다.
passwd
사용자의 패스워드를 바꾼다.
형식
passwd [유저]
유저를 생략하면 자기 자신의 패스워드를 바꾸게 되는 것이다.
다른 사용자의 패스워드를 바꾸는 것은 루트만이 할 수 있다.
uname
시스템에 관한 정보를 보여준다. OS 버젼이나 vender, machine type등을 알 수 있다.
형식
uname [옵션]
-m 기계의 이름을 알려준다.
-n 네트웍상에서 사용되는 도메인이름을 알려준다.
-r OS의 relaase를 알려준다.
-s 시스템 이름을 알려준다. 디폴트 옵션이다.
-v OS의 버젼을 알려준다.
-a 위의 모든 정보를 한꺼번에 보여준다.
제 4 장 vi 에디터
visual의 약자로 모든 유닉스의 표준 편집기이다. 그러므로 여러분은 이 편집기 하나면 익혀놓으면 모든 유닉스 시스템에서 공통으로 사용할 수 있는 것이다.
형식
vi [옵션][파일들]
파일이 존재하지 않으면 새로 생성한다.
vi에는 세가지 모드가 있다. 처음 vi 를 실행하면 명령모드가 되며 이 상태에서 입력 명령(i, I, a, A, o, O)을 입력하면 글을 쓸 수 있는 입력 모드로 들어가게된다. 그리고 ESC를 누르면 다시 명령모드로 돌아간다. 명령모드에서는 커서를 옮기서나 텍스트를 지우는 작업 등을 할 수있다. 명령 모드에서 : 을 입력하면 화면 아래 쪽에 : 이라고 나오며 프롬프트가 나타나는 데 이 상태가 실행 모드이다. 실행 모드에서는 파일을 저장하고 끝내거나 다른 파일을 불러와 편집을 계속할 수가 있다.
커서 이동 명령
j 아래로 이동
k 위로 이동
h 왼쪽으로 이동
i 오른쪽으로 이동
G 현재 파일의 맨 끝으로 이동
*G *번째 행으로 이동 (여기서 *은 임의의 숫자를 가리키는 것으로 만약 10G를 입력했다면 10번째 행으로 커서를 이동하는 것이된다.)
^b 한 화면 위로
^f 한 화면 아래로 이동
^u 반 화면 위로 이동
^d 반 화면 아래로 이동
e 한 단어 뒤로 이동
b 한 단어 앞으로 이동
0 줄의 제일 처음으로 이동
$ 줄의 제일 끝으로 이동
편집 상태로 진입
i 현재 커서 위치에 삽입
a 현재 커서 위치 다음에 삽입
o 현재 커서가 위치한 줄의 아랫줄에 삽입
I 현재 커서가 위치한 줄의 제일 앞에 삽입
A 현재 커서가 위치한 줄의 제일 뒤에 삽입
O 현재 커서가 위치한 줄 위에 삽입
ESC 명령 모드로 전환
복사와 붙이기
Y 현재 커서가 위치한 줄을 버퍼에 복사
yy Y와 같다.
yw 현재 커서가 위치한 단어를 버퍼에 복사
*Y 현재 커서가 위치한 줄에서 아래로 *만큼 어어를 버퍼에 복사
*yy *Y와 같다.
*yw 현재 커서가 이치한 단어로 부터 위로 *개의 단어를 버퍼에 복사한다.
p 버퍼에 들어있는 내용을 현재 커서가 위치한 줄의 아래에 붙인다.
P 버퍼에 들어 있는 내용을 현재 커서가 위치한 줄의 위에 붙인다.
지우기
x 현재 커서 위치의 한 문자를 지운다.
dd 현재 커서가 위치한 줄을 지운다.
*dd 현재 커서가 위치한 줄에서 *개 만큼의 줄을 지운다.
dw 현재 커서가 위치한 단어를 지운다.
*dw 현재 커서가 위치한 단어로 부터 *개 만큼을 단어를 지운다.
이상과 같이 지우는 경우는 버퍼에 저장이 되무르 p명령으로 복사할 수있다.
바꾸기
1,$s/정규표현식/문자열/g;
기타
^g 현재 편집하고 있는 파일의 정보를 보여준다.
u 방금한 명령을 취소한다.
. 방금 한 명령을 되풀이한다.
*. 방금한 명령을 * 만큼 되풀이한다.
J 현재 줄과 다음 줄을 합한다.
ZZ 현재 내용을 저장하고 끝낸다.
/문자열 현재 위치에서 부터 문자열을 찾는다.
/ 앞에서 찾은 내용을 다시 찾는다.
n /와 같다.
?문자열 현재 위치부터 위로 문자열을 찾는다.
예)
vi -r 파일
파일 편집 작업을 하던 중 시스템이 다운되면 파일이 손상되는 데 이때 그 파일을 복구하기 위해 사용된다.
5절 프로그래머를 위한 유닉스 유틸리티
cc
C 컴파일러
make
C 프로그램이 하나 이상의 소스로 이루어져 있을 경우 어떤 부분을 수정한 뒤 실행파일을 만들기 위해 모든 소스를 재 컴파일 한다면 시간이 많이 걸린다. 이러한 과정을 피하기 위해 변경된 파일만 골라서 컴파일 하도록 make 명령을 사용한다.
make 명령은 Makefile이라는 파일안에 정의된 규칙에 의해 컴파일 하는 데, Makefile 안에는 소스나 목적 파일을 정의해 두어 그 파일의 날짜와 시간을 검사한다. 만약 소스 파일이 수정이 되면 그 시간이 변경되므로 Makefile안에 있는 내용보다 최신의 데이터가 있다면 Makefile에 명시된데로 재 컴파일이나 재 링킹을 수행하게 되는 것이다.
xwpe
X Window Programing Environment 의 약자로 Borland C ++ 3.1의 통합환경과 상당히 흡사하다.
ar(Archive)
C 소스 파일을 실행 가능한 파일로 만들려면 먼저 preprocessing을 거친 후 컴파일링을 하고 목적파일을 만든다. 그리고 필요한 object 파일과 library를 가지고 링킹을 한다.
여기서 library는 여러개의 object 파일을 묶어놓고 필요할 때 마다 쉽게 꺼내어 사용하기 위해 만들어 놓는 것을 말하는 데 ar라는 유틸리티를 사용한다.
특히 ar은 서브루틴을 호출하기 위해 만들어 놓은 목적 파일을 하나의 라이브러리로 묶는 데 자주 사용되므로 바이너리 유틸리티라고 부르기도 한다.
ar 명령은 단순하며 실제 많이 사용되는 몇가지 옵션만 필기해 두고 필요할 때 마다 펼쳐 놓으면 된다.
형식
ar [-][옵션][멤버파일] 아카이브 파일들
아래는 기본적인 옵션만 설명해 놓았다.
r 문서의 오래된 파일을 새 파일로 교체
s 이 옵션을 주면 ar는 아카이브에 있는 문서(오브젝트 모듈)들의 심볼 테이블을 생성하고
ar 명령이 반복될 때 마다 그 내용을 업데이트 시킨다.
('nm -s'명령이나 'nm --print-armap'을 사용해서 이 인덱스 테이블을 볼 수 있다.)
t 목록표를 출력
v 자세한 보고
d 모듈을 지움
a 추가
ar 유틸리티의 간단한 예를 들어보겠다.
call.c 와 disconnect.c, 그리고 display.c 라는 세개의 소스 파일이 있다. call.c에 메인 함수가 들어 있고 gcc 나 cc 로 컴파일 한다면 'gcc -o call call.c disconnect.c display.c'정도의 명령을 내리면 된다. 또는 'gcc -c -o disc.o disconnect.c'와 'gcc -c -o disp.o display.c'와 같이 먼저 목적파일을 만들어 놓고 'gcc -o call call.c disc.o disp.o'와 같이 링크를 할 수도 있다.
만약 disconnect.c와 display.c에 있는 루틴들이 자주 사용된다면 라이브러리로 만들어 사용할 수 있는 데 아래와 같이 사용하면 된다.
ar rv calllib.a disc.o disp.o
와 같이 하면 calllib.a 라는 라이브러리가 만들어 지고 그 안에 disc.o 와 disp.o 두 개의 목적 파일이 들어가게 된다.
링킹할 때는
gcc -o call call.c calllib.a
로 하면 된다.
참고로 유닉스에서 C와 관련된 파일 확장자를 살펴보면 다음과 같다.
.a 라이브러리
.c C 소스 (확장자가 소문자)
.C C++ 소스 (확장자가 대문자)
.cc C++ 소스
.cpp C++ 소스
.cxx C++ 소스
.c++ C++ 소스
.h C나 C++의 헤더파일
.hxx C++의 헤더 파일
.o 오브젝트 모듈
.sa 프로그램에 연결된 공유 라이브러리
.m 아카이브-C 소스
.i C 전처리
.ii C++ 전처리
SUID(Set Users ID) bit
예를 들어 보자.
머드 게임을 만들 때 사용자의 정보를 userinfo 파일에 저장해 둔다면 이 파일에는 다른 사용자에게 쓰기 권한을 주어서는 안된다. 왜냐하면 불순한 마음을 가진 사람이 자기의 파워가 다른 사람보다 낮다 하여 직접 userinfo 파일을 수정해 버릴 수도 있기 때문이다. 이를 방지하기 위해 SUID가 필요하다.
형식
chmod 4*** 파일들
파일의 속성을 줄 때와 같이 chmod 명령을 사용하는 데 앞에 4을 붙여서 속성을 지정하면 된다.
만약 redpig라는 사람이 mud 프로그램을 작성 했다면 userinfo와 mud 파일의 속성은 다음과 같아야 할 것이다.
속성 소유자 파일이름
-r-x--x--x 1 redpig ... ... ... mud
-rw-r--r-- 1 redpig ... ... ... userinfo
userinfo 파일의 속성을 보면 다른 사람이 자기 정보를 기록할 수 없도록 되어있다. 하지만 userinfo 파일의 소유자인 redpig 는 userinfo에 정보를 기록할 수 있다. 여기에서 정답을 찾을 수가 있는 데 다른 사용자가 mug 프로그램을 실행할 때, 오로지 그 때만 소유자의 권한을 가지게 하면 된다.
SUID를 세트하면 소유자의 권한을 가진 다른 사용자는 오직 그 프로그램을 통해서만 userinfo에 쓸 수 있게 되는 것이다.
mud 프로그램에 SUID를 적용하면 그 속성은 다음과 같이 바뀐다.(x 가 s로 바뀌었음)
속성 소유자 파일이름
-r-s--x--x 1 redpig ... ... ... mud
여기서는 Perl 스크립트 언어를 사용하여 간단한 예를 들어 보겠다.
한가지 중요한 것은 쉘 스크립트나 기타 스크립트, 혹은 C와 같은 언어를 사용해서 작성한다 하더라도 외부 프로그램을 이용하는 경우는 그 외부 프로그램 자체에도 올바른 권한이 설정되어 있어야 SUID가 그 효력을 발휘한다.
이 프로그램의 이름은 mud이고 소유자(작성자)는 redpig이다. userinfo 안에는 사용자의 접속횟수를 기록하는 카운터가 저장되어 있는 데 이 파일은 다른 사용자에 의해 읽혀질 수도 수정될 수도 없다. 그러나 다른 사용자가 mud 프로그램을 실행 할 때는 redpig가 할 수 있는 모든 권한을 가지며 userinfo의 내용을 수정할 수가 있다.
아래는 mud와 userinfo의 속성을 나타낸것이다.
-rwsr-xr-x 1 redpig redpig 208 May 23 23:11 mud
-rwx------ 1 redpig redpig 3 May 23 23:11 userinfo
일반 사용자는 오직 mud 프로그램을 통해서만 userinfo 파일에 접근을 할 수 있다.
아래는 mud 프로그램의 소스이다.
#!/usr/bin/perl
# 파일이름 : mud
# 기능 : userinfo의 카운터를 1 만큼 증가
#FO to read
open(FH,"userinfo") or die "FOErr userinfo\n";
chop($cnt=<FH>);
close(FH);
#Count Increase!
$cnt++;
#FO to write
open(FH,">userinfo") or die "FOErr for Wring userinfo\n";
print FH $cnt."\n";
close(FH);
print $cnt."\n";
#EOP
SGID(Set Group ID) bit
SUID와 개념과 사용법이 동일하며 단지 적용되는 범위가 그룹이라는 것 밖에 없다.
형식
chmod 2*** 파일
SGID가 세팅된 파일에는 그룹의 x 위치에 s가 나타난다.
Sticky bit
스티키 비트가 세트되면 다른 사람에게 그 파일의 쓰기 권한이 열려 있다 하더라도 그 파일의 소유자나 루트가 아니면 지울 수가 없다.
예를면 교수님이나 어떤 학생이 중요한 정보를 공유하기 위해 저장해 놓은 파일이 다른 사람의 손에 의해서 지워지는 것을 막기 위해 사용된다.
형식
chmod 1*** 파일
Stick bit 가 세팅된 파일의 속성에는 T가 나타난다.
'OS' 카테고리의 다른 글
[Linux] Telnet 접속시 한글이 깨질 때 (0) | 2011.10.18 |
---|---|
리눅스 사용시 기본 명령어들 (0) | 2011.10.18 |
Linux KerneL Compile Guide (0) | 2011.10.18 |
페도라 5 커널 소스 / Fedora 5 Kernel Source (0) | 2011.10.18 |
LINUX 에서 사용자 만들기 (0) | 2011.10.18 |