1. ssh 공개키를 복사하여 비밀번호 없이 원격접속하기
Secure sHell(쉘을 보호하다.)
SSH프로토콜은 암호화를 사용하여 client 와 server간의 연결을 보호한다.
기존 패스워드를 입력해서 서버로 접속했다면 개인키와 공개키 를 사용하여 패스워드 없이 접속할 수 있다.
패스워드 없이 접속하기에 개인키 파일만 탈취당하지 않고 소중히 보관한다면 보안이 강화된다.
ssh키 인증접속 방식은 client의 개인키와 server의 공개키를 대조하여 인증하는 방식이다.
밑에 스크립트는 ssh-keygen 명령어를 통해 개인키를 생성하고
내가 패스워드 없이 SSH 접속하고자 하는 서버에 sshpass명령어를 통해 공개키를 복사해주는 자동 스크립트이다.
1 #!/bin/bash
3 servers="192.168.111.140 192.168.111.141 192.168.111.142" #복사할 서버들
4 sshKey="$HOME/.ssh/key.pem" #개인키 경로
5 sshPub="$HOME/.ssh/key.pem.pub" #공개키 경로
7 ssh-keygen -q -N "" -f $sshKey #SSH Key 생성한다. $sshKey 경로에
8 cp $sshKey $HOME/.ssh/id_rsa #생성한 키를 $HOME/.ssh/id_rsa 경로에 복사한다. 이유는 키를 인증할때 id_rsa 이란 이름을 인식해서 읽기 때문에
10 for server in $servers
11 do
12 echo $server
13 sshpass -p "$1" ssh-copy-id -i $sshPub seanxx@$server #생성된 SSH Key를 해당 서버에 복사
14 done
스크립트를 실행할때 주의 할 점은 sshpass명령어 사용과정에서 공개키를 복사할 user의 패스워드를 묻기에 $1으로 파라미터를 받는다.
2. 원격 서버 CPU,메모리 사용량 점검하기
#!/bin/bash
hosts="192.168.111.140"
for host in $hosts; do
echo "######################################"
echo "######## HOST $hosts ########"
echo "######################################"
#cpu 사용량 체크
chk_cpu=$(ssh -q seanxx@$host mpstat | grep all | awk '{print $4}')
chk_mem=$(ssh -q seanxx@$host free -h | grep Mem | awk '{print $4}')
#memory 사용량 체크
total_mem=$(ssh -q seanxx@$host free -b | grep Mem | awk '{print $2}')
used_mem=$(ssh -q seanxx@$host free -b | grep Mem | awk '{print $3}')
usage_mem2=`expr $used_mem \* 100 / $total_mem`
#cpu,mem 사용량 출력
echo "$host's CPU usage is ${chk_cpu}%"
sleep 0.3
echo "$host's Mem free is ${chk_mem}"
sleep 0.3
echo "$host's Mem usage is ${usage_mem2}%"
sleep 0.3
#process bar
echo "Analyzing usage..."
for (( k=0; k<101; k++ ))
do
echo -ne '\r'$k%
sleep 0.02
done
echo -ne '\n'
#증설 또는 축소 제안
if [[ $chk_cpu > 80 ]]; then
echo "CPU usage is high. Please expand the CPU resources"
else
echo "CPU usage is appropriate"
fi
if [[ $usage_mem2 > 30 ]]; then
echo "Mem usage is high. Please expand the CPU resources"
else
echo "Mem usage is appropriate"
fi
#cpu 사용량 체크
ssh로 mpstat명령어를 사용하여 awk 로 cpu사용량을 뽑아낸다.
ssh로 free 명령어를 사용하여 awk로 memory 여분을 뽑아낸다.
#memory 사용량 체크
free명령어를 통해 메모리 총용량과 사용하고 있는 용량을 변수에 넣은뒤
expr을 사용하여 지금 사용량을 백분율로 나타낸다. 분자에 *100하면 퍼센트로 나타낼 수 있다.
#cpu,memory 사용량 출력
위에 선언했던 cpu사용량,메모리 여분, 메모리 사용량을 출력한다.
#processbar
심심하지 않게 분석하는척 processbar를 넣어준다.
#증설 또는 축소 제안
cpu사용량이 80을 넘기면 자원을 증설하라는 if문을 넣어준다.
memory도 동일하게 넣었으나 else문도 확인하기위해 30으로 기준을 낮췄다.
실행결과
3. 원격 서버 서비스점검하면서 방화벽에 서비스 등록됐는지 확인하기.
echo "----------------------------service----------------------"
#서비스와 포트 점검을 위해 점검할 대상들 선언
services="httpd vsftpd sshd haproxy rabbitmq"
ports="80 21 22 443 8080 5672 15672"
for host in $hosts; do
echo "############### HOST:: $host ##############"
#서버 서비스 상태체크
for service in $services; do
chk_service=$(ssh seanxx@$host sudo systemctl is-active $service)
if [[ $chk_service == "active" ]]; then
echo -e "$service state is \033[31;1m"active"\033[m".
else
echo "$service state is inactive. Please check $service"
fi
done
echo "-----------------------------port------------------------"
#서비스 포트 상태체크
for port in $ports; do
chk_port=$(ssh seanxx@$host sudo netstat -ntpl | grep $port | wc -l)
if [[ $chk_port > 0 ]]; then
echo -e "This port $port is \033[32;1m"open"\033[m."
else
echo "This port $port is not found. Please check your system."
fi
done
done
echo "----------------------------firewalld---------------------"
#방화벽에 서비스 등록상태 체크
firewalls="http ftp ssh"
chk_firewall=$(ssh seanxx@$host sudo systemctl is-active firewalld)
if [[ $chk_firewall == "active" ]]; then
for firewall in $firewalls; do
chk_fw=$(ssh seanxx@$host sudo firewall-cmd --list-services | grep $firewall | wc -l)
if [[ $chk_fw > 0 ]]; then
echo -e "$firewall service is\033[31;1m" registered."\033[m"
else
echo -e "$firewall service is not registered."
fi
done
else
echo "firewall is inactive."
fi
done
#서비스와 포트 점검을 위해 점검할 대상들 선언
점검할 서비스와 포트들을 선언해준다.
#서버 서비스 상태체크
선언했던 서비스를 for문으로 돌려주고 서버마다 systemctl 명령어와 is-active명령어를 사용하여 서비스가 active상태인지 아닌지에 따라 echo로 상태를 출력해준다.
active상태는 active만 color값을 빨간색으로 주어 알아보기 쉽게 해준다.
#서비스 포트 상태체크
선언했던 포트를 for문으로 돌려주고 서버마다 netstat 명령어와 grep $port | wc -l을 사용하여 열려있는지 확인한다.
wc -l 과 if [[ $chk_port > 0 ]]을 사용하여 열려있다면 echo를 통해 상태를 출력한다.
open상태는 open만 color값을 초록색으로 주어 알아보기 쉽게 해준다.
#방화벽에 서비스 등록상태 체크
방화벽에 점검할 서비스들 선언해준다.
ssh로 systemctl is-active 명령어를 사용하여 방화벽에 먼저 켜져있는지 상태를 확인
켜져있다면 if then for문을 돌린다. grep wc -l 을 사용하여 해당 서비스가 등록되어있는지 확인
등록되어있다면 echo를 사용하여 등록되어있다고 상태 출력.
registered상태는 registered만 color값을 빨간색으로 주어 알아보기 쉽게 해준다.
실행결과
스크립트 복사시 2번문제와 3번문제를 연결해야 for문이 이어집니다
'22년 가을학기 > 유닉스 고급' 카테고리의 다른 글
8.시스템 관리 쉘스크립트 (0) | 2022.11.16 |
---|---|
7. 쉘스크립트 실무 (0) | 2022.11.13 |
6.쉘스크립트 중급 (0) | 2022.11.05 |
5.파일 처리 명령어 (0) | 2022.10.13 |
4.문자열 검색 명령어 (0) | 2022.09.29 |