trainer6 - 패스워드 파일 분석 방법
cat (파일이름) 명령어 : 파일의 내용을 화면에 출력한다.
이전 시간부터 등장했던 cat 명령어의 정확한 쓰임새가 드디어 나왔다.
이 명령어를 이용해서 지난 시간에 보았던 etc 디렉토리의 passwd 파일을 한 번 열람해 보겠다.
읽어보면 위와 같은 결과가 나온다.
패스워드 파일(/etc/passwd) : 한 서버를 사용하는 사용자들의 모든 정보를 기록해 놓은 파일.
아이디, 로그인에 사용한 암호, 소속 그룹, 이름 등 말 그대로 모든 정보가 위와 같이 기록되어 있다.
각 행은 7개의 필드로 나누어져 있으며, 필드와 필드는 : 문자를 통해 구분된다.
1. 아이디(계정)
2. 패스워드
초창기 리눅스에서는 해당 부분을 암호화한 문자열로 나타냈으나, 현재는 크래커 프로그램으로 파훼당할 것을 우려하여 x라는 문자로만 나타내고 있다. 실제 유저들의 패스워드는 /etc/shadow 파일에 들어가 있다. (그러니까, passwd 파일은 이름만 패스워드일 뿐 진짜 패스워드는 들어있지 않은 것이다!) 이 쉐도우 파일은 관리자 권한을 가진 사람이 아니면 열람이 불가능하다. 리눅스 6.0 버전 이후의 리눅스들은 이러한 방법을 채택하고 있다.
3~4. 그룹
해당 사용자의 식별자(위 설명의 맥락으로 파악하자면 그와 비슷한 개념인 듯)와 그룹을 숫자로 나타낸다.
그룹에 대해서는 추후 training9에서 배우게 될 것이다.
5~7. 이름과 기본 디렉토리, 초기 실행 프로그램
다섯 번째 필드는 사용자의 이름, 여섯 번째 필드는 로그인 시 기본적으로 위치하게 되는 디렉토리를 말해준다.
일곱 번째 필드는 해당 사용자가 처음 로그인했을 때 실행되게 할 프로그램을 표시한다. 보통은 쉘이 실행된다.
trainer7 - 파일의 압축과 해제
백업 = 데이터를 다른 곳에 똑같이 복사하여 보관하는 것.
리눅스는 서버 용도로 사용되는 OS이므로 수시로 새로운 데이터들이 업데이트되고, 이 데이터의 손실을 방지하기 위해 백업이 필수로 요구된다. 이러한 백업 과정에서 파일을 압축하고 또 해제하는 명령어들이 사용된다.
tar 명령어
리눅스에서 압축에 사용되는 명령어는 두 개. 하나는 tar, 하나는 gzip이다.
tar (+옵션) (대상 파일) 명령어 : 다수 개의 파일을 하나로 합치는 명령어.
c(Create) = 새로운 파일 생성
x(eXtract) = 압축 해제
v(View) = 압축/해제 과정을 출력
f(File) = 파일로 백업
위의 명령은 현재 디렉토리에 있는 모든(*)파일을 새로운 파일로 합치는 명령어다.
사용 시점에서 디렉토리는 '가사집' 이었으며 그 안에는 '넥스트4집-가사', '샵3집-가사', '서태지2집-가사' 파일들이 들어 있었으므로, 이 세 파일을 합쳐 songs.tar라는 새로운 파일을 만들어낸 것이다.
하지만 이 동작은 '압축'이 아니고, tar 명령어는 압축 명령어가 아니다. 왜일까?
그렇다. 압축의 요지는 말 그대로 합쳤을 때 '용량이 줄어들어야' 하는 것이다. 누구도 우유곽 세 개를 그냥 이어붙인 것을 '압축했다' 라고 하지 않는다. 세 개를 한데 모아다가 꽉꽉 밟아서 부피를 줄여야 거기서부터 '압축'이 되는 거다.
하지만 tar 명령으로 만든 파일을 보라. 원본 파일들의 용량은 대충 봐도 다 합해 30000이 될까말까할 것 같은데, 만들어진 songs 파일은 용량 40000이 넘어간다. 그럼 이건 대체 어디다 쓰는 프로그램일까?
위의 내용대로다. tar 명령어의 이점은 복구 속도다. 꽉꽉 밟아 찌그러뜨린 우유곽은 펴는 데만도 한세월이겠지만 양면테이프로 단순히 이어붙이기만 한 우유곽들은 힘만 조금 주면 똑똑 떨어져서 금방 원래대로 돌아온다. 비유하자면 그런 것이다. 찌그러뜨려서 부피를 줄이는 것은 gzip, 단순히 이어붙이기만 하는 것은 tar 명령어라고 생각하면 이해가 편하다.
더군다나 진정한 의미의 '압축'에 해당하는 gzip 명령어는 한번에 파일 한 개씩밖에 압축할 수 없다는 제약이 있다.
그러면 파일 여러 개를 tar 명령어로 하나로 모은 다음에
그 하나가 된 파일을 gzip 명령어로 압축해버리면 되는 것 아닌가?
압축에 쓰이는 두 명령어는 이런 식으로 시너지를 내는 것이다.
gzip 명령어
gzip (파일이름) 명령어 : 해당 파일을 압축한다.
gzip -d (파일이름) 명령어 : 해당 파일의 압축을 해제한다.
위에서 tar 명령어로 만든 songs.tar 파일을 gzip 명령어로 압축했다. 파일명 뒤에도 .gz라는 확장자가 붙었다.
용량은? 4만에서 1만 남짓하게 훅 줄었다.
합치기 전의 파일 중 하나보다도 크기가 작아졌으니 그 효과는 확실히 뛰어나다 볼 수 있다.
이처럼 tar 명령어로 압축(결집) 한 파일은 .tar , gzip 명령어로 압축한 파일은 .gz ,
tar 명령어 이후에 gzip 명령어로 재차 압축한 파일은 .tar.gz나 .tgz라는 확장자를 갖게 된다.
이제 압축한 파일을 풀어 보자. tar 명령어에서 원본을 지우지 않고 새로운 파일을 생성하는 방식을 택했기 때문에
압축에 사용했던 파일들은 원본이 그대로 남아 있다.
압축 해제한 파일과 구분을 짓기 위해 이들을 rm 명령어로 모두 지워준다.
압축을 푸는 것은 압축할 때 거쳤던 과정을 정확히 반대로 돌리면 된다.
여러 개의 파일을 하나로 결집 > 결집한 파일의 크기를 압축
의 과정을 거쳤으므로
하나의 작은 압축파일을 원래 크기대로 복구 > 복구한 결집체 파일을 각각의 원본 파일들로 분리
의 과정을 거친다.
명령어로는 다음과 같다.
gzip -d (파일이름.tar.gz) > tar xvf (파일이름.tar)
백업해두고자 하는 파일은 위의 과정을 거쳐 압축 및 보관해둔 뒤
후에 파일 손실이 일어났거나 시스템을 재설치할 때
다시 위와 같이 복구 과정을 거쳐 복원해주면 된다.
trainer8 - 파일 생성, 컴파일, 실행
리눅스에서 프롬프트를 통해 만드는 파일에는 두 가지가 있다.
- 일반 텍스트 파일 : 글자로만 이루어진 파일. cat 명령어를 통해 내용을 출력한다.
- 프로그램 소스 파일 : 텍스트로 이루어진 것은 동일하나, 컴파일을 거친 후 사용한다.
텍스트 파일 생성과 리다이렉션
텍스트 파일을 생성하기 위해선 다음의 절차를 따르면 된다.
- 프롬프트에서 cat > (파일이름).txt 입력
- 파일 내용 입력
- Ctrl + D 키 입력
여기서 > 문자는 '리다이렉션'을 의미한다. 방향을 전환한다는 의미이다.
보통 cat 명령어를 입력한 뒤 내용을 입력하면 그 출력 결과는 그대로 모니터로 나타나게 된다.
그러나 >(리다이렉션) 문자를 입력하면 입력값을 모니터가 아닌 파일로 보내게 된다. 출력의 방향을 '전환' 하는 것이다.
Ctrl + D 키는 입력의 종료를 의미한다. 여기까지 입력하면 해당 내용을 가진 파일이 생성되는 것이다.
위 스크린샷은 >(리다이렉션)을 사용한 파일 생성 과정, 아래 스크린샷은 단순히 cat 명령어를 사용한 파일 열람 과정을 보인 것이다. 입력한 파일 내용이 그대로 출력이 되는 것을 볼 수 있다.
텍스트 파일의 내용 추가 (리다이렉션의 연속 사용)
cat > 명령어에는 주의할 점이 있다. 해당 내용을 가진 파일을 '생성'할 뿐인 명령어이기 때문에, 기존에 동일한 이름의 파일이 있는 상태에서 이 명령어를 사용하여 내용을 작성하면 기존 파일 내용은 삭제되고 새로 입력한 내용으로 덮어쓰기된다.
그래서 파일에 내용 추가(append)를 하기 위해서는 다른 방법을 사용해야 하는데,
이것이 리다이렉션을 두 번 사용하는 것이다.
프로그램 소스 파일의 생성
프로그램 소스 파일의 생성 방법은 일반 텍스트 파일과 크게 다르지 않다.
텍스트 파일을 생성할 때처럼 cat > (파일이름).(확장자명) 을 입력하고 내용을 써넣되
- 확장자명에는 해당 소스코드의 확장자명을 입력하고 (C언어라면 .c , C++이라면 .cpp 등)
- 내용에는 해당 언어의 구문에 맞는 소스코드를 적어넣는 것이다.
그런데 우리가 일반 코드 에디터 프로그램 등에서 소스코드를 작성할 때에는 이 코드를 실행하기 전 반드시 거쳐야 하는 절차가 있었다. 바로 '컴파일' 이다.
리눅스에서도 소스 파일을 실행하기 위해서는 컴파일이 요구된다. 다음의 절차를 보자.
프로그램 소스 파일의 컴파일
gcc -o (프로그램 이름) (소스파일 이름) 명령어 : 해당 소스파일을 프로그램으로 컴파일한다.
프로그램 실행 파일의 확장자는 .exe임에 유념하자.
프로그램 소스 파일의 실행
리눅스에서는 파일을 실행시키려면 해당 파일이 있는 절대경로를 모두 입력시켜 주어야만 실행할 수 있다.
절대경로 : 최상위 디렉토리(루트, /)에서부터 시작되는 경로. pwd 명령어로 확인할 수 있다.
상대경로 : 자신이 위치한 디렉토리를 기준으로 따진 경로
절대경로를 알았다면 파일을 실행시키는 방법은 간단하다. (절대경로)/(파일 이름) 을 입력해주면 된다.
위 예제에서는 현 디렉토리가 /home/trainer8 , 실행할 파일 이름이 program.exe 이므로
/home/trainer8/program.exe 라고만 입력해 주면 실행되는 것이다.
실행해 보면 위에서 입력한 소스코드의 실행 결과만이 출력되는 것을 볼 수 있다.
하지만 현재 있는 디렉토리가 루트에서부터 매우 멀리 떨어진, 그러니까 A디렉토리 안에 B디렉토리 안에 또 C디렉토리 안에.... 같은 식의 매우 긴 경로를 갖는다면? 파일 하나 실행시키겠다고 이런 짓을 하는 것은 아무래도 비효율적이다.
다행히도 리눅스에서 '현재 디렉토리' 는 '.' 하나로 요약이 가능하다. 그러니까 현재 경로에 있는 파일1.exe 프로그램을 실행시키고자 한다면
./파일1.exe 와 같이 입력해주기만 하면 되는 것이다.
'LINUX' 카테고리의 다른 글
6주차 - [F.T.Z] LEVEL 1, 2 (0) | 2022.05.28 |
---|---|
5주차 - [Bandit: Over the wire] Level 6 ~ Level 10 (0) | 2022.05.16 |
4주차 - [Bandit: Over the wire] Level 0 ~ Level 5 (0) | 2022.05.12 |
2주차 - Trainer1~Trainer5 (0) | 2022.05.01 |
1주차 - 환경 구축 (0) | 2022.04.03 |