Book!

shell script 정리

longer 2018. 1. 27. 09:09


[자주사용하는 명령어]


용도 

 명령어

설명 

캡쳐 

 파일 사이즈 확인

du -sm ./* 

파일&디렉토리 이하 사이즈 확인 

du -sk ./* : KB

du -sm ./* : MB

du -sg ./* : GB 

 


ls

 ls -help

 B,KB,MB,GB단위별로 보여줌

단, 파일 사이즈만 확인가능

 


 

 -m

 가로로 나열할 수 있는 최대 나열

 


 

 -r

 reverse 정렬

 


 

 -t

 오래된 파일을 먼저 보고자 할때

ls -alt

 


 cd 

 -

이전 경로로 이동

 


  ~

 홈디렉토리로 이동

 


 cp

 -r

resulsive 

디렉토리가 없어도 디렉토리 생성 후 파일 복사

만일 디렉토리가 있으면 복사하는 디렉토리 명까지 생성 후 복사




ls [ts]* : t또는 s로 시작하는 파일 리스트 조회

cp -p : 파일 정보까지 같이 복사됨(소유주, 생성일..)

cp -v : 복사 상태를 자세히 보여줌

cp -i : 파일이 있는 경우 복사할것인지 물어봄

mv도 cp와 유사함


/dev/null은 빈 디바이스 출력으로

cat /dev/null > a.txt : a.txt에 있는 내용을 삭제하여 사이즈 0으로 만듦

=   ls "" > a.txt


[표준입출력 & 파일 디스크립터]

0 : 표준 입력 

1 : 표준 출력

2 : 표준 에러


(에러 출력 시)

cat a.txt > err.log 2>&1  

cat a.txt 를 수행하는 데 발생하는 표준에러를 err.log에 출력함


(파일 내용 sort시)

sort < ls.txt


(sort한 파일내용을 다시 기록하기)

sort < ls.txt > ls_1.txt


[명령어 조합하기]

파이프( | 를 사용함) - 파이프로 연결된 표준 출력을 다른 명령의 표준 입력으로 사용하는 것!


ex) 파일이 한 디렉토리 안에 너무 많은 데 최신 파일을 보고 자 하는 경우 !!!! **유용함!!

   - >  ls -lt | head (10개까지만 보여줌) 또는  ls -alt | less 


ex) 해당 디렉토리 이하의 디렉토리 사이즈 확인 **유용함!!

   - > du -h | sort -nr


ex)파일 갯수 구하기

   -> find . -type f | wc -l


ex)특정 단어를 포함하는 파일 찾기

 - > find 경로 | xargs grep 단어



파이프( | ) 사용은 여러가지 필터를 사용하여 입력을 출력으로 사용할 수 있다.


*Filter들..

필터 프로그램 

설명 

 sort

표준 입력에 대해 정렬을 수행하여 그 결과를 표준출력으로 출력함 

uniq 

표준 입력으로 부터 정렬된 데이터를 받아서 중복된 항목을 제거하고 출력해준다. 

grep 

표준 입력으로 받은 라인 단위릐 데이터로부터 지정한 문자 패턴을 가지고 있는 라인을 찾아서 출력해준다. 

fmt 

표준 입력으로부터 텍스트를 읽고 형식화된 텍스트를 표준 출력으로 출력해준다. 

pr 

표준 입력으로 부터 텍스트를 입력받아서 페이지 단위로 데이터를 잘라서 출력해준다. 

head 

입력된 파일에서 앞의 10개의 라인만 출력해 준다. 

tail

입력된 파일에서 마지막 10개 라인만 출력해 준다. 로그파일의 최근 로그를 출력해보고자 할 때 유용하다. 

tr

 입력된 문자를 변경(대/소문자)하거나, 반복, 삭제하여 출력해 준다. 예를 들면, DOS용 텍스트 파일을 UNIX용 텍스트 파일로 컨버팅할 때 사용하기도 한다.

sed 

스트림 에디터로써 tr명령보다 다양한 문자 변경을 사용할 수 있다.

awk 

강력한 필터로서 프로그래밍 언어라고 할 수 있다. 





ex) 파일을 읽어서 문자열로 정렬, 중복제거 

- > more 입력 파일명 | sort | uniq > 출력파일명




[퍼미션]

여러 사람이 하나의 시스템에서 작업을 하기때문에 각 유저마다 자신의 영역이 필요하고 자신만의 파일을 갖게된다. 

다른 소유자가 허락없이 파일을 접근 하여 삭제하고 수정한다면 시스템은 통제가 되지 않을 것이다.

이러한 상황을 방지하기 위해 리눅스에서는 파일 및 디렉토리에 대한 접근 권한을 지정할 수 있도록 퍼미션 개념을 제공하고 있다.


* chmod : 파일, 디렉토리에 대한 접근권한을 변경하는 명령

* su : 일시적으로 슈퍼 유저 또는 다른 유저로 전환하는 명령

* chown : 파일, 디렉토리의 소유자를 변경하는 명령

* chgrp : 파일, 디렉토리의 그룹 소유자를 변경하는 명령




user u, group g, others o옵션 사용

ex ) user에 w권한 제거, group에 w권한 제거, others에 wx권한 제거

      chmod u-w 파일명

      chmod g-w 파일명

      chmod o-wx 파일명

->이렇게 하는것보다 chmod 553 파일명 하면 한꺼번에 줄 수 있음^^; 


touch 또는 vim으로 생성하면 default permission은 644(rw-r--r--)

리눅스에 기본 퍼미션 설정이 되어있는데, /etc/bashrc에 있음.

유저가 쉘 로그인 하면 /etc/bashrc파일을 자동으로 읽어서 환경설정을 하게됨.


umask? 

umask란 8진수의 보수로서 파일과 디렉토리에 적용하는 마스크인데, 리눅스 시스템의 경우에는 기본적으로 파일이 실행권한(x)를 가지고 생성되지 못하도록 막고있다. 디렉터리의 경우에는 실행권한(x)이 접근권한을 의미하기 때문에 실행권한을 생성과 동시에 가질 수 있다.

umask값에 의한 파일 생성 퍼미션은 기본값인 666에서 umask값을 빼주면 되고, 

디렉토리 생성 퍼미션은 기본값인 777에서 umask값을 빼주면 된다.

리눅스 기본 퍼미션인 umask 022로 설정되어있는 경우

     파일은 666-022가 되어 644(rw-r--r--)의 퍼미션으로 파일이 생성되며, 

     디렉토리는 777-022가 되어 755(drwxr-xr-x)로 생성이 된다.


(uid는 id명령으로 확인, umask는 umask명령으로 확인)


ex) umask 확인 및 변경


파일에 대한 chmod값 설명

chmod 값 

설명 

 777

(-rwxrwxrwx) 

모든 접근에 대해 제한을 두지 않는다. 누구나 읽기, 쓰기, 실행이 가능하다. 

755 

(-rwxr-xr-x)

파일 소유자는 읽기,쓰기,실행이 가능하고, 파일에 지정된 그룹과 누구나 읽기, 실행이 가능하다. 

700 

(-rwx------)

파일의 소유자만 읽기, 쓰기, 실행이 가능하고, 소유자 이외의 누구도 접근이 불가능하다.

이 모드는 시스템 관리자만 실행하는 프로그램이나 보안이 필요한 프로그램에 설정한다. 

666 

(-rw-rw-rw-)
모든 사용자가 읽기, 쓰기가 가능하도록 설정한다. 

644

(-rw-r--r--)

파일의 소유자는 읽기, 쓰기가 가능하지만, 다른 유저들은 읽기만 가능하다.

즉, 소유자만 파일의 내용 변경이 가능하게 된다. 

600 

(-rw-------)
파일의 소유자만 읽기 쓰기가 가능하고, 다른 유저들은 접근이 불가능하다. 


디렉토리에 대한 chmod값 설명


chmod값 

설명 

777 

(drwxrwxrwx)

누구나 읽기, 쓰기, 실행이 가능하도록 설정한다.

일반적으로 웹프로그래밍 시 익명에 의한 파일 업로드 디렉터리에 설정한다. 

755 

(drwxr-xr-x)

디렉터리의 소유자는 읽기,쓰기,실행이 가능하고, 다른 유저들은 읽기와 실행만 가능하게 설정한다. 그러므로 다른 유저들은 이 디렉터리 안에 파일을 생성 할 수 없다. 

700 

(drwx------)

디렉터리의 소유자만 읽기,쓰기,실행이 가능하고, 다른 유저들은 접근 자체가 제한되기 때문에 디렉터리 소유자의 개인적인 파일만 이 디렉터리에 생성 할 수 있게 된다. 


임시적으로 super user전환하기(환경설정도 슈퍼유저의 환경설정을 사용할 수 있음)

- > su - 

    : su명령어 사용 후 -붙이지 않으면 기존에 multi유저 환경설정으로 접근하게됨. su - 를 해줘야 슈퍼유저의 환경설정 사용가능


[chown]

change owner의 약자로 슈퍼유저(root)만 사용가능하다.

사용법 : chown [소유자][.또는 :][그룹][파일명 또는 디렉토리명]


[chgrp]

파일의 그룹만 변경하고자 할때

사용법  chgrp [그룹명][파일명 또는 디렉토리명]


[lsattr,chattr]

파일들에 대한 속성으로 속성을 보기위해서는 lsattr, 변경하기 위해서는 chattr을 사용함.

rm -rf 하여 삭제하였는데도 삭제가 안되면 lsattr로 확인하여 chattr변경 후 삭제하도록 함.


[job control]

ps : 시스템에서 실행되고 있는 프로세스 목록 보기

kill : 하나 또는 여러개의 프로세스에게 kill시그널 보내기

jobs : 현재 쉘에서 자신의 프로세스 보기

bg : 프로세스를 백그라운드로 보내기 

fg : 프로세스를 포그라운드로 가져오기


[계정관련]

useradd 계정

userdel 계정

passwd 계정

usermod명령은 유저의 각종 정보를 변경할 때 사용하며, groupmod는 그룹 이름이나 그룹 아이디를 변경할 때 사용

id명령은 유저의 아이디와 그룹 아이디, 소속되어 있는 그룹명 등을 출력해준다. bash쉘의 환경 변수인 UID, EUID,GROUPS의 변수값을 출력한다.


lid는 list id로 유저가 속해있는 그룹을 출력한다.



sudo : 슈퍼유저 또는 다른 유저로 명령을 실행하도록 한다.

  sudo에 대한 설정내용은 /etc/sudoers파일에 정의되어있음.

ac, last : 유저 접속시간 확인

newgrp : 자신이 소속된 그룹을 새 그룹으로 추가/변경하지만, 현재 쉘을 빠져나오면 초기화됨.


[시스템 정보]

uname -a

lsof는 오픈된 파일의 목록을 출력함. -i 옵션을 사용하면 오픈되어있는 네트워크 소켓 파일들을 출력할 수 있다.


free : 메모리와 캐시사용량을 bytes로 표기함

메모리 여유공간 보기

procinfo : /proc 파일 시스템에 대한 정보를 출력한다.

lsdev : 설치된 디바이스 장치 목록 출력


du명령은 디스크의 파일 사용량을 출력한다. 재귀적으로 출력하며 특정 디렉터리를 지정할 수 도 있다.


ex) 현재 디렉토리 기준 이하 전체 파일 사이즈 확인

   - > du -sh 



ex) 현재 디렉토리 기준 이하 디렉토리별 사이즈 확인(킬로바이트 단위 출력)

   - > du -h




ex) 파일 시스템의 파티션 사용량 출력

 - > df -h



ex) 파일의 각종 정보 출력

 - > stat 파일명



* vmstat : 버추얼 통계 메모리 출력

- > vmstat




* netstat : 현재 네트워크 통계와 정보를 출력한다. 만약 오픈되어있는 포트 목록을 출력하고자 한다면 -lptu옵션을 사용하면 됨

 -> netstat -lptu




*utime : 현재 시간과 시스템이 종료/재부팅되지 않고 계속 운영되고있는 기간, 현재 접속자수, 평균 부하를 출력한다. load average가 3 이상이면 시스템 성능이 현저히 떨어진다.


*각종 시스템 명령어들..

   - hostname : 시스템의 호스트명 출력

   - hostid : 호스트머신을 32비트 16진수 숫자의 식별자로 출력

   - size : 바이너리 실행파일 또는 아카이브 파일의 세그먼트 크기를 출력

   - logger : 시스템 로그를 기록하는 명령어 /var/log/messages 시스템 로그에 기록됨.

   - logrodate : 시스템 로그 파일을 관리하기 위해 사용하며, 로테이트, 압축, 삭제, 이메일 발송 등의 기능을 사용할 수 있다.

   - pgrep : 프로세스 검색

     ex ) root가 실행중인 httpd 데몬의 프로세스 아이디를 검색하려면? 

            - > pgrep -u root httpd

     ex ) 프로세스 실행 유저가 root 또는 daemon인 프로세스 아이디를 검색하려면 ?

            - > pgrep -u root,daemon

     ex ) syslog데몬을 다시 시작하려면 ? (환경설정파일을 다시 읽으려면 ? )  (뭔지 잘 모르겠네 ㅋ)

            - > pkill -HUP syslogd

   - pstree : 프로세스 목록을 트리 형식으로 출력 -p옵션을 사용하면 프로세스 아이디도 출력할 수 있다. (잘 안쓰겠는데? ㅋ)

   - top : 전반적인 시스템 상황을 출력해주며, 기본값으로 3초마다 한 번씩 리프레시 된다.

      

    - nice : 스케줄링 우선권을 조정하여 프로그램을 실행하는 명령어

           - > nice [-n [-adjustment] [- [- -help] [--version] [arg _--ll

    -  nohup : 아규먼트로 적은 명령에 대하여 hangup 신호를 무시한 채 수행하도록 하는 명령어 

       & 백드라운드 명령어와 함께 쓰이기도 함.

    - pidof : 실행중인 프로세스 아이디를 검색, 출력한다.

           - > pidof ant

    - fuser : 파일 또는 소켓이 사용하고 있는 프로세스(pid/user)등을 출력

       fuser -n

fuser명령어 -n 옵션을 사용하면 포트를 지정하여 검색할 수 있다

[root@localhost - ]# fuser .un tcp 25 25 /tcp: 2121 (root)

[root@localhost - J# ps ax I grep 2121 I grep -v grep
    2121 ? 5s 0:00 sendmail: accepting connections

        - > ps -ax | grep 5900   


     - cron : 슈퍼 유저용/ 일반 유저용 스케줄러. 리눅스에서는 crond데몬을 사용하여 통합관리하며, 

   각 유저들은 crontab -e명령을 사용하여 자신만의 스케줄러를 사용할 수 있다.


 (프로세스 관리와 부팅)

     - init,halt,shutdown..등등있음 (굳이 인프라 아니고선 알필요가..?)

 (네트워크)

      - ipconfig : 네트워크 인터페이스 환경을 출력하고 튜닝하는 유틸리티.

      - iwconfig : 무선랜 네트워크 인터페이스 환경을 출력해주는 명령, ifconfig과 유사하지만 무선랜만 보여줌.

      - ip : 라우팅, 디바이스 그리고 라우팅과 터널정책을 출력하고 조작할 떄 사용

      - route : 커널 라우팅 테이블 정보를 출력

      - checkconfig : 시스템 서비스를 위한 런레벨 정보를 업데이트하고 검색할 수 있게함.

      - tcpdump : 네트워크 패킷을 실시간으로 출력해 볼 수 있다. 

        - > tcpdump tcp port 21

(파일 시스템)

     - mount : 파일 시스템을 마운트 하기 위해 사용

       : mount 옵션 장치명 디렉토리명

    - unmount : 파일 시스템을 즉시 마운트 해제할 때 사용

    - sync : 버퍼와 하드드라이버 동기화 수행

    - losetup : 루프장치를 정규 파일 또는 블럭 장치와 연결, 루프장치와 분리, 루프 장치의 상태 파악을 하는 데 사용

    - mkswap,dd : 스와파일 또는 스왑파티션 생성할 때 사용

    - swapon, swapoff : 스왑 파일, 파티션 사용여부 설정/해제 

    - mkfs.ext3 : 파티션이나 파일을 ext3파일 시스템으로 만들 때 사용 ( mkfs.ext 디바이스명)

    - hdparm : 하드 디스크의 설정을 보여주거나 설정을 조정할 수 있다.

    - fdisk : 저장용 디바이스의 파티션 테이블을 생성하거나 변경 (fdisk 디바이스명)

    - fsck.ext3 : ext3파일 시스템을 체크, 수리, 디버그할 수 있는 명령(fsck.ext 디바이스명, 마운트 해제하고 해야됨)

    - badblocks : 저장 디바이스의 물리적인 배드 블록을 체크(badblocks 디바이스명)

    - lsusb : 장착되어있는 usb디바이스 출력

    - lspci : 장착되어있는 pci디바이스 출력

    - mkbootdisk : 시스템 구동을 위한 독립적인 부트 플로피 디스크를 만듦

    - chroot : root디렉터리를 변경함

    - lockfile : procmail패키지에 포함되어있음. 세마포어 잠금파일, 디바이스, 리소스등을 생성하여 파일접근 관리, 

잠금파일이 존재하여 다른 프로세스의 접근이 제한됨.

    - makedev : 디바이스 파일을 생성하기 위해 사용

    - tmpwatch : 지정한 기간동안 접근되지 않은 파일들을 자동으로 삭제하는 명령어


 (백업)

   - dump : dump는 정교한(ext2,ext3)백업 유틸리티이며, -f옵션을 사용하여 네트워크 파일 시스템도 백업할 수 있다

   - restore : dump 로 백업된 파일을 복원할 때 사용


 (시스템 리소스)

   - ulimit : 시스템 리소스 사용의 상한 제한값을 설정 ( ulimit -a : 현재 시스템의 상한값 출력)

   - quota, setquota : 유저와 그룹의 디스크 사용량 제한값을 출력, 설정

   - umask : 유저 파일의 생성 퍼미션 마스크를 설정한다. 

    umask 022 명령을 실행하면 새로 생성되는 파일은 644퍼미션(666-022=644)을 가지게 되며,

    새로 생성되는 디렉터리는 755퍼미션(777-022=755)을 가지게 된다.(변경은 chmod로)

  - lsmod : 설치된 커널 목록 출력(=cat /proc/modules)

  - insmod, rmmod, modprobe, depmod, modinfo, ...

(기타 명령어)

  - env : 환경변수를 출력하거나 프로그램을 다른 환경에 실행한다. 

              쉘스크립트 상단에 스크립트 언어를 지정할 때 사용한다. 배시쉘의 경우는 #!/bin/env bash라고 적어주면 된다.

  - watch : 지정한 명령을 지정한 시간단위로 재실행하며 풀스크린으로 결과값을 출력한다. 

         ex) 5초마다 파일 내용 화면 출력 - > [root@localhost -J# watch -n 5 tail /var/log/messages

           ex)60초마다 메일 내용 확인 -> watch -n 60 from

         ex)디렉토리내 변경된 파일을 감시하고자 할 때 -> watch -d ls -l 


[쉘 초기화 파일들]

  - /etc/profile : 시스템 전역 쉘 변수 초기화

    : 유저가 로그인하면 가장 먼저 /etc/profile파일을 읽어들인다.

    : 이 파일에는 PATH, USER, LOGNAME, MAIL, HOSTNAME, HITSTSIZE, INPUTRC등의 쉘 변수들이 있다.

  - ~/.bash_profile : 유저 개인의 환경 설정 파일

    : 시스템 전역이 아닌 유저 자신만의 PATH 와 시작 프로그램을 추가적으로 설정할 수 있는 파일이다.

  - ~/.bashrc : 유저 개인의 알리아스 및 변수 설정 파일

  - ~/.bash_logout : 로그아웃 설정 파일

  - source 명령 : 쉘 환경설정파일 즉시 적용하기 

     : 앞에 설정파일을 수정한 다음, 리부팅 또는 재접속 없이 수정된 새로운 환경 설정 내용을 즉시 적용하기 위해 사용

      -> source [환경설정 파일명]

      -> ex) multi를 alias 준 후 

[root@10ca1host -J# mu1ti
-bash: multi: command not found 

[root@10ca1host -J# source -1.bashrc 

[root@10ca1host -J# mu1t

       anaconda -ks. cfg attribute backup ...


[명령 파싱 라인]

  - 쉘 프롬프트에 명령을 타이핑 했을 때 쉘은 입력 라인을 읽고 명령 라인을 파싱한다. 토큰이라고 불리는 단어로 분리된다.

  - 토큰은 공백 또는 탭으로 분리되며 명령라인은 새 라인(new line)으로 종결된다. 

  - 만약 빌트인 명령이라면 내부적으로 명령을 실행할 것이고, 그렇지 않다면 쉘은 프로그램의 위치를 검색하기 위해 패스(path)        변수에 지정된 디렉토리를 검색할 것이다. 

   

    *파싱이란 ?

     파싱(syntatic parsing)은 일련의 문자열을 의미있는 토큰으로 분해하고 이들로 이루어진 파스트리를 만드는 과정을 말한다.


    *명령라인 프로세싱의 순서

1.히스토리 치환이 수행된다.

2.명령라인은 토큰 또는 단어 단위이다.

3.히스토리가 업데이트 된다.

4.인용이 진행된다.

5.앨리어스 치환과 함수가 정의된다.

6.리다이렉션, 백그라운드, 파이프가 설정된다.

7.변수 치환($user, $name, etc.)이 수행된다.

8.명령 치환(echo Today is 'date'")이 수행된다.

9.globbing(cat abc,??, rm *,,.c, etc) 이라는 파일명 치환이 수행된다.

10.명령이 실행된다.


명령 타입을 알아보는 과정

1. 앨리아스

2.키워드

3.함수

4.빌트인 내장명령

5.실행 파일


예를들어, goodmorning이라는 명령이 있다고 할 때 쉘은 가장 먼저 앨라이스 인지 체크하고 앨리아스가 아니라면 키워드인지, 그리고 함수인지, 빌트인 명령인지 체크하고 이것도 아니라면 디스크 저장장치에 있는 실행 파일이라고 판단하고 디스크에 있는 실행 파일을 찾게 된다. 이때 쉘은 실행 파일을 실행하기 위해 디렉토리 구조의 위치 중 실행 파일이 어디에 위치해 있는지 검색하기 위해 PATH 변수에 정의된 경로에서 검색하게 된다.





[프로세스와 쉘]