쉘 스크립트
쉘 스크립트는 쉘 명령어들을 묶어서 하나의 파일로 만들어서 실행시키게 한다. 쉘 스크립트에도 일반 고급 프로그래밍 언어처럼 조건문, 반복문 등을 표현할 수 있어서 가볍고 강력하고 풍부한 프로그램을 작성할 수 있다. 쉘 스크립트는 메모장 등 아무 문서 편집기에서 작성해도 되고 별도의 컴파일 과정을 거치지 않고 즉시 사용할 수 있다. 주석은 #으로 시작하면 되고, 'bash(OR sh OR ./)스크립트_파일_명'해서 현재 디렉터리에 있는 쉘 스크립트 파일을 실행시키면 된다.
조건문
조건에 따라서 실행되는 문을 작성할 때 사용된다.
IF (~ ELSE)문
주어진 조건을 비교해서 결과가 참이나 거짓이냐에 따라서 실행할 명령어를 써주면 된다.
if [ 조건 ]; then # [ 조건 ]에서 [ 과 ] 사이에 빈 공간이 있어야 한다
조건이 참일 때 실행문
fi 구문인데, If [ 조건 ]이 참일 경우 if 아래의 실행문이 실행된다.
또
if [ 조건1 ]; then
조건1이 참일 때 실행문1 # [ 조건1 ]이 참이면 실행문1이 실행되고 [ 조건문2 ]는 건너뛴다
elif [ 조건2 ]; then # [ 조건1 ]이 거짓이고 [ 조건2 ]가 참일 때
조건2가 참일 때 실행문2 # 실행문2가 실행된다
elif ...
......
else # 위의 [ 조건1 ]과 [ 조건2 ]가 모두 거짓일 때
실행문3 # 실행문3이 실행된다
fi 구문도 있는데 if [ 조건1 ]이 참이면 if 아래의 실행문1이 실행되고, 거짓이면 다음에 있는 elif [ 조건2 ]를 봐서 참이면 실행문2가 실행되고, [ 조건1 ]과 [ 조건2 ]가 모두 거짓이면 최종적으로 else 이하의 실행문3이 실행되게 된다. 조건이 하나면 'elif ~ 실행문2' 까지 생략해도 된다. [ ~ ]에서 [ 과 ] 전후에 반드시 한 칸이 띄어져 있어야 한다. if 문 안에 도 다른 if 문이 들어 갈 수도 있다.
** 조건 연산자
-d directory, -e file, -f general file, -s size not 0, -w writable, -x executable file, -z meaning !
** 비교 연산자
A -eq B, A -ne B, A -gt B, A -lt B, A -ge B, A -le B, !string
==>equal(==:같다), not equal(!=:다르다), greater than(>:초과), less than(<:미만), greater equal(>=:이상), less equal(<=:이하)
** 관계 연산자
-a &&(and), -o ||(or)
CASE 문
case 문은 다중 if 문인 if ~ elif ~ elif ~ else ~처럼 여러 조건 중에서 맞는 조건을 만나면 해당 조건의 실행문을 수행하고 프로그램을 벗어난다. 참과 거짓인 두 가지 조건만 가지고 있는 IF 문과 다르게 여러 상황에 맞게 조건을 세분화해서 각각 실행문을 지정하므로 IF 문을 여러 개 쓰는 것보다 작성과 가독성에서 더 효과가 있다. Linux의 여러 서비스 데몬들이 이 구문을 주로 사용한다. 구문은 다음과 같다.
if [ 조건1 ]; then
실행문1
elif [ 조건2 ]; then
실행문2
else
실행문3 과 유사하다.
==>이를 case 문으로 바꾸면
case 조건 in
조건1 )
실행문1 ;; # 조건1이 참일 때 실행된다
조건2 )
실행문2 ;; # 조건2가 참일 때 실행된다
* )
실행문3 ;; # 조건1도 아니고 조건2도 아닐 때 실행된다
여기서 보는 것처럼 case 뒤에 조건을 넣고, 각 '조건 )' 아래 실행할 명령어를 한 줄에 하나씩 적은 뒤 ;;으로 끝내고, 맨 마지막에는 어느 조건에도 해당되지 않을 때 실행되는 실행문을 '* )' 아래에 넣어준다.
반복문
반복문은 반복적인 작업을 쉽게 처리할 때 사용되므로 매우 요긴하게 사용된다.
FOR 문
for는 대표적인 반복문으로써
for 변수 in 인자1 인자2 인자3 …
do
실행문 # in 인자 ...에서 인자가 유효하게 존재하는 동안 반복적으로 실행문이 실행된다
done 구문이다.
=>여기서 'in 인자1 인자2 인자3 ...' 이나 'in {인자1 인자2 인자3 ...}'식으로 인자를 나열해주는 것은 매우 비현실적(인자 수가 100이나 1000이면???)이므로 일반 C 프로그래밍에서처럼 'for (( 최초_값;마지막_값;증감_연산자(++/--) ))' 형식을 주로 사용한다. 여기서 (( ~ ))로 괄호가 두 개인 것에 주의하고 [ ]에서처럼 (( 와 )) 사이에 한 칸 띄어야 한다.
While 문
이 while 구문은 주어진 조건이 참인 동안 실행문이 실행되게 된다.
while [ 조건 ] # 참인 조건으로 [ true ] or [ : ], [ 1>0 ]식이나
[ -e /etc/passwd ] 나 [ -f /etc/shadow ]처럼 써줘도 된다.
do
실행문 # [ 조건 ]이 참인 동안 실행문이 실행된다
done 구문이다.
Unitl 문
until 문은 while 문과 반대로 do ~ done 명령문이 실행되다가 until 조건에 맞는 순간 실행을 끝낸다. 일단 한 번은 실행한 뒤 조건을 판단하기 때문에 적어도 한 번은 실행되는 특징이 있다. 대부분 While 문은 until 문으로 바꿔줄 수 있다.
until 조건
do
실행문 # 조건이 아닌 동안 실행된다
done 구문이다.
제어문(break, continue, exit, 그리고 return)
이들 지시어는 FOR, WHILE, UNTIL 반복문에서 흐름을 돌리거나 무한 루핑(looping)을 막는데 사용된다.
종류 설명
break 반복문을 빠져나가서 다음 문장을 실행하게 한다. break 뒤에 exit 0이나 exit 1을 사용할 수도 있는데 이는 반복문을 끝내고 빠져나간다는 뜻으로 쉘 스크립트를 종료한다는 문장끝의 exit 0와 다른 의미이다.
continue 다시 조건식으로 가서 참/거짓 여부를 확인해서 참이면 이어서 실행한다.
exit 해당 반복문을 빠져나가거나 스크립트를 종료한다. 이 부분은 생략해도 된다.
return 함수를 호출한 곳에 (파라미터) 인자 값을 전해주는 일을 한다.
SELECT 문
이 구문은 주로 메뉴를 생성할 때 사용되는 특수한 형식으로
select 변수 in [항목1 항목2 항목3 ....]
do
실행문 # 항목이 유효할 때 실행될 실행문
done 구문이다.
Xargs는 표준입력(stdin)으로 명령어를 입력받아서 작업을 수행 한 뒤 표준출력(stdout)으로 결과를 보인다.
함수
함수(function)는 어느 계산을 수행시키는 일단의 코드 블럭이다. 쉘에 들어있는 add(), sum() 등 내장 함수와 사용자가 임의로 작성한 사용자정의 함수가 있다. 함수를 사용할 때에는 변수처럼 미리 선언하지 않고, 함수를 생성해서 바로 사용하면 된다.
형식은
(function) 함수_명(인자1, 인자2, ..) { # 함수 정의. () 속에는 함수실행에 필요한 요소(인자)가 들어간다
실행문 # 함수 몸체
}
함수_명 # 함수 호출 구문이다.
=>함수 호출에서의 함수_명은 함수 정의에서의 함수_명과 일치해야 한다.
** 지역변수는 local 변수_명으로 선언하는데 해당 함수 내에서만 사용되고, 함수가 종료되면 변수도 사라진다. 번역변수는 보통 상수처럼 대문자로 사용하는데 함수의 실행과 무관하게 항상 값을 가지는 변수이다.
Shell Library
쉘 라이브러리는 다양한 함수들을 모아서 만든 파일로써 보통 단독으로 실행되지 않고 어느 응용 프로그램에서라도 별도의 변형 없이 바로 불러서 사용할 수 있는 파일이다. 솔루션을 개발할 때 중요하거나 자주 사용되는 함수들을 모아서 라이브러리 파일로 만들어 두고 여러 어플에서 수시로 불러들여 사용하면 효율적으로 작업을 할 수 있다.
eval
eval은 문자열(명령어)을 변수로 인식해서 실행시킨다.
export
이 export는 A 프로세스 안에 있는 변수를 B 프로세스로 전해주는 명령어이다. 하나의 export 변수를 차일드 변수로 놔두고 여러 부모 프로세스들이 이 차일드 변수를 불러서 사용할 수 있다.
해킹에서도 자주 사용하는 기법인데 일차로 타겟 머신에 들어가서 export 변수가 들어있는 간단한 백도어 파일을 넣어두고,
나중에 침투머신에서 Metasploit 등으로 타겟머신과 연결 한 뒤 타겟머신의 정보를 가지고 있는 export 변수를 불러내서 침투작업과 연계해서 작업을 수행시킨다.
set와 unset
이 명령어는 앞에서 잠깐 살펴보았는데 변수를 설정하거나 설정된 변수를 해제할 때 사용된다. 쉘 스크립트에서는 배치파일처럼 현재 줄에 치명적인 오류가 있지 않다면 다음 줄로 내려가서 실행되는데 set –e 하면 오류가 있는 줄에서 바로 프로그램을 종료시킨다.
외부 프로그래밍 언어를 불러들여서 사용하기
쉘 스크립트에 Java, C, C++, Python, 그리고 Awk와 같은 외부 프로그래밍 언어나 편집기를 불러들이는 Wrapping을 할 수 있다.