Linux Admin-셸 스크립팅

Bash Shell 소개

GNU Linux의 풍미와 마찬가지로 셸은 다양한 종류가 있으며 호환성도 다양합니다. CentOS의 기본 셸은 Bash 또는 Bourne Again Shell로 알려져 있습니다. Bash 쉘은 Stephen Bourne이 개발 한 Bourne Shell의 현대적인 수정 버전입니다. Bash는 Ken Thompson과 Dennis Ritchie가 Bell Labs에서 개발 한 Unix 운영 체제의 원래 Thompson Shell을 직접 대체했습니다 (Stephen Bourne도 Bell Labs에 고용 됨).

누구나 좋아하는 껍질이 있고 각각의 장점과 어려움이 있습니다. 그러나 대부분의 경우 Bash는 모든 Linux 배포판에서 기본 셸이 될 것이며 가장 일반적으로 사용 가능합니다. 경험이 있으면 누구나 자신에게 가장 적합한 껍데기를 탐색하고 사용하고 싶어 할 것입니다. 그러나 동시에 모든 사람이 Bash 쉘을 마스터하고 싶을 것입니다.

다른 Linux 셸에는 Tcsh, Csh, Ksh, Zsh 및 Fish가 포함됩니다.

전문가 수준에서 Linux 쉘을 사용하는 기술을 개발하는 것은 CentOS 관리자에게 매우 중요합니다. 앞서 언급했듯이 Windows와 달리 Linux의 핵심은 명령 줄 운영 체제입니다. 셸은 관리자 (또는 사용자)가 운영 체제에 명령을 내릴 수 있도록하는 단순한 사용자 인터페이스입니다. Linux 시스템 관리자가 항공 조종사라면 셸을 사용하는 것은 비행기를 자동 조종 장치에서 내리고보다 기동성있는 비행을 위해 수동 제어 장치를 잡는 것과 비슷할 것입니다.

Bash와 같은 Linux 쉘은 컴퓨터 과학 용어로 Command Line Interpreter. Microsoft Windows에는 DOS (원래 DOS 운영 체제와 혼동하지 말 것) 및 PowerShell이라는 두 개의 명령 줄 인터프리터도 있습니다.

Bash와 같은 대부분의 최신 쉘은 constructs더 복잡한 쉘 스크립트 가 일반적인 작업과 복잡한 작업을 모두 자동화 할 수 있습니다.

구성은 다음을 포함합니다-

  • 스크립트 흐름 제어 (ifthen 및 else)
  • 논리적 비교 연산 (보다 큼,보다 작음, 같음)
  • Loops
  • Variables
  • 작동을 정의하는 매개 변수 (명령이있는 스위치와 유사)

쉘 스크립트와 스크립팅 언어 사용

종종 작업 수행을 생각할 때 관리자는 스스로에게 묻습니다. 쉘 스크립트 나 Perl, Ruby 또는 Python과 같은 스크립팅 언어를 사용해야합니까?

여기에는 정해진 규칙이 없습니다. 쉘과 스크립팅 언어 사이에는 일반적인 차이점 만 있습니다.

껍질

Shell은 sed , grep , tee , cat 및 기타 모든 명령 줄 기반 유틸리티와 같은 Linux 명령을 Linux 운영 체제에서 사용할 수 있도록합니다. 실제로 거의 모든 명령 줄 Linux 유틸리티를 셸에서 스크립팅 할 수 있습니다.

셸을 사용하는 좋은 예는 DNS 확인을 위해 호스트 목록을 확인하는 빠른 스크립트입니다.

DNS 이름을 확인하는 간단한 Bash 스크립트-

#!/bin/bash 
for name in $(cat $1);
   do 
      host $name.$2 | grep "has address" 
   done 
exit

DNS 확인을 테스트하는 작은 단어 목록-

dns 
www 
test 
dev 
mail 
rdp 
remote

google.com 도메인에 대한 출력 −

[rdc@centos ~]$  ./dns-check.sh dns-names.txt google.com
-doing dns
dns.google.com has address 172.217.6.46
-doing www
www.google.com has address 172.217.6.36
-doing test
-doing dev
-doing mail
googlemail.l.google.com has address 172.217.6.37
-doing rdp
-doing remote

[rdc@centos ~]$

쉘에서 간단한 Linux 명령을 활용하여 단어 목록에서 DNS 이름을 감사하는 간단한 5 줄 스크립트를 만들 수있었습니다. 훌륭하게 구현 된 DNS 라이브러리를 사용하더라도 Perl, Python 또는 Ruby에서는 상당한 시간이 걸렸을 것입니다.

스크립팅 언어

스크립팅 언어는 쉘 외부에서 더 많은 제어를 제공합니다. 위의 Bash 스크립트는 Linux 호스트 명령 주위에 래퍼를 사용했습니다 . 더 많은 작업을 수행하고 호스트 와 같은 자체 애플리케이션을 쉘 외부에서 상호 작용 하도록 만들고 싶다면 어떨까요? 스크립팅 언어를 사용하는 곳입니다.

또한 고도로 유지 관리되는 스크립팅 언어를 사용하면 대부분의 경우 다른 시스템에서 작업이 작동한다는 것을 알고 있습니다. 예를 들어 Python 3.5는 동일한 라이브러리가 설치된 Python 3.5를 실행하는 다른 시스템에서 작동합니다. Linux와 HP-UX 모두에서 BASH 스크립트를 실행하려면 그렇지 않습니다.

때때로 스크립팅 언어와 강력한 셸 사이의 경계가 모호해질 수 있습니다. Python, Perl 또는 Ruby를 사용하여 CentOS Linux 관리 작업을 자동화 할 수 있습니다. 그렇게하는 것은 정말 흔한 일입니다. 또한 풍부한 쉘 스크립트 개발자는 Bash에서 간단하지만 기능적인 웹 서버 데몬을 만들었습니다.

스크립팅 언어 및 쉘에서 작업 자동화 경험이있는 CentOS 관리자는 문제를 해결해야 할 때 어디서부터 시작할지 신속하게 결정할 수 있습니다. 쉘 스크립트로 프로젝트를 시작하는 것은 매우 일반적입니다. 그런 다음 프로젝트가 더 복잡 해짐에 따라 스크립팅 (또는 컴파일 된) 언어로 진행합니다.

또한 프로젝트의 다른 부분에 스크립팅 언어와 쉘 스크립트를 모두 사용하는 것이 좋습니다. 예를 들어 웹 사이트를 스크랩하는 Perl 스크립트가 있습니다. 그런 다음 쉘 스크립트를 사용하여 sed , awkegrep 로 구문 분석하고 형식을 지정하십시오 . 마지막으로 웹 GUI를 사용하여 형식화 된 데이터를 MySQL 데이터베이스에 삽입하기 위해 PHP 스크립트를 사용합니다.

셸에 대한 몇 가지 이론을 가지고 CentOS의 Bash 셸에서 작업을 자동화하기위한 기본 구성 요소부터 시작하겠습니다.

입력 출력 및 리디렉션

다른 명령으로 stdout 처리-

[rdc@centos ~]$ cat ~/output.txt | wc -l 
6039 
[rdc@centos ~]$

위에서 우리는 cat'sstoud파이프 문자로 처리 하기 위해 wc 로 전달 했습니다 . 그런 다음 wccat 의 출력을 처리하여 output.txt의 행 수를 터미널에 인쇄합니다. 파이프 문자는 다음 명령에 의해 처리 될 한 명령의 출력을 전달하는 "파이프" 라고 생각하십시오 .

다음은 명령 리디렉션을 처리 할 때 기억해야 할 주요 개념입니다.

번호 파일 설명자 캐릭터
0 표준 입력 <
1 표준 출력 >
2 표준 에러
stdout 추가 >>
리디렉션 할당 &
stdout을 stdin으로 파이프 |

리다이렉션이나 리다이렉션 할당에 대해 많이 이야기하지 않고 1 장에서 이것을 소개했습니다. Linux에서 터미널을 열면 쉘이 다음에 대한 기본 대상으로 표시됩니다.

  • 표준 입력 <0
  • 표준 출력> 1
  • 표준 오류 2

이것이 어떻게 작동하는지 봅시다-

[rdc@centos ~]$ lsof -ap $BASHPID -d 0,1,2 
 COMMAND   PID   USER    **FD**   TYPE DEVICE   SIZE/OFF   NODE      NAME 
 bash    13684    rdc    **0u**   CHR  136,0      0t0     3      /dev/pts/0 
 bash    13684    rdc    **1u**   CHR  136,0      0t0     3      /dev/pts/0 
 bash    13684    rdc    **2u**   CHR  136,0      0t0     3      /dev/pts/0
 
[rdc@centos ~]$

/ dev / pts / 0 은 의사 터미널입니다. CentOS Linux는이를보고 직렬 인터페이스를 통해 연결된 키보드와 디스플레이가있는 실제 터미널과 같은 개방형 터미널 애플리케이션을 생각합니다. 그러나 하이퍼 바이저가 하드웨어를 운영 체제로 추상화하는 것처럼 / dev / pts 는 터미널을 애플리케이션으로 추상화합니다.

위의 lsof 명령에서 다음을 볼 수 있습니다.FD세 개의 파일 설명자가 모두 가상 터미널 (0,1,2)로 설정되어있는 열입니다. 이제 명령을 보내고 명령 출력 및 명령과 관련된 오류를 볼 수 있습니다.

다음은 STDIN 및 STDOUT의 예입니다.

STDOUT

[root@centosLocal centos]# echo "I am coming from Standard output or STDOUT." >
output.txt && cat output.txt
I am coming from Standard output or STDOUT. 
[root@centosLocal centos]#

stdoutstderr 를 별도의 파일 로 보낼 수도 있습니다.

bash-3.2# find / -name passwd 1> good.txt 2> err.txt
bash-3.2# cat good.txt
/etc/pam.d/passwd
/etc/passwd
bash-3.2# cat err.txt 
find: /dev/fd/3: Not a directory
find: /dev/fd/4: Not a directory
bash-3.2#

전체 파일 시스템을 검색 할 때 두 가지 오류가 발생했습니다. 각각은 나중에 열람 할 수 있도록 별도의 파일로 전송되었으며 반환 된 결과는 별도의 텍스트 파일에 저장되었습니다.

stderr 를 텍스트 파일 로 보내는 것은 응용 프로그램 컴파일과 같이 터미널에 많은 데이터를 출력하는 작업을 수행 할 때 유용 할 수 있습니다. 이렇게하면 터미널 스크롤 백 기록에서 손실 될 수있는 오류를 열람 할 수 있습니다.

STDOUT을 텍스트 파일로 전달할 때 한 가지 참고 사항은 >>>. 이중 ">>"는 파일에 추가되고 단수 형식은 파일을 방해하고 새 내용을 작성합니다 (따라서 이전 데이터가 모두 손실 됨).

STDIN

[root@centosLocal centos]# cat < stdin.txt
Hello,
I am being read form Standard input, STDIN.

[root@centosLocal centos]#

위의 명령에서 stdin.txt 텍스트 파일 은 내용을 STDOUT에 에코 하는 cat 명령 으로 리디렉션되었습니다 .

파이프 문자 "|"

파이프 문자는 첫 번째 명령의 출력을 가져 와서 다음 명령에 대한 입력으로 전달하여 보조 명령이 출력에 대한 작업을 수행 할 수 있도록합니다.

이제 cat의 stdout을 다른 명령으로 "파이프"해 보겠습니다.

[root@centosLocal centos]# cat output.txt | wc -l
2
[root@centosLocal centos]#

위의 wc 는 파이프에서 전달 된 cat의 출력을 계산합니다 . 여과로부터의 출력시 파이프 명령 특히 유용 그렙 또는 egrep을이 -

[root@centosLocal centos]# egrep "^[0-9]{4}$" /usr/dicts/nums | wc -l  
9000 
[root@centosLocal centos]#

위의 명령에서 우리 는 egrep 필터를 통해 전달 된 65535의 모든 숫자를 포함하는 텍스트 파일에서 모든 4 자리 숫자를 wc 로 전달했습니다 .

&를 사용하여 출력 리디렉션

출력은 &캐릭터. 출력을 STDOUT과 STDERR 모두 동일한 파일로 지정하려면 다음과 같이 수행 할 수 있습니다.

[root@centosLocal centos]# find / -name passwd > out.txt 2>&1
[root@centosLocal centos]# cat out.txt  
find: /dev/fd/3: Not a directory 
find: /dev/fd/4: Not a directory 
/etc/passwd

[root@centosLocal centos]#

다음을 사용하여 리디렉션 &문자는 다음과 같이 작동합니다. 먼저 출력이 out.txt 로 리디렉션됩니다 . 둘째, STDERR 또는 파일 설명자 2가 STDOUT과 동일한 위치 (이 경우 out.txt )에 다시 할당됩니다 .

리디렉션은 매우 유용하며 큰 텍스트 파일을 조작하고 소스 코드를 컴파일하고 셸 스크립트에서 출력을 리디렉션하고 복잡한 Linux 명령을 실행할 때 발생하는 문제를 해결하는 데 유용합니다.

강력하지만 새로운 CentOS 관리자에게는 리디렉션이 복잡해질 수 있습니다. Linux 포럼 (예 : Stack Overflow Linux)에 대한 연습, 연구 및 비정기적인 질문은 고급 솔루션을 해결하는 데 도움이됩니다.

배쉬 쉘 구성

이제 Bash 셸 이 어떻게 작동 하는지에 대한 좋은 아이디어를 얻었 으므로 스크립트를 작성하는 데 일반적으로 사용되는 몇 가지 기본 구조를 배우겠습니다. 이 섹션에서 우리는 탐구 할 것입니다-

  • Variables
  • Loops
  • Conditionals
  • 루프 제어
  • 파일 읽기 및 쓰기
  • 기본 수학 연산

BASH 문제 해결 힌트

BASH는 전용 스크립팅 언어에 비해 약간 까다로울 수 있습니다. BASH 스크립트에서 가장 큰 중단은 쉘로 전달되는 스크립트 작업을 잘못 이스케이프하거나 이스케이프하지 않기 때문입니다. 스크립트를 몇 번 살펴 봤는데 예상대로 작동하지 않는 경우 걱정하지 마십시오. 이것은 BASH를 사용하여 매일 복잡한 스크립트를 만드는 사람들에게도 일반적입니다.

Google을 빠르게 검색하거나 Linux 전문가 포럼에 가입하여 질문을하면 빠른 해결로 이어질 것입니다. 누군가가 정확한 문제를 발견하고 이미 해결되었을 가능성이 큽니다.

BASH 스크립팅은 관리 작업 자동화에서 유용한 도구 생성에 이르기까지 모든 것을위한 강력한 스크립트를 빠르게 생성하는 훌륭한 방법입니다. 전문가 수준의 BASH 스크립트 개발자가 되려면 시간과 연습이 필요합니다. 따라서 가능하면 BASH 스크립트를 사용하십시오. CentOS 관리 도구 상자에있는 훌륭한 도구입니다.