[Linux]Shell script Basic - 1
쉘 스크립트는 쉘에게 어떤 명령을 실행할 지 알려주는 스크립트 파일입니다. 기본 명령어를 기반으로 하고, 이에 문법 몇가지를 추가한 형태이기 때문에 일반적인 프로그래밍 언어보다는 쉬운편에 속해요.
C언어에서
#include <stdio.h>
int main()
{
return 0;
}
가 기본 문법이 되듯이 쉘 스크립트에도 기본 문법이 존재하고 다음과 같습니다.
1) 쉘 스크립트는 파일로 작성 후, 파일을 실행해야 한다.
2) 파일의 가장 위 첫 줄에는 '#! /bin/bash"로 시작해야 한다.
3) 쉘 스크립트 파일은 실행 권한을 가지고 있어야 한다.
4) 일반적으로 .sh의 확장자를 명시해야 한다.
저는 칼리 리눅스 환경을 이용하겠습니다.
일단 shell_script 디렉토리를 mkdir 명령어로 생성하고 cd 명령어로 기본 디렉토리에서 해당 디렉토리로 이동하겠습니다.
그 후 편집기를 열어서 해당 내용을 작성할건데, 그전에 편집기에 대해서 먼저 짚고 넘어가죠.
리눅스에는 2개의 편집기가 있습니다. 바로 vi 와 vim 입니다.
vi 는 유닉스의 기본 편집기이고, 이를 개량한 버전이 vim 에디터 입니다. vim도 vi improved 약자로 vi 보다 성능이 낫다는 점을 알려주고 있습니다. 왜냐하면 vi 는 기본 편집기이기 때문에 텍스트 편집에 필요한 정말 최소한의 기능만을 지니고 있거든요. 즉, vi 와 vim은 크게 다르지 않으니 맘편하게 원하는 거 쓰시면 될거 같습니다. 저는 vi 쓸게요.
파일을 처음만들면 ~ 가 앞에 있는 빈 화면이 나오는데 이 경우에는 바로 입력할 수 없기 때문에 insert 키를 눌러서 끼워넣기(insert)로 위처럼 바꿔주신 후 입력하면 정상적으로 입력 됩니다.
이처럼 코드를 작성하고 나면 저장해야겠죠? 저장하기 위해선 ESC 를 눌러 끼워넣기(insert)모드를 나온 후 : wq 를 통해 저장과 동시에 나오면 됩니다. 나갈 때 사용하는 명령어들은 다음을 참고해주세요.
실행시키려면 ./ 을 사용해 이게 파일 명이라는 걸 명시해줘야 합니다.
그런데 허가거부라고 하네요? 아마 권한이 없어서 그런거 같습니다. 왜냐하면 리눅스에서는 특정 명령을 실행하거나 파일에 접근하기 위해선 루트(root)권한이 필요합니다. 간단히 말해 관리자 권한? 정도로 생각하시면 될듯 합니다. 만약 일반 사용자(유저)가 root 권한을 얻기 위해선 su 또는 sudo 명령어를 사용합니다.
1) su (switch user) 명령어
현재 계정을 로그아웃 하지 않고 다른 계정으로 전환합니다. 일단 whoami 명령어로 지금 어떤 계정인지 확인해볼게요.
그럼 이제 root 사용자로 변경해보겠습니다. 이 경우 su 만 입력하면 됩니다.
..? 칼리리눅스 초기 계정의 비밀번호는 아이디와 동일하게 kali 라서 kali라 입력했으나 인증 실패가 발생하였네요. 그럼 어쩔 수 없이 sudo passwd로 명령어를 실행하여 root 계정의 비밀번호를 설정하겠습니다.
칼리 리눅스는 보안상의 이유로 비밀번호를 보이지 않게 만들었습니다. 그렇다고 놀라실 필요는 없습니다. 보이지는 않아도 정상적으로 입력되고 있는거니까요.
exit 명령어를 통해 이전 계정으로 돌아올 수 있습니다.
2) sudo (superuser do) 명령어
현재 계정에서 superuser 즉, root 권한을 이용해 명령어를 실행할 경우 사용합니다.
ex) sudo apt-get update 다만 명령어를 입력하고 나면 여기서 su와 다른 점이 나옵니다. su 명령어가 root 계정의 비밀번호를 물어봤다면 sudo 명령어는 현재 사용자의 비밀번호를 물어봅니다. 하지만 sudo - i 나 - s 를 옵션으로 줌으로써 su 명령어와 동일하게 root 계정으로 전환이 가능하죠. (s 는 현 디렉토리 유지 i 는 /root 디렉토리 이동)
이제 본론으로 돌아와 파일을 실행시켜보겠습니다.
혹시나 해서 ls명령어에 -al 를 옵션으로 줘서 해당 디렉토리의 모든 파일 정보를 출력해서 봤더니
혹시나가 역시나네요. 여기서
d 는 directory, - 는 파일
-r(읽기)w(쓰기)-r--r--는 허가권 + (x는 실행 권한), kali(UID[사용자 ID]) kali(GID[그룹 ID]) 는 소유권입니다.
56은 용량이고, 7월 13일 22:02는 생성 날짜와 시간, test.sh는 파일명입니다.
여기서 한마디를 덧붙이자면 허가권은 3칸씩 묶어 Owner, Group, Others의 파일 사용권한을 의미해요.즉, test.sh는 kali(사용자)가 읽고 쓸수 있으며, kali(그룹)와 다른 사용자들은 읽기밖에 하지못합니다.
따라서 우리는 chmod 명령어로 권한을 부여해줘야 하는데요
일단 파일의 권한을 알아야겠죠. 파일의 권한은 크게 3가지로 구분할 수 있습니다.
1) 읽기 Reading - 4
2) 쓰기 - Writing - 2
3) 실행 - Executing - 1
이때 권한들은 연속된 숫자가 세번 표기됩니다. (권한들의 합으로)
ex) chmod 777 이라면?
처음의 7[4(읽기) + 2(쓰기) + 1(실행)]은 소유자 권한, 두번째의 7[4(읽기) + 2(쓰기) + 1(실행)]은 그룹 사용자 권한, 세번째의 7[4(읽기) + 2(쓰기) + 1(실행)]은 기타 사용자권한입니다. 따라서 모든 사용자가 해당 파일을 읽고 쓰고 실행시킬 수 있다는 말이겠죠.
아니.. 그러면 root 계정으로 로그인을 한 의미가.. 없..
암튼, 권한 부여도 했으니 다시 실행해봅시다.
으아.. 드디어 성공했네요. 결과를 보면 제가 따로 줄바꿈을 해주지 않았음에도 echo는 줄바꿈이 된 반면 printf 는 그렇지 않다는 걸 알 수 있어요. 그리고 이외에도 printf 를 이용하면 C언어처럼 서식지정자에 문자열을 전달할 수 도 있어요.
+ # 은 주석이에요.
1. 변수(variable)
쉘스크립트에서도 다른 언어들처럼 변수를 사용할 수 있는데, 값을 할당할 때도 다른 언어처럼 할당연산자(=)를 사용합니다. 그리고 사용할 때는 앞에 $를 붙여줍니다. 중괄호로 묶어줄 수 도 있어요.
제가 C언어에 익숙해져서 잊고 있던 사실인데 변수를 선언하고 값을 할당하려고 =(할당 연산자)를 사용할 때 리눅스에선 띄어쓰기하면 안됩니다. 인식 못해요. 그리고 저희는 export 를 사용하여 다른 쉘 스크립트를 사용할 수 있습니다. 이 때 중요한 점 export 는 수출이라는 의미를 가지고 있는 영단어입니다. 그러니까 export 는 파이썬에서 쓰는 import 와는 달리 자신의 변수를 다른 스크립트에서도 사용할 수 있게 외부로 보낸다 정도로 이해하면 될거 같습니다.