기본 콘텐츠로 건너뛰기

Linux Command 5

square72_blue.gif 리눅스 셀의 사용법

1. 쉘의 개념

1) 쉘 : 쉘(shell)은 유닉스 명령어 해석기입니다. 도스에서 COMMAND.COM이라는 프로그램의 역할과 유사한 일을 합니다. 이러한 쉘은 커널 위에서 커널과 통신하면서 사용자가 내리는 명령을 수행하는 역할을 합니다. 리눅스에서는 bash(Bourne Again Shell)를 기본 쉘로 사용하며 이러한 bash말고도 다른 유닉스 계열에서 만들어진 것으로는 BSD 계열에서 만든 csh(C shell), 이 csh을 확장한 tcsh(TENEX C shell), AT&T유닉스에서 만들어진 ksh(Korn Shell) 등이 있습니다. 이러한 쉘 중 bash는 리눅스의 대표적 쉘로 GNU 프로젝트의 산물로 만들어졌다. bash는 POSIX 1003.2 쉘 표준에 따라 Korn Shell과 SystemⅤ의 쉘에서 장점을 따서 만들어졌다. 유닉스에서는 기본 쉘로 알려진 sh(Bourne shell)과 호환성을 유지하고 있으며 sh보다 많은 기능들이 추가되어 있습니다. 쉘은 이름 그대로 껍데기입니다. 중앙의 알맹이 부분에는 운영체제의 근간을 이루는 커널(Kernel)이 있다. 사용자는 이 커널에 직접 명령을 내리기 어렵기 때문에 커널에 줄 수 있는 명령을 사용자가 쓰기 편하도록 만들어 놓은 명령어 해석기가 필요한 것이다. 그것이 바로 쉘의 필요성이자 쉘의 역할이다.UNIX System은 Kernel, Shell, Utility의 3부분으로 구성된다.

2) Kernel : UNIX OS의 실제 부분으로 파일시스템, CPU, 메모리 관리, 시스템 호출을 통한 기타 운영체제의 기능들을 제공한다. DOS의 msdos.sys, io.sys에 해당되는 부분으로 생각하면 된다.

3) Shell : 사용자와 Kernel 사이에 위치해서 둘 사이의 Interface의 역할과 해석기 역할을 하는 것으로 DOS의 command.com에 해당하는 부분이다. shell은 login 하게되면 자동적으로 형성되어 명령어를 해석할 수 있는 상태를 만들어 준다.

4) Utility : UNIX의 실제 명령어들에 해당되는 부분이다.

2. 쉘의 설정(bash를 기준)

1) 자신의 쉘이 무엇인가 알아보기: $ echo $SHELL

2) 프롬프트 바꾸기: PS1이라는 쉘의 변수를 바꾸어준다. 여기서 \u는 사용자이름(아이디), \h 호스트이름, \W는 현재 디렉토리명을 나타낸다. 이러한 설정을 매번하는 수고를하지 않으려면 /etc/profile이나 자신의 홈 디렉터리에 위치한 .bashrc_profile 혹은 .bashrc 파일을 위와 같이 수정하면 된다. 로그인 쉘로 부팅시에는 .bashrc_profile나 /etc/profile을 수정해야만 효과가 나타난다.

- # PS1="[\u@\h \W]\\$"

3) 프롬프트 변수 목록

\t

현재 시간을 보여준다 (시:분:초)형식

\d

오늘 날짜, 요일을 보여준다 (요일 월 일 형식)

\n

개행문자 (새로운 행으로 넘어간다)

\s

현재 쉘의 이름

\w

현재 작업 디렉터리의 이름 (전체 경로 포함)

\W

현재 작업 디렉터리의 이름 (전체 경로는 생략하고 현재 위치만)

\u

사용자 이름

\h

호스트 이름

\#

쉘이 기동한 후로부터 명령의 번호

\!

실행하는 명령의 history 번호

\$

프롬프트 모양 uid가 0,즉 root면 #으로 나타나고 그외의 사용자는 $로 나타난다.

\nnn

ASCII코드 nnn에 해당하는 문자

\\

back slash (빽슬레시)

\[

제어 문자로 쓸 수 없는 문자를 사용하기 위해서는 [로 시작하여 문자를 입력한다.

\]

제어문자의 끝

3. 기본적인 쉘의 사용법

1) 여러 개의 파일을 한꺼번에 다루기: globbing

- 도스에서 와일드카드 문자(*)를 들어 보았을 것이다. 리눅스에서는 이를 globbing이라한다. 리눅스에서는 도스 보다 더 다양한 기능을 제공한다.

- '*'는 도스에서 처럼 임의 길이의 파일명에 대응한다.

'?'는 임의의 한 글자에 대응한다'.

'[]'는 괄호 안의 문자 중에 하나와 대응한다.

- 활용예: # ls *.hwp

2) 두 가지 이상의 프로그램을 연계하여 실행하기: PIPE 기능

- 파이프는 두 프로그램간을 연결할 수 있는 방법을 의미하며, 리눅스 커널 내에서는 두 어플리케이션을 연결할 수 있는 통신 채널을 의미한다. 단순한 byte단위의 데이터를 전송할 수 있지만, 이것을 사용하여 여러 가지 다양한 일을 할 수 있다. 쉘에서 제공하는 가장 좋은 기능 중의 하나가 파이프 기능이다. 이 기능 역시 도스에서 사용 가능하나 리눅스에서 사용하는 것이 더욱 다양하고 편리합니다. 예를 들어서 사용법을 설명하겠다. 어떤 문서 파일에서 특정 문자 열을 골라내어서 그 문자 열이 나타나는 행의 수를 알아 내려면 다음과 같이 한다.

# grep JACK.POT 크래*

*** JACK과 JACK.POT 이 두 화일들은 서로 같은 디렉토리에 있어야 합니다.

*** 또 다시 크랙하지 않기 위해 검사하는데에 JACK.POT라는 화일을 사용합니다.

# wc 크래*

# grep JACK.POT 크래* | wc -l (※wc -l : wc의 결과 중에 행 수만 나타냄)

# wc -l /etc/passwd

# wc -l /bin >out

# wc -l out

# ls -l /etc | wc -l : 파이프를 활용하여 특정디렉토리의 파일 수을 파악할 때

# cat /etc/passwd

# awk -F: '{print $1}' /etc/passwd : 시스템 사용자의 계정명만 추출할 때

# who | awk '{print $1} : 누가 접속하고 있는지 계정명만 추출할 때

# who | awk '{print $1} | sort : 위의 경우에 소트하여 보고 싶을 때

# cat /etc/passwd | awk -F: '{print $1}' | sort

3) 명령어의 출력을 파일로 저장하거나, 파일을 명령어의 입력으로 바꿔주기: REDIRECTION 기능

- 파이프 기능과 함께 쉘에서 제공하는 대표적인 기능이다. 역시 도스에서도 사용 가능하다. 쉘에서 입력하는 명령의 출력을 파일로 저장하고 싶은 경우가 있다. 예를 들면 자신의 인터넷 연결 상태를 문서로 만들어서 인터넷 서비스 업체에게 증거로 보여줄 필요가 있다면 다음 처럼 하면 된다. 이때 화면에는 아무 것도 출력되지 않는다. 즉, 화면으로 내보내야하는 표준 출력을 ping.txt 라는 파일로 바꾸어 전달했기 때문이다. ping.txt 파일을 more로 보면 화면에 표시 되었어야할 내용이 있을 것이다. '>>'는 기존의 파일에 내용을 추가하는 기능이다.

- 활용예: $ ping -c20 chollian.net

c20은 ping 신호를 20회 보내라는 옵션이다. 아무 옵션도 주지 않으면 ping은 계속된다. 강제로 종료하려면 Ctrl+c를 누르면 된다.

- # ls *.hwp > lshwp.txt

- # ls *.HTM > > lshwp.txt

- # more lshwp.txt

- 다음의 경우는 파일을 명령어의 입력으로 주는 경우이다.

# more < 크래*

- # cat <>

this file is test [root@s211-49-108-6 data]#

- 표준 입력을 받을 수 있는 대부분의 텍스트 처리 프로그램이 리다이렉션이 가능합니다. more의 경우 리다이렉션 기호를 쓰지 않아도 같은 내용을 출력한다. 파일 디렉터리 관련 명령어 II에서 설명한 cat의 용법도 리다이렉션 기능의 사용에 해당한다. 다음의 경우는 위 처럼 하면 출력이 저장되지 않는다. 표준 오류를 파일로 저장하려면 다음 처럼 한다.

- # rm test.txt > rm.txt

# rm test.txt > rm.txt 2&>&1

4) 여러 번 쓰는 명령을 간단하게 사용하기: alias

- 현재 정의되어 있는 alias를 보려면 다음과 같이한다.

# alias

- 만약 원래 있던 명령에 alias를 주었을 때, 예를 들면 [root@s211-49-108-6 data]# alias ls='ls -al'하면 다음처럼 ls 명령을 주면 항상 ls -al로 받아들인다. 원래의 ls 기능을 취하려면 \ls라고 명령을 주면 된다.

# \ls

5) 한 번 실행했던 명령을 다시 실행하기: history

- 쉘은 지금까지 실행했던 명령어를 대부분 저장하고 있다. 즉, 전에 사용한 명령어라면 간단히 다시 사용할 수 있다는 뜻이기도 하다. 이를 history기능 이라고 부른다. 이전에 사용했던 명령어는 방향키'↑'를 누르면 나타난다. 원하는 명령에서 ENTER를 누르면 된다. 도스에서도 이런 기능이 있을 것이다.(doskey 기능) 바로 전에 실행한 명령을 다시 실행하려면 '!!'라고 해도 된다. 또 '!명령어'라고 하면 해당 명령어로 시작했던 가장 최근의 명령을 다시 수행한다. 저장된 history 목록을 보려면 history라고 명령하면 된다.그리고 history에 저장되는 명령행의 개수는 환경설정 파일에 지정할 수 있다. bash사용자라면 .bashrc나 .bash_profile에 'set history = 저장하려는 명령행의 개수' 행을 넣어주면 된다.

-활용예: # !!

# !ls

# history

6) 프로그램을 배경작업(background)으로 실행하기: 명령행 뒤에 &

- 윈도우즈 운영체제에서 그 우수성을 자랑하는 것 중의 하나가 멀티테스킹 기능이다. 리눅스에서는 윈도우즈보다 한층 더 안정되고 강력한 멀티테스킹을 지원한다. 쉘에서 사용자의 입력이 필요한 작업의 경우가 아니라면 배경 작업(background job)으로 할 수 있다. 프롬프트 상에서 '# ls -l > ls.txt &' 라고 입력해 보자. 그러면 '[1] 1023' 이런 화면을 보게 된다. 이는 이 작업이 쉘에서 1번 작업으로 수행되며 프로세스 번호는 1023번 이라는 것을 말해준다. 프로세스 번호는 수행시 마다 달라진다. 여기서 ENTER키를 한 번 더 누르면 '[1]+ Done ls -l > ls.txt' 이런 메시지가 나타난다. 이는 1번 작업이 정상적으로 종료 되었음을 의미한다. 다른 예를 하나 더 들어 보자. x-window상에서 한텀을 실행시켜서 통신을하며 음악을 들으려면 다음처럼 한다. (각자의 리눅스 환경에 따라 조금 다를 수 있다)

- 활용예: $ xmms &

7) 동작하는 프로그램을 중지시키기: kill

- 이미 수행한 프로그램을 어떤 필요에 의해 임의로 종료해야 할 경우에 kill을 쓴다. 프로그램을 임의로 종료시키려면 먼저 프로그램의 작업 번호를 알아야한다. jobs라는 명령어로 작업 번호를 알아낸다. 그 다음 '# kill %작업번호' 라고 하면 작업은 중지된다. 여기서 한번 더 ENTER를 누르면 '[1]+ Terminated 수행중이던 작업' 이라고 나타나는 작업 종료 메시지를 볼 수 있다. kill로 작업이 중지 되지 않으면 -9옵션을 준다. '# kill -9 %작업번호' 라고 하면 대부분의 경우 종료된다. 그리고 루트 사용자의 경우 ps명령으로 프로세스 번호를 알아내어 '# kill 프로세스 번호' 라고 해도 작업을 종료할 수 있다. 물론 루트 사용자는 다른 사람이 수행한 작업도 강제 종료할 수 있다. ps는 현재 동작하는 프로그램 목록을 보여준다. 그냥 ps라고 하면 현재 사용자가 실행한 프로그램 목록을 보여준다. 다른 사용자가 실행하고 있는 목록까지 자세히 보려면 '# ps aux'라고 하면 된다.

- 활용예: $ sleep 100 &

$ kill %1

$ jobs
$ ps
$ ps aux

댓글

이 블로그의 인기 게시물

VIDEO_DXGKRNL_FATAL_ERROR on Windows 8.1

Windows 8.1 로 업데이트 이후, Booting 시 Blue Screen 이 뜨면서, VIDEO_DXGKRNL_FATAL_ERROR 또는 SYSTEM_SERVICE_EXCEPTION (atikmpag.sys)  가 발생하는 문제점이 있을 때, 아래와 같이 조치해 보십시오. 제어판 -> 전원 옵션 -> 설정 변경 덮개를 닫으면 수행되는 작업 선택 -> 현재 사용할 수 없는 설정 변경 -> 종료 설정 -> 빠른 시작 켜기(권장)의 Check Box 를 해제함.

Ubuntu (Kubuntu) 에 desktop 파일 만들기

Package 관리자등을 통해 직접 Repository 에 있는 Application 을 설치하는 경우에는 필요한 경로와 파일, Category 로 분류된 Icon 등록 등이 자동적으로 이루어지나 firefox, eclipse 등 새로운 버전을 새로 설치할 경우, 다음과 같은 절차를 통해 시작메뉴에 등록시킬 수 있다. 다음은 eclipse-SDK-3.6-linuxx-gtk.tar.gz 을 받아 설치 등록하는 것을 예로 든다. 1. 다운받은 파일을 /usr/lib에 압축해제한다. (물론, super user 계정으로 실행해야 한다.) 2. 보통의 경우, /usr/bin Directory 는 PATH 에 물려 있으므로 다음과 같은 실행 파일을 만들어 놓는다. # cd /usr/lib # chmod +x eclipse # cd /usr/bin # sudo nano eclipse eclipse 파일에는 아래의 내용을 입력하여 넣는다. export ECLIPSE_HOME="/usr/lib/eclipse" $ECLIPSE_HOME/eclipse $ * # sudo chmod 755 eclipse 3. Desktop Menu 에 추가하려면 # cd /usr/share/applications # sudo nano eclipse.desktop [Desktop Entry] Encoding=UTF-8 Name=Eclipse Comment=Eclipse IDE Exec=eclipse Icon=/usr/lib/eclipse/icon.xpm Terminal=false Type=Application Categories=GNOME;Application;Development' StartupNotify=true 이렇게 입력한 파일을 저장하면, 시작메뉴 > 개발 > Eclipse 아이콘이 생성되어 메뉴에서 직접 실행할 수 있게된다.

네트워크 상의 IP 주소로 MAC 주소를 추출하는 방법

Subject :  How can I get a list of MAC to IP addresses on the network? An easy way to get a list of MAC to IP addresses on the local subnet is to ping every host on the subnet and then check you ARP cache, however pinging every individual node would take ages and the entries only stay in the ARP cache for 2 minutes. 로컬 서브넷 상의 IP 주소에 대한 MAC 주소 목록을 획득하는 쉬운 방법은 서브넷 상의 모든 호스트에게 Ping 을 하고 ARP(Address Resolution Protocol) 캐쉬를 확인하는 것이다.  그러나, 모든 개별 노드에 Ping 하는 것은 많은 시간이 걸릴 것이고 2분동안만 ARP 캐쉬에 체재하면서 들어갈 수 있다. (참고) ARP 캐쉬는 Linux 의 경우 20분, Windows Server 의 경우 2분이 기본적인 Life Time  이다. 그 이후에는 그 데이타가 지워진다. An alternative is to ping the broadcast mask of your subnet which will ping every host on the local subnet (you can't ping the entire network as you only communicate directly with nodes on the same subnet, all other requests are via the gateway so you would just get a ARP entry for the gateway). 로컬 서브넷상의 모든 호스트를 Ping 하게 될 사용자의 서브넷 브로드캐스트 마스크를 Ping 하는 것이 또 다른 방법이다.(동일 서브넷 상의 노드와 직접적으로