본문 바로가기
  • 노션에서 삽질한 내용을 정리하는 블로그
자기발전소/# Programming

bash Shell Script 개인 프로젝트 2.

by iamlucia 2020. 10. 12.

 

번거로운 " sudo + 명령어 " 


/etc/sudoers 파일에 user명과 user권한 내용 추가. 

# User privilege specification 
root    ALL=(ALL:ALL) ALL 
(사용자명)  ALL=(ALL:ALL) ALL

그런데 문제는 해당 파일을 수정하기 위해서는 일단 root 권한이어야 한다 . . . 

결국에는 root 권한으로 변환하는 과정이 필요하기 때문에

스크립트 내에서 권한 부여 하는 코드는 구현하기 어려울 듯

(권한 부여하려면 root 비번을 치는 코드가 필요)

 

 

 

네트워크 스크립트 수정 :


 

내부네트워크와 외부네트워크

이더넷에 필요한 스크립트 중

중복되는 부분은

"함수"로 구현하고,

 

외부 네트워크 스크립트에만 있는

두 줄에 해당되는 값(gateway, dns)은 

따로 sed 또는 echo로 추가하기 

 

 

while 과 if 문으로 사용자 입력값 받아내기


 

while (true)
do
        echo -n "Are you going to update and install openstack packstack?(y/n)"
        read answer
        if [ $answer == y -o $answer == Y ]
          then
          yum -y update
          yum -y install centos-release-openstack-rocky
          yum -y install openstack-packstack
          yum -y update
          break
         elif [ $answer == n -o $answer == N ]
         then
         cancel
         break
        else
        echo "Please Type answer with y/n"
        continue
        fi
done

 

WHILE 문 사용한 이유 ? 

 적절한 입력값을 못받으면(Y,N,y,n) 다시 답을 받아야 하는데 그러기 위해서는 질문을 계속해서 반복적으로 던져야 한다. 

 

 

스크립트로 파일 내용 편집


sudo echo 로는 파일 내용 추가 안되는데

sudo vi로 열어서 파일 편집이 가능한 상황

스크립트 내에서 파일 내용을 편집하려면 어떤 명령어를 사용하지?

 

'sed' 라는 streamlined editor 를 사용하자.

 

sed : 파일 내용에 영향을 주지 않고 출력되는 결과를  '변화'시켜 준다. 

-i: 변경되는 값을 실제로 파일에 저장하는 옵션입니다. 이 옵션은 출력되는 값이 없이 바로 실제 파일에 적용

 

 

sed 문 안에 변수 사용


오픈스택 팩스택 설치 후 생성되는 answer file 내부에는

자동으로 외부 네트워크 ip가 각 host 주소로 입력되는데, 

 

해당 파일 안의 외부용ip를 내부용 ip로 바꾸고자 한다.

 

" sed -i  " 문을 사용한다.

 

🟠 그런데 

원래 sed  -i 쓰듯이 

 

sed -i  's/$externalip/$insternalip/g' answer.txt

 

라고 치면 명령어가 안 먹혔다 

 

 

🟢 구글링 결과 sed 문 안에 $변수를 사용하려면,  

 

sed -i "s/$externalip/$insternalip/g" answer.txt

와 같이 큰 따옴표를 사용해야 명령어가 먹힌다! 

 

 

사용자 입력값을 받아 파일에 적용


팩스택으로 생성된 answer file을 통해

사용자는 곧 구축될 오픈스택 구성의 설정값을 변경할 수 있다.

 

사용자가 직접  vi 편집기를 돌리지 않고도

입력값만을 토대로 해당 파일의 내용을 자동으로 수정해야 한다. 

 

🟠 사전 작업: answer file 정독하며 각 서비스 설정값이 적혀있는 줄 번호 체크 및 분류 

 

    - 기본 설치될 파일(사용자에게 출력) & 추가할 서비스 후보군(사용자에게 입력받기) 

    - 각 pw (사용자에게 입력받기)

 

 

 

 

🟢 추가할 서비스 후보군을 사용자에게 입력받기 : select loop 문 

 

SELECT loop 문 활용하여 여러 번에 걸쳐 서비스 선택입력값을 받을 수 있다 ! 

 

# vi test.sh 

 

#!/bin/bash 
echo "Basic services will be installed: Mariadb, Cinder, Nova, Glance, Neutron, Horizon, Swift, Ceilometer." 
select service in "MANILA" "AODH" "PANKO" "SAHARA" "HEAT" "MAGNUM" "TROVE" "IRONIC" "LBAAS" 
do 
        case $service in 
        "MANILA") 
                sed -i '29s/n/y/g' answer.txt

       esac

done

 

테스트용 스크립트 실행 화면 

PS3 이라는 SELECT 문에 사용하는 프롬프트용 문구
지정하지 않아서 #? 출력 

 

완성 스크립트 실행 화면 캡쳐

 

완성된 테스트 스크립트 캡처

 

 

🟢 비밀번호 입력값 받아 값 치환 : sed와 awk 문 활용

 

test.sh

 

 

배경지식: answer.txt 파일의 326번째 줄에 다음과 같이 admin user 를 위한 초기 pw가 적혀있음

 

    😃 핵심LINE : 

 

defaultpw = "$(cat answer.txt |  sed - n 326p | awk -F= '{print $2}')" 

 

= 의미:

 

answer.txt 파일을 주루룩 출력했을 때 (cat) |

그 중에서 326번째 줄(sed) 에서 |

=를 구분자로 했을 때 2번째에 해당하는 값을 불러와(awk)

'defaultpw' 변수의 값으로 넣으세요. 

 

 

이렇게 기본으로 설정되어 있는 값을 읽어내고,

사용자가 비밀번호로 입력한 값을 불러와

그 둘을 치환하기 위한 sed -i 문 작성하면 완료 ! 

'자기발전소 > # Programming' 카테고리의 다른 글

Colab으로 Python 간단 문법 실행  (0) 2020.12.24
Python  (0) 2020.12.24
bash Shell Script 개인 프로젝트 1.  (0) 2020.10.11
if 중첩문 : elif  (0) 2020.06.22
Bash_shell script 함수 기초  (0) 2020.06.02