SW개발/Linux, Unix

[Linux, Unix]Bash shell 프로그래밍 문제 풀이

1. 현재 자기자신의 pc(linux 기준)의 cpu 모델명, OS 종류 및 버전, kernel 버전을 출력하시오.

#!bin/bash

echo 'cpu model name'
echo `cat /proc/cpuinfo | grep model*` # cpu 모델명 출력
echo 'os version'
echo `cat /etc/issue` # OS 종류 및 version
echo 'kernel version'
echo `cat /proc/version` # kernel version

 

2. 매주 일요일, 새벽 4시 30분과 낮 12시 30분에, 현재디렉토리에 test.txt 파일을 생성하는 crontab을 작성하시오.

#!bin/bash

echo 'crontable (touch) register'
echo `crontab -l | grep touch || echo "no result (touch command)"`
cat <(crontab -l) <(echo "30 4,12 * * 7 touch ./test.txt") | crontab - # 새로운 내용을 하단에 추가
echo `crontab -l | grep touch`

기존 테이블에 존재하는 내용을 표준 입력으로 불러온 후 새로운 예약을 append 하는 방식으로 구성하였습니다.

등록 여부를 확인하기 위해 명령어 전 후로 확인 작업을 추가적으로 진행하였습니다. ( ||를 이용해 검색한 내용이 없을시 예외 메시지 출력 )

 

3. 정수인자 2개를 받아 인자 개수 검증 후 4칙연산별 함수를 구현하여 결과값을 모두 출력하시오.

#!/bin/bash

num1=$1
num2=$2

add=`expr $num1 + $num2`
echo -n '덧셈 : '
echo "$num1+$num2=$add"

sub=`expr $num1 - $num2`
echo -n '뺄셈 : '
echo "$num1-$num2=$sub"

mul=`expr $num1 \* $num2`
echo -n '곱셈 : '
echo "$num1*$num2=$mul"

div=`expr $num1 / $num2`
echo -n '나눗셈 : '
echo "$num1/$num2=$div"

 

4. 2초마다 현재시간을 출력하는 스크립트를 작성하시오.

#!/bin/bash

while true
do
echo `date`
sleep 2s
done

 

5. 한번도 로그인한 적 없는 사용자를 삭제하는 명령어를 문자열로 출력하시오.

#!/bin/bash

command=`grep 'Never logged' lastlog | awk '{print $1}'`
for user in $command
do
	echo "userdel -r $user"
done

 

6. 로그인한 적 없는 사용자를 제외하고 년 월 일 시간 사용자계정 순서로 출력하시오.

#!/bin/bash

awk '!/Never/ {print $9, $5, $6, $7, $1}' lastlog

 

7. ntp와 firenwo user 라인사이에 'end of system user' 라인을 삽입하시오.

#!/bin/bash

sed '/ntp/a end of system user' lastlog

 

8. 09:59:57부터 10:21:45까지의 라인만 출력하시오.

#!/bin/bash

awk '$3 >= "09:59:57" && $3 <= "10:21:45" {print $line}' checkpassword

 

9. 121.156.xxx.xxx를 pop3.xxx.co.kr 로, 14.36.xxx.xxx는 office.ip.xxx.kr로 치환하여 출력하시오.

#!/bin/bash

sed -e 's/121.156.xxx.xxx/pop3.xxx.co.kr/g' -e 's/14.36.xxx.xxx/office.xxx.kr/g' checkpassword

 

10. root@test.xxx.co.kr에서 수신된 메일의 수를 출력하시오.

#!/bin/bash

grep "root@test.xxx.co.kr" maillog | wc -l

 

11. 시간별 총 용량을 구해서 출력하시오. (bytes)

#!/bin/bash

grep bytes maillog | awk '{print $3, $11}' | sed 's/:[0-5][0-9]:[0-5][0-9]//g' | awk '{x[$1]+=$2} END {for (i in x) print i"시 ", x[i]}' | sort
# bytes 열만 필터 -> 시간과 용량 필터 -> sed를 이용해 시간만 두고 분초는 제거 -> 시간별 합계를 구함 -> 정렬

 

12. ;로된 주석라인과 공백라인을 제외한 라인 출력하시오.

#!/bin/bash

egrep -v '^[[:space:]]*(;.*)?$' conf
# 다른 방법
#grep -v '^[[:space:]]' conf | grep -v '^;'

 

13. ps 명령어를 이용하여 pid 값이 낮은순에서 높은순으로 정렬하여 출력하시오.

#!/bin/bash

ps -ef --sort=+pid

 

14. 접근을 한 국가별 카운트와 국가명을 출력하시오.

#!/bin/bash

ip=`awk '{print $6}' nginx`
touch country
for i in $ip
do
	geoiplookup $i >> country # geoiplookup 을 이용하여 국가를 알아낸 후 파일에 쓰기
done

cat country | sort | uniq -c # 중복을 제거, 카운트 후 결과값 출력
rm country # 데이터가 누적되는 것 방지

 

15. 3번 이상 접근한 국가별 카운트와 국가명을 출력하시오.

#!/bin/bash

ip=`awk '{print $6}' nginx`
touch country
for i in $ip
do
	geoiplookup $i >> country # geoiplookup 을 이용하여 국가를 알아낸 후 파일에 쓰기
done

cat country | sort | uniq -c | awk '{if ($1>=3) print $0 }'  # 중복을 제거, 카운트 후 결과값 출력
rm country

 

16. 1M의 용량을 가진 파일부터 10M 까지의 총 10개 파일을 생성하시오. (1M씩 증가함)

#!/bin/bash

for var in {1..10} # 1~10 반복문
do
	dd if=/dev/zero of=dummy_$var bs=1M count=$var # dd 명령어로 더미파일 생성.
done

 

17. 16번에서 생성한 파일 중 5M 이상의 파일의 생성시간을 2017년 12월 31일로 변경하시오.

#!/bin/bash

find dummy_* -size +5M -exec touch -t 201712310000 {} \;

 

18. 17번에서 만든 파일 중 2017년 12월 31일 이후에 만들어진 파일을 찾아 해당파일명.new로 변경하시오.

#!/bin/bash

touch -t 201712310000 ./no_18 # touch 명령어로 필터날짜 파일 생성
list=`find ./dummy_* -newer no_18` # 필터용 파일과 -newer 옵션을 이용
echo $list # 해당하는 파일명들 출력
for i in $list
do
	mv $i $i.new # 확장자명 변경
done

 

19. test.c 파일을 작성 후 컴파일하여 result.exe 파일을 생성하고, 출력값을 test.txt로 저장하시오.

gcc test.c -o result.exe # gcc로 컴파일
./result.exe > test.txt # 실행 후 결과값을 test.txt에 저장

 

20. 121.156.xxx.xxx 서번의 오픈된 포트를 확인 후 해당 포트로 통신이 가능한지 모니터링하는 스크립트를 작성하시오.

#!/bin/bash

port=`nmap -sT 121.156.xxx.xxx | grep /tcp |awk -F '/' '{print $1}'` # nmap 과 awk 명령어를 이용한 결과를 변수에 저장한다.
# -sT : connect() 함수를 사용해 모든 포트에대해 스캔하는 방식.
for i in $port
do
	nc -zv 121.156.xxx.xxx $i # 해당 아이피에 포트번호를 값으로하여 통신이 가능한지 확인한다.
	# -z : conneciton을 위한 최소한의 데이터만 전달
	# -v : 더 많은 정보를 얻을 수 있다.
done
728x90