본문 바로가기
교육

[35일 차] 21.09.07 : Linux Server 14

by ballena 2021. 9. 7.

1~2교시

 

어제 실패했던 roundcube 메일 서버 구축. 버전 호환 문제가 좀 큰 것 같다.

다시 주신 자료 'roundcube구성.txt' 파일을 진행하며 해결했다. roundcube에 직접 SSL을 적용하지 않았다. 보안을 챙길 거면 HTTPS를 쓸 거니까....

roundcube는 보통 내부망에서 사용할 용도로 사용한다.

대충 만든 도메인으로 다른 사이트에 이메일을 보내면 문제가 생긴다.


3교시

 

로그 관련

AWS에서는 CloudWatch라는 기능으로 시스템들의 로그를 볼 수 있다.

 

Log : 기록

 

  • 로그의 종류

1. 시스템 로그

더보기

   - 인증 로그 : 사용자 인증을 위해 사용되는 인증 시스템이 발생시키는 로그. 여기서의 인증은 대부분 패스워드를 사용. 관련 시스템으로는 PAM이나 SSH 등이 있다. /var/log/secure에 저장된다.

 

   - 데몬 로그 : /var/log/daemon.log에 기록되는데, 처음에는 생성되지 않는다. /etc/rsyslog.conf 파일에 DAEMON이라는 facility를 정의하면 생성된다. 규칙적 서비스 실행에 사용되는 Cron 데몬은 /var/log/cron 파일을 사용해 로그를 기록한다.

 

   - 커널 로그 : 리눅스 커널이 발생시킨 로그. 기록을 위해 /var/log/kern과 /var/log/dmesg 파일에 사용된다. 커널 컴파일처럼 커널에서 발생하는 여러 에러 관련 문제 해결에 아주 유용하게 사용된다.

 

   - 시스템 로그 : 리눅스 시스템에서 발생하는 대부분의 로그를 기록하기 위해 사용되고, 가장 많은 양의 정보를 저장하며 이를 위해 /var/log/messages 파일을 사용한다.

 

2. Application 로그

더보기

   - Apache 웹 서버 : 아파치 웹 서버가 발생시킨 로그를 기록하며, /var/log/httpd 디렉터리에 일반적인 접속 로그를 기록하는 access_log와 에러를 기록하는 error_log 파일을 사용한다.

 

   - Nginx 웹 서버 : /var/log/nginx 디렉터리에 아파치 서버처럼 access_log와 error_log를 사용한다.

 

   - Samba 서버 : 삼바 서버가 발생시킨 로그를 기록하며, /var/log/samba 디렉터리에 모든 로그가 저장된다.

 

   - SMTP 서버 : Sendmail이나 Postfix 같은 메일 서버가 발생시킨 모든 로그를 기록하며, /var/log/maillog 파일이 기본으로 사용된다.

 

   - FTP 서버 : VSFTP, PROftp 같은 FTP 서버가 발생시킨 로그를 기록. /var/log/xferlog 파일이 기본으로 사용된다.

 

   - MariaDB 서버 : 마리아DB 서버가 발생시킨 로그를 기록하며, /var/log/mariadb 디렉터리가 사용된다.

 

   - Kerberos 서버 : 케르베로스 인증 서버가 발생시킨 로그를 기록하며, /var/log/krb5kdc.log와 kadmind.log 파일이 사용된다.

 

3. 바이너리 로그 : 특정 명령어로만 확인 가능

더보기

   - /var/run/utmp : 각 사용자의 현재 로그인 정보를 기록하며, 명령어 who나 w를 이용해 정보 확인이 가능


   - /var/log/wtmp : 사용자의 모든 로그인과 로그아웃을 기록하는 파일이며, 명령어 last를 이용해 확인 가능


   - /var/log/btmp : 사용자의 로그인 실패를 기록하는 파일이며, 명령어 lastb로 확인이 가능한데, 처음에는 생성되지 않으므로 명령어 touch를 이용해 생성해줘야 한다. 


   - /var/log/lastlog : 모든 사용자의 가장 최근 로그인 정보를 기록하는 파일이며, 명령어 lastlog를 이용해 확인 가능하다.

 

  • 로그 분석 관련 파일
더보기

1. /var/log 디렉터리 : 대부분의 로그 관련 파일들이 위치하는 디렉터리

 

2. 주요 파일

1) /var/log/messages 
    ㄱ. 설명: 시스템의 표준 에러 관련 메시지가 기록되는 파일로 rsyslogd라는 데몬에 의해 설정된 사항들이 기록된다. 기본적으로 루트 권한만이 읽고 쓸 수 있다.
    ㄴ. 로그 예
       [root@www root]# cat /var/log/messages
       -- 생략 --
       Feb  1 19:50:55 www  2월  1 19:50:55 su(pam_unix)[32176]: session closed for user root
        => (설명) 시스템 로그는 4개의 부분으로 구성되어 있다.
                 1. 날짜 및 시간
                 2. 메시시가 발생한 호스트네임
                 3. 메시지를 발생한 내부 시스템이나 응용프로그램의 이름
                 4. 자체적으로 발생한 메시지, 보통 콜론(:)으로 구분된다.


2) /var/log/dmesg : 시스템이 부팅할 때 출력되었던 메시지가 로그로 남겨진다. 보통 커널 부트 메시지 로그라고 한다.


3) /var/log/secure : 원격 접속과 관련하여 언제 어디서 어떤 서비스를 사용했는지 기록한다. 보통 login, tcp_wrappers, xinetd 관련 로그들이 남는다.


4) /var/log/xferlog : FTP 접속 관련 작업을 기록한다. 보통 wu-ftpd에 의해 발생된 로그이다.


5) /var/log/cron : cron데몬이 실행했던 작업을 기록한다.


6) /var/log/maillog : sendmail의 메일 관련 작업을 기록한다.


7) /var/log/lastlog : telnet을 이용한 접속을 기록한다. 바이너리 파일로 lastlog라는 명령으로 확인한다.


8) /var/log/wtmp : 콘솔 모드, telnet, ftp로 접속한 기록과 시스템을 재부팅한 기록, 접근지 등을 기록한다. 역시 바이너리 파일로 되어 있으며, last라는 명령으로 확인한다.


9) /var/log/boot.log: 부팅 시에 출력되는 모든 메시지를 기록한다. 부팅 시의 에러 등을 확인할 수 있다.


10) /var/log/cron: 시스템의 정기적인 작업을 수행하는 cron관련 로그를 기록하는 파일이다.


11) /var/log/sa : sysstat라는 패키지에 의해 기록되는 로그파일들이 위치하는 디렉터리이다.
(참고 1) 'w'이라는 현재 로그인한 사용자들의 작업을 보여주는 명령이 있는데 이 명령은
 utmp라는 바이너리 파일의 기록을 보여준다. 이 파일의 위치는 /var/run/utmp이다.

 

  • 로그 관련 데몬
더보기

(1) 로그 데몬
   1) 설명: 시스템과 관련된 대부분의 로그는 syslogd가 하고 추가로 klogd라는 데몬이 있다.
    ㄱ. syslogd : 커널과 여러 가지 시스템 프로그램들은 각종 에러와 경고 메시지, 기타 일반적인 메시지들을 출력한다. 이런 메시지들을 파일로 기록하는 데몬이다.
    ㄴ. klogd : 부팅 후에 부팅과 관련된 메시지를 보려면 dmesg라는 명령을 친다. 이 명령은 실제 /var/log/dmesg라는 파일의 정보를 가지고 오는 것이 아니라, 시스템에는 부팅과 관련된 메시지를 포함하여 커널 관련 메시지를 담는 약 8196 bytes의 버퍼 크기를 갖고 메시지를 기록하는 데 이 메시지를 기록하는 데몬이 klogd이다.


(2) 관련 파일
   1) /etc/rc.d/init.d/syslog : 실행과 관련된 스크립트 파일로 실질적인 실행파일이다. syslogd와 klogd 데몬을 모두 실행시켜 준다.
   2) /etc/syslog.conf : syslog데몬의 환경설정 파일이다.
   3) /etc/sysconfig/syslog : syslogd와 klogd의 시작과 관련된 스크립트의 환경 파일이다.

 

  • /etc/rsyslog.conf 파일 분석
더보기

## Modules 섹션
/usr/lib64/rsyslog 디렉터리에 모듈이 저장
이러한 모듈을 사용하려면 예를 들어 $ModLoad imudp 이렇게 지정

## Global Directives 섹션
rsyslog 데몬 전체에 적용되는 내용을 설정.
메시지 큐의 크기를 지정하고나, 외부 모듈을 로딩하기 위해 사용.
설정을 위해서는 매 줄 앞에 $기호를 사용함.

(1) 기본 구성 형식
    facility.level                        action

해당 facility에서 특정 level 이상이 발생하면 지정 action을 실행


(2) facility : 메시지를 발생시키는 프로그램의 유형을 나타낸다.
   * facility의 종류
     kern(0)          : 커널이 발생한 메시지
     user(1)         : 사용자 프로세스   
     mail(2)          : mail 시스템이 발생한 메시지 
     daemon(3)        : telnetd, ftpd등과 같이 daemon이 발생한 메시지 
     auth(4)          : login과 같이 인증 프로그램 유형이 발생한 메시지
     syslog(5)        : syslog 프로그램이 유형이 발생한 메시지
     lpr(6)           : 프린트 유형의 프로그램이 발생한 메시지
     news(7)          : 유즈넷 뉴스 프로그램 유형이 발생한 메시지
     uucp(8)          : UUCP 시스템이 발생한 메시지
     cron(9)          : cron, at과 같은 프로그램이 발생한 메시지
     authpriv(10)     : 개인 인증을 요하는 프로그램 유형이 발생한 메시지
     local0-local7(16~23) : 여분으로 남겨둔 유형     


(참고 2) facility 뒤에 .none을 붙이면 해당 facility를 제외하겠다는 의미이다. 
예를 들어 mail.none은 메일 관련 메시지를 제외한다는 뜻이다.

보통 authpriv 관련은 제외하는 편


(3) level : 위험의 정도를 가리키며 설정된 위험의 정도보다 높아야 메시지를 내보낸다. 레벨 앞에 '='을 사용할 경우 해당 레벨의 위험도와 같은 경우를 의미한다.
    * level의 종류 (위험 레벨이 낮은 것부터 높은 순서로 나열)
      debug(7)   : 프로그램을 디버깅할 때 발생하는 메시지
      info(6)    : 통계, 기본정보 메시지
      notice(5)  : 특별한 주의를 요하나 에러는 아닌 메시지
      warning(4) : 주의를 요하는 경고 메시지
      err(3)     : 에러가 발생하는 경우의 메시지
      crit(2)    : 크게 급하지는 않지만 시스템에 문제가 생기는 단계의 메시지
      alert(1)   : 즉각적인 조정을 해야 하는 상황
      emerg(0)   : 모든 사용자들에게 전달되어야 할 위험한 상황


(4) action : 메시지를 보낼 목적지나 행동 들에 관한 설정
    * 종류
     file  : 해당 file에 내용을 추가
     @host : 지정된 호스트로 메시지를 보냄
     user  : 지정된 사용자의 스크린으로 메시지를 보냄
     *     : 현재 로그인되어 있는 모든 사용자의 스크린으로 메시지를 보냄


(5) 사용 예
   1) *.=crit;kern.none                          /var/log/critical
     => 모든 facility가 발생하는 것 중에서 crit레벨과 같은 수준의 메시지를 /var/log/critical이라는 파일로 저장하는데 커널에서 발생하는 메시지는 제외한다.

'='는 지정 표시. 보통은 특정 level 이상에 적용되는데, 이러면 해당 level에만 적용


   2) *.emerg                                    *
     => 모든 emerg이상의 에러가 발생하면 모든 사용자에게 알려준다.
(참고3) /etc/syslog.conf 파일 예
  # Log all kernel messages to the console.
  # Logging much else clutters up the screen.
  #kern.*                                                 /dev/console
  
  # Log anything (except mail) of level info or higher.
  # Don't log private authentication messages!
  *. info;mail.none;news.none;authpriv.none;cron.none              /var/log/messages
     => 모든 info메시지를 기록하되, mail,news,authpriv,cron은 제외
  # The authpriv file has restricted access.
  authpriv.*                                              /var/log/secure
   => 개인인증 관련은 /var/log/secure에 기록
  # Log all the mail messages in one place.
  mail.*                                                  /var/log/maillog
   => 모든 메일 관련 메시지는 /var/log/maillog에 기록

  # Log cron stuff
  cron.*                                                  /var/log/cron
   => cron관련 메시지는 /var/log/cron에 기록
  # Everybody gets emergency messages, plus log them on another
  # machine.
  *.emerg                                                 *
   => 모든 emerg이상의 에러가 발생하면 모든 사용자에게 알려줌
  # Save mail and news errors of level err and higher in a
  # special file.
  uucp,news.crit                                          /var/log/spooler
   => uucp, news의 crit정보기록은 /var/log/spooler에 기록
  # Save boot messages also to boot.log
  local7.*                                                /var/log/boot.log
   => 부트 메시지는 /var/log/boot.log에 기록
  #
  # INN
  #
  news.=crit                                        /var/log/news/news.crit
  news.=err                                         /var/log/news/news.err
  news.notice                                       /var/log/news/news.notice

 

  • 로그 파일 관리
더보기

(1) logrotate : /var/log 디렉터리 안에 있는 많은 로그파일은 기존의 파일에 덧붙여지게 되므로 크기는 계속 커지게 된다. 이를 방지하기 위해서 로그 파일을 조각으로 나눌 수 있는데, 이런 작업을 하는 프로그램이 logrotate이다.


(2) /etc/logrotate.conf : logrotate의 설정 파일로 로그 파일을 조각으로 나눌 수 있다.
    * 기본 설정
     # see "man logrotate" for details
     # rotate log files weekly
     weekly        // 아래에 특별히 명시하지 않은 로그파일에 대해서는 일주일(weekly) 마다 rotate 한다.
     # keep 4 weeks worth of backlogs
     rotate 4     // 최대 4번까지 rotate를 허용한다. 
(logfile, logfile.1 ~ logfile.4까지의 로그 파일이 생성된다.

     # send errors to root
     errors root  // 에러가 발생하면 root 사용자로 메일을 보낸다.

     # create new (empty) log files after rotating old ones
     create       // rotate 한 후에 비어있는 로그파일을 생성한다.

     # uncomment this if you want your log files compressed
     #compress    

// 로그파일을 압축하는 옵션이다. 기본값은 활성화되어 있지 않다. 용량 문제가 크게 되지 않는다면 압축을 하지 않는 것이 좋다.


     # RPM packages drop log rotation information into this directory
     include /etc/logrotate.d       // 대부분 RPM패키지로 설치되는 데몬들은 이 디렉터리에 로그 파일이 생성된다. 이 로그파일을 rotate 시킬 수 있도록 하는 설정이다.


     # no packages own lastlog or wtmp -- we'll rotate them here  
     // 아래에 있는 로그파일(wtmp, lastlog)은 어떤 패키지에 의해서도 설정되지 않기 때문에 아래에서 따로 설정한다. 다른 로그파일들은 /etc/logrotate.d내의 파일들에서 모두 설정하고 있다.

     /var/log/wtmp {
         monthly
         create 0664 root utmp
         rotate 1
     }
     // 한 달마다 rotate 하며 최대 1회까지만 rotate 한다. 관련 파일인 utmp파일을 생성한다.

     # system-specific logs may be configured here
     //시스템에 특별한 로그들은 여기에 적는다. 예를 들어 lastlog에 대해 만들어 보면

     /var/log/lastlog {
     monthly
     rotate 3
     }
     // 한 달마다 rotate 하며 최대 3회까지 rotate 한다.


(3) /etc/logrotate.d 디렉터리 : 각종 응용프로그램의 로그관리를 위한 디렉터리이다. 이 디렉터리 내에 응용프로그램의 이름으로 파일이 설정되어 있다.
(4) 참고 
    리눅스 서버에서 logrotate은 /etc/cron.daily 디렉터리에 cron작업으로 등록되어
 있어 매일 실행되도록 설정되어 있다.

 

  • 원격지 로그 서버 구축
더보기

master를 로그를 받는 서버로, slave를 로그를 보내는 서버로.

 

master의 /etc/rsyslog.conf 파일에서 tcp, udp 포트 주석 해제

module(load="imudp") # needs to be done just once
input(type="imudp" port="514")

module(load="imtcp") # needs to be done just once
input(type="imtcp" port="514")

 

방화벽 열기 : 514번 포트의 tcp, udp 포트 추가

방화벽, rsyslog 서비스 재시작

 

slave 쪽의 /etc/rsyslog.conf 파일의 RULES 부분에

*.*     @192.168.111.100

추가

 

이제 master 측에서 /var/log/messages에 slave의 로그가 기록된다.

 


4교시

 

Bash Shell Script

 

시스템 구성을 코드로 만들어 놓고 자동으로 배포하는 것이 Ansible이다.

그런데 설정 파일은 어찌할 수가 없으니 Bash Shell Script로 만들어 놓고, 이 스크립트를 Ansible이 사용

 

  • Shell
    운영체제에서 제공하는 명령을 실행하는 프로그램. 운영체제의 관리하에 있는 파일, 프린팅, 하드웨어 장치, 어플리케이션과의 인터페이스를 제공.

 

  • Shell Script : 리눅스 시스템에서 지원하는 명령어들의 집합을 묶어서 프로그램화한 것을 말함.

 

vim shelltest.sh

-> 내용 작성

#!/bin/bash

echo "This is Shell test!"

-> 스크립트 파일 권한 조정

chmod 744 shelltest.sh

-> 홈 디렉터리에 bin 디렉터리를 만들 것이 아니라면 ./shelltest.sh로 실행

 

#!/bin/bash를 보고 쉘이 스크립트라는 것을 인지하고 작성한 명령어들을 실행한다.


5교시

 

 

Bash Shell Script :  bash 쉘에서만 실행 가능한 명령어를 작성한 것.

 

쉘 스크립트는 bash 쉘로만 구성할 필요는 없다.

#!/bin/bash
-> bash 쉘 스크립트 시작 부분에 반드시 작성
#!/bin/sh
#!/bin/python
#!/bin/perl

 

  • 메타 문자

특수한 의미를 가지는 특수문자
쉘 메타 문자=와일드카드

더보기

\   :   뒤에 나오는 문자를 그대로 해석. 
&   :   백그라운드 실행
;     :   명령어 구분
$    :   변수를 치환(위치 변수, 지역 변수 등)
?    :   한 문자와 치환
[abc]   :   문자들 중 하나의 문자와 매칭
*    :   0개 이상의 문자들과 매칭
[!abc]   :   a, b, c가 아닌 문자들과 매칭
{abc}   :   콤마( , ) 분리자를 사용해 특정 문자/문자열과 일치하는 모든 것을 반환

~   :   홈 디렉터리

-    :   직전 디렉터리

 

어떤 명령 뒤에 \를 붙이면, 입력이 다음 라인으로 이어진다.

-> \ 뒤에 메타 문자를 붙이면 그대로 해석된다.

 

  • 변수 : 지역변수, 전역 변수

변수명=변수값 하면 지역변수, 이걸 export 하면 전역 변수
변수명은 알파벳 또는 ' _ ' 문자로 시작해야 함
알파벳, 숫자, ' _ ' 등 모두 사용할 수 있다.
변수값을 할당할 때 ' = ' 기호 앞 뒤로 공백이 있으면 안 됨!

 


6교시

 

 

변수 선언은 declare, typeset이라는 명령어를 주로 사용한다. 그중에서도 declare.

declare 변수명=변수값

그냥 변수명=변수값 해도 괜찮겠지만,

declare -a 변수명=변수값

이렇게 선언하면 변수를 배열로 취급한다.

-f 옵션은 함수명과 정의 목록 출력 시 사용 : declare -f

-F 옵션은 함수명 목록 출력 : declare -F

-i 옵션은 정수형 타입 변수 생성

-r 옵션은 읽기 전용의 변수 생성. 이 변수의 값은 수정이 안됨. 물론 'readonly 변수명' <- 이런 식으로도 선언 가능

이렇게 선언하면 unset 명령어로 해제할 수 없다.

 

export -p : 이 사용자에 정의된 환경 변수 목록 출력

 

※ 변수는 대소문자를 구분한다.

 

echo -e "\t\t안녕하세요\n"

-t 옵션을 쓰면 이스케이프 문자(\)를 그대로 출력

 

printf 명령 : 포맷을 지정해서 출력할 수 있는 명령

예시 1) printf "실수는 %.3f\n" 10
-> 실수는 10.000

예시 2) printf "%-20s%-15s%10.2f\n" "리눅스" "CentOS" 10

-> 리눅스           CentOS              10.00

 

  • 변수 확장 변경자
    변수는 특수한 변경자에 의해 테스트되고 수정될 수 있다.
    변경자는 변수가 설정되어있는지 체크하기 위해 사용되고
    test 결과를 기초로 변수에 값을 할당한다.
더보기

${variable:-word}
변수가 설정되고 null이 아니라면 변수의 값을 출력, 변수가 설정되어 있지 않으면 주어진 단어로 치환한다.


${variable:=word}
변수가 설정되고 null이 아니라면 변수의 값을 출력, 그렇지 않으면 주어진 단어로 설정한다.
변수의 값은 영구적으로 치환된다.

${variable:+word}
변수가 설정되고 null이 아니라면 주어진 단어로 임시 치환하고, 그렇지 않으면 아무것도 치환하지 않는다.

${variable:offset}
문자열은 0번부터 옵셋을 시작하는데, 변수의 값에서 옵셋으로 지정된 옵셋부터 시작하는 값으로 치환한다.

(대충 문자열 인덱스라고 생각하면 된다)

${variable:offset:length}

${variable%pattern}
변수의 값 뒷부분부터 % 뒤의 패턴과 일치하는 값을 좁은 부분에서 잘라낸다.

${variable%%pattern}
변수의 값 뒷부분부터 % 뒤의 패턴과 일치하는 값을 넓은 부분에서 잘라낸다.

${variable#pattern}
변수의 값 앞부분부터 # 뒤의 패턴과 일치하는 값을 좁은 부분에서 잘라낸다.

${variable##pattern}
변수의 값 앞부분부터 # 뒤의 패턴과 일치하는 값을 넓은 부분에서 잘라낸다.

${#variable}
변수에 할당된 값의 문자 개수를 치환한다.

 

  • 위치 파라미터들
    명령 라인으로부터 아규먼트로 전달할 때 쉘 스크립트에서 
    사용하거나 함수로 전달된 인자의 값을 유지하기 위해
    함수 안에서 사용.

매번 명령을 실행하면, 해당 명령의 각 인자들을 위치 변수로 지정할 수 있다.

더보기

$0      0번 파라미터, 현재 쉘 스크립트의 이름을 가진다.


$1-$9      1~9번까지의 위치 파라미터의 값을 가진다.


${10}     열 번째 위치 파라미터


$#     위치 파라미터의 값의 개수 반환


$*      모든 위치 파라미터들을 평가


$@      큰 따옴표("")를 사용한 것을 제외하고 $*과 같다.


"$*"      "$1,$2,$3" 형태로 평가한다.


"$@"      "$1","$2","$3" 형태로 평가한다.

 

기타 특수 변수들

더보기

$ 쉘의 프로세스 아이디(PID)


? 마지막으로 실행한 명령의 종료 상태 값


종료 상태 값이 0이면 정상 종료


종료상태값이 1이면 비정상 종료


- 배시쉘의 모든 옵션 목록


! 백그라운드로 실행되고 있는 마지막 명령의 PID값


인용부호
특수 메타 문자와 파라미터 확장을 보호하기 위해 사용
세 가지의 인용부호 사용법이 있는데
백슬래시,작은따움표,큰움표

 

메타 문자

더보기

;      명령 구분자


&      백그라운드 프로세싱


()      명령 그룹화


{}      명령 그룹화


|      명령 이어줌


<     입력 리다이렉션


>     출력 리다이렉션


newline    명령 종료


space/tab    단어 경계 구분


$      변수 치환 문자


* [] ?  파일명 확장을 위한 쉘 메타 문자 


7~8교시

 

 

  • 산술 확장

쉘은 산술 표현식을 해석할 때 산술 확장을 수행한다. 나눗셈의 경우 결괏값에서 나머지는 버려지고 정수 값만 
출력한다.
$[산술 표현식]
$((산술 표현식))

 

 

  • 배열

하나의 변수 이름에 숫자 목록, 이름 목록, 파일목록 등의 단어 목록 집합을 할당할 수 있는 도구.
빌트인 함수 declare -a로 x[0]형태로 생성을 한다.
인덱스 값은 정수 값 0부터 시작한다. 배열에서 최대 크기 제한은 없다.
배열의 요소를 가져올 때에는 ${배열명[index]} 형식을 사용한다.

더보기


declare -a 변수명
변수명=(아이템1,아이템2,아이템3,..)

-> 이렇게 콤마를 찍으면 하나의 값으로 취급된다. 0번 요소에 다 때려 박는 것.

declare -a names
names=(홍길동 장길산 정약용)

-> 빈칸으로 구분하면 각 요소가 배열의 원소로 취급된다.

-> 각 요소를 ${names[0]}, ${names[1]}, ${names[2]} 등으로 지정 출력 가능

-> ${names[*]} 로 전체 출력 가능

 

변수명[인덱스]=변수값

-> 이런 식으로 인덱스에 바로 넣는 것도 가능.

-> 기존에 없던 배열이라면 해당 인덱스에만 값이 들어가고, 그 이전 인덱스는 비어 있다.

 

여러 가지 활용이 가능.

cities=(대구 [3]=부산 서울)

-> 0에는 대구, 1과 2는 비어있고, 3에는 부산, 그다음에 서울.

 

 

  • exec 명령과 리다이렉션

exec 명령은 새로운 프로세스를 시작하지 않고 현재 프로그램을 대신하여 사용될 수 있다.
표준 출력 또는 표준 입력은 서브 쉘을 생성하지 않고 exec명령으로 변경될 수 있다.
만약 파일이 exec 명령으로 오픈되면 파일의 끝까지 한 라인씩 읽게 된다.

exec ls  쉘에서 ls명령을 실행하는데, ls 명령 실행이 완료되면 명령이 실행된 쉘을 빠져나온다.
exec < filea 표준 입력을 읽기 위해 filea를 오픈한다.
exec > filex 표준 출력을 쓰기 위한 filex를 오픈한다.

 

< filename : 입력 리다이렉션

> filename : 출력 리다이렉션

>> filename : 출력 추가

2> filename : 에러 리다이렉션

2>> filename : 에러 추가

$> filename : 출력, 오류 리다이렉션

 

 

  • 파이프 ' | ' -> 명령어1 | 명령어2

 

  • here 다큐먼트 : 사용자 정의형 종결자가 입력될 때까지 입력을 받고자 할 때 사용.

예시) 

#!/bin/bash

cat <<End-of-message

------------------
메시지의 첫 번째 줄입니다.
메시지의 두 번째 줄입니다.
메시지의 세 번째 줄입니다.
------------------

End-of-message

exit 0

-> 앞에서 정의해놓은 End-of-message가 나오기 전까지 실행된다.

 

 

  • 정규표현식

검색에서 사용할 매칭 되는 같은 문자들의 패턴을 의미.

더보기

.
하나의 문자와 일치 "1..e"

?
자신 앞에 나오는 정규표현식이 0개이거나 1개인것과 일치하고 대부분 하나의 문자와 매칭할 때 사용한다.

*
바로 앞의 문자열이나 정규표현식에서 0개 이상 반복되는 문자를 의미

+
자신앞에 나오는 하나이상의 정규표현식과 일치. *와 비슷하게 동작하지만 반드시 하나 이상과 일치

{N}
정확하게 N번이 일치한다.

{N,}
N번 또는 그 이상 일치한다.

{N,M}
N번부터 M번까지 

^
라인의 시작에서 공백 문자열을 의미 
^linux -> 라인에서 linux문자열로 시작하는 모든 라인을 검색

$
라인의 마지막에서 공백 문자열을 의미
linux$ -> 라인에서 linux문자열로 끝나는 모든 라인을 검색

[]
대괄호는 단일 정규표현식에서 문자들을 집합으로 묶어준다.
[xyz]->x,y,z 중 하나의 문자와 일치
[c-n]->c에서 n사이에 속하는 한 문자와 일치
[B-Pk-y]->

[:alnum:]
[A-Za-z0-9]

[:alpha:]
[A-Za-z]

[:digit:]
[0-9]

[:upper:]
[A-Z]

[:space:]

[:lower:]
[a-z]

 

  • grep 패턴

grep [옵션] [패턴] [파일명]

옵션 없으면 패턴과 매칭 하는 라인 출력

-n   매칭 된 라인을 출력 시 라인 번호 출력
-i   대소문자 무시
-v   패턴과 매칭 되지 않는 라인 출력
-l   패턴에 의해 매칭 된 라인이 하나라도 있는 파일의 이름 출력(잘 안 씀)
-c   매칭 된 라인 수를 출력
-w   \<과 \>로 둘러싸인 하나의 단어로 표현식을 검색

^[패턴]  패턴으로 시작하는 단어가 있는 라인 출력


grep '\<Tom\>' file
grep 'Tom Jerry' file
grep '^Tommy' file
grep '\.bak$' file
grep '[A-Z]...[0-9]' file
grep -v 'Jerry' file
grep "$name" file

\
특수문자 특수기능 해제

\<패턴\>
\<software\>

\{N\}


내일은 sed, awk

쉘 프로그래밍 배우느라 Ansible이 미뤄졌다.

댓글