티스토리 뷰
이번 level 역시 특별한 부분은 없습니다. 다만 난이도가 조금 올라간 정도에요.
NOTE 부분을 통해 저희 스스로 shell-script를 만들어야 함을 인지할 수 있습니다.
NOTE2 부분을 통해 저희가 만든 shell-script는 한번 실행되고 삭제됨을 알 수 있습니다.
앞 시간에서는 모르고 지나갔지만 이번 lv을 친구와 같이 해결하면서 새롭게 알게 된 사실들이 있습니다.
위 내용을 풀이하면서 설명하겠습니다.
우선 저희는 cron의 역할을 알고 있습니다.
대충 요약하자면 주기적인 작업을 관리하는 것입니다.
cron.d 역시 Bandit lv21 -> lv 22 에서 배웠습니다.
그 내용을 보면 cron.d는 주기적인 작업을 등록하는 공간이라고 합니다.
즉 /ect/cron.d/cronjob_bandit24 는 특정주기마다 자동으로 실행되는 프로그램이라고 생각할 수 있습니다.
cronjob_bandit24 가 실행될 때 bandit24의 계정으로 로그인 됨을 알 수 있고,
* * * * * 을 통해 매 분 실행된다는 사실을 알 수 있습니다.
그럼 실행파일인 /usr/bin/cronjob_bandit24.sh 가 무엇인지 볼까요?
여기서 중요한 사실은 whoami 에 bandit24 가 들어가는 것이다.
그 이유는 /etc/cron.d/cronjob_bandit24에서 @reboot bandit24 라는 문구가 있었기 때문이다.
cd를 통해 /var/spool/$myname 로 이동해서 아래 작업들을 함을 알아야 한다.
for i in * .*; 은 모든 파일을 i 에 대입하겠음을 의미한다 ( 반복문 )
>> 솔직히 * 과 * .* 의 차이는 잘 모르겠다. 이후 깨닫게되면 다시 정리할 예정
if 문을 해설하기 전에 알야아하는 사실이 있다.
위 사진에서 알 수 있다시피 . .. 이라는 파일은 따로 생성하지 않아도 항상 존재한다.
[ . : 현재 디렉터리 / .. : 상위 디렉터리 ]
또 -a 는 and를 의미한다.
그럼 저 if 문 조건을 이해할 수 있다.
$i에 대입된 것이 . 과 ..이 아니라면(즉, 우리가 작성한 쉘 스크립트 파일에 대해서만 조건문 실행)
then 이하의 내용을 실행하라는 뜻이다.
stat은 파일의 상태를 출력하는 명령어인데 아래와 같은 형태로 출력된다.
그리고 --format 은 출력형태를 뒤에 지정한 형태로 출력함을 뜻한다.
%U는 파일 소유자의 사용자명을 의미한다
그래서 저 구문을 실행해보면 위와 같은 결과를 알 수 있음.
그 밑의 if 문을 보면, $owner = bandit23을 볼 수 있는데,
이를 통해 우리는 shell-script를 만들어 /var/spool/bandit24에 넣어줘야함을 알 수 있다.
그래야 그 밑에가 계속 진행되기 때문.
timeout : 특정 명령어나 프로세스의 실행 시간을 제한해야 할 경우 이용.
-s : 초를 의미
9 : SIGKILL(강제종료신호)
즉 timeout -s 9 60 ./$i 는 $i를 60초 동안 실행하고 이후 SIGKILL 을 하는 것이다.
위 명령을 처리하고 난 후에 rm 을 이용해 파일을 삭제하는 모습이다.
이제 문제 파악이 끝났으니 해설로 들어가보자.
위 그림을 통해 /var/spool/bandit24에 우리는 쓰기 및 실행 권한만 있음을 알 수 있다.
그렇다면, 우리에게 필요한 것은 bandit24의 비밀번호를 가져오는 script임.
tmp에 새로운 디렉터리를 만들고 진행하자.
tmp에 bt24라는 dir을 만들고 그 안에 bandit24의 비밀번호를 /tmp/bt24/answer 로 가져오는
script를 작성했다.
이제 이 파일을 /var/spool/bandit24에 넣어주면 됨.(앞서 확인했다시피 쓰기 권한이 있으므로 가능)
우리가 만든 ans의 파일 권한을 보니 그 누구도 실행은 할 수 없는 형태다.
그러므로 우리는 chmod를 이용해 권한을 변경할 계획이다.
그럼 이제 ans 파일을 /var/spool/bandit24 로 옮기고 기다리면 된다.(1분)
그럼 위와 같은 결론을 내릴 수 있다.
정리
오늘 내용은 뒤죽박죽이었기에 정리를 하겠다.
1. /etc/cron.d/cronjob_bandit24 내용을 확인하니 bandit24로 로그인해서 매분 실행됨을 알았다.
2. /usr/bin/cronjob_bandit24.sh 가 실행파일인데, 내용을 확인해봄.
3. 첫 if 문과 /var/spool/bandit24의 권한을 통해 새로운 파일이 필요함을 추측
4. 두번째 if 문을 통해 새로운 파일은 bandit23(현재 계정) 에서 만들어야함을 알 수 있음
5. ans라는 파일을 만들고 난 후 다른 이들이(bandit24) 가 실행하기 위해서 권한 수정이 필요함
6. 권한 수정 후 /var/spool/bandit24에 넣어주면 cron에 의해 자동으로 다음 주기에 실행됨을 알 수 있음.
정리는 이 정도이며, 자세한 내용은 위에 있음.
New
1. cron 추가 자료 : * * * * *(5자리)는 순서대로 분, 시, 일, 월, 요일 임.
[ 참조 : cron - Wikipedia ]
2. /var/spool 은 미래의 자겁을 기다리는 자료들의 임시 저장 공간임.
>>tmp 역시 임시 공간이지만, tmp는 프로그램 실행 시 임시로 생성되는 파일을 저장한다는 차이점이 있음
[ 참조 : 리눅스 디렉토리 종류와 특징 : 네이버 블로그 (naver.com) ]
3. stat : 파일이나 파일 시스템의 상태를 출력하는 명령어
4. --format : 출력 형태를 지정할 때 사용
5. %U : 파일 소유자의 사용자명을 출력
6. timeout : 특정 명령어 또는 프로세스의 실행 시간을 제한해야 할 경우 이용.
7. timeout 에서 9 : SIGKILL, 즉, 강제종료를 의미
[ 참조 : 반달가면 : [bash: timeout] 특정 명령어/프로세스에 대한 실행 시간 제한 설정 (egloos.com) ]