리눅스 쉘 기본 정리4

양승현·2022년 7월 28일
3

linux

목록 보기
12/20

base image -> key-pair/user -> instance (처음 배포시 패키지가 설치된 상태로 배포되도록 : httpd, sysstat, mariadb)

AWS -> 컨테이너 클러스터링 기술 (EKS, ECS)


반복문

for test in a b c d
do
	echo ${test}
done
for test in /root/*
do 

done
for (( i=1; i <= 10; i++))
do
	echo $i
done
while [ 1 ]  <--- 참
do

done
  • 이중 루프내에서 루프를 종료하고 싶다면 break, 종료가 되지는 않지만 더 이상 실행하지않고 처음으로 돌아가도록 하고 싶다면 continue 를 사용할수 있다.

매개변수

  • bash 에서도 명령어 다음은 매개변수다. ->고정일 수도, 가변일 수도 있다.
   $0     $1    $2
./test.sh 10    20

  • $* : 전체를 하나의 데이터로 취급한다.
  • $@ : 각각의 데이터를 구분하여 취급한다.
  • $# : 2
  • $? : 직전실행 명령의 결과(종료)코드
    -> 0 만 참, 나머지는 거짓
 [ $? -eq 0 ]

사용자 입력 받기

  • -z 문자열의 길이가 0인 경우 (-z $VALUE와 같이 씀)
  • -n 문자열의 길이가 0이 아닌 경우 (-n $VALUE와 같이 씀)
echo -n "당신의 이름은? : "
   read name 
  [ -z $name ] 
read -p "당신의 이름은? : " first last
read -s -p "패스워드? : " password
read -n1 -p "실행할까요? [y/n] : " ans

->프로그램을 중간에 일시중지 시키고 계속 진행을 요구할 경우에 사용하면 유용하다.


gawk

  • awk[unix] - 자유 소프트웨어 재단 -> improved awk -> gawk(정규 표현식, 리포트, 변수정의, 프로그래밍)
[root@yangseunghyun 0728]# gawk -F: '{print $1}' /etc/passwd | head -3

[root@yangseunghyun 0728]# echo "bt"
bt
[root@yangseunghyun 0728]# echo "bt" | gawk '/bt/{print $0}'
bt
[root@yangseunghyun 0728]# echo "bts" | gawk '/bt/{print $0}'
bts
[root@yangseunghyun 0728]# echo "bt" | gawk '/bet/{print $0}'
[root@yangseunghyun 0728]# echo "bt" | gawk '/be?t/{print $0}'
bt
[root@yangseunghyun 0728]# echo "bet" | gawk '/be?t/{print $0}'
bet
[root@yangseunghyun 0728]# echo "beet" | gawk '/be?t/{print $0}'
[root@yangseunghyun 0728]# echo "beet" | gawk '/b[ae]?t/{print $0}'
[root@yangseunghyun 0728]# echo "bat" | gawk '/b[ae]?t/{print $0}'
bat
[root@yangseunghyun 0728]# echo "bet" | gawk '/b[ae]?t/{print $0}'
bet
[root@yangseunghyun 0728]# echo "bt" | gawk '/b[ae]?t/{print $0}'
bt
[root@yangseunghyun 0728]# echo "bt" | gawk '/be+t/{print $0}'
[root@yangseunghyun 0728]# echo "bet" | gawk '/be+t/{print $0}'
bet
[root@yangseunghyun 0728]# echo "beet" | gawk '/be+t/{print $0}'
beet
[root@yangseunghyun 0728]# echo "beet" | gawk '/be{2}t/{print $0}'
beet
[root@yangseunghyun 0728]# echo "bet" | gawk '/be{2}t/{print $0}'
[root@yangseunghyun 0728]# echo "beeet" | gawk '/be[a-z]{1,2}t/{print $0}'
beeet
[root@yangseunghyun 0728]# echo "beet" | gawk '/be[a-z]{1,2}t/{print $0}'
beet
[root@yangseunghyun 0728]# echo "beeet" | gawk '/b[a-z]{1,2}t/{print $0}'
[root@yangseunghyun 0728]# echo "beet" | gawk '/be[a-z]{1,2}t/{print $0}'
beet
[root@yangseunghyun 0728]# echo "babt" | gawk '/be[a-z]{1,2}t/{print $0}'
[root@yangseunghyun 0728]# echo "babt" | gawk '/b[a-z]{1,2}t/{print $0}'
babt

mariaDB DB 생성

[root@yangseunghyun 0728]# systemctl enable mariadb --now
  • 실행 후 상태 확인
[root@yangseunghyun 0728]# mysql_secure_installation
  • 패스워드 설정
[root@yangseunghyun 0728]# mysql -u root -p1234
  • DB 접속

[DB실습]

MariaDB [mytest]> GRANT INSERT,SELECT,DELETE,UPDATE,CREATE ON mytest.* TO 'testuser'@'localhost' IDENTIFIED BY '1234';
MariaDB [mytest]> GRANT INSERT,SELECT,DELETE,UPDATE,CREATE ON mytest.* TO 'testuser'@'%' IDENTIFIED BY '1234';
  • testuser 에게 mytest 데이터 베이스의 모든 테이블에 대한 권한을 부여
  • localhost 및 모든 Ip 에서 접속할 때에 적용
MariaDB [mytest]> FLUSH PRIVILEGES;
  • 권한 수정 사항을 적용
MariaDB [mytest]> CREATE TABLE employees ( 
empid int not null, 
lastname varchar(20), 
firstname varchar(20), 
salary float, 
primary key(empid) 
);
  • 테이블 생성
MariaDB [mytest]> desc employees;
+-----------+-------------+------+-----+---------+-------+
| Field     | Type        | Null | Key | Default | Extra |
+-----------+-------------+------+-----+---------+-------+
| empid     | int(11)     | NO   | PRI | NULL    |       |
| lastname  | varchar(20) | YES  |     | NULL    |       |
| firstname | varchar(20) | YES  |     | NULL    |       |
| salary    | float       | YES  |     | NULL    |       |
+-----------+-------------+------+-----+---------+-------+
MariaDB [mytest]> INSERT INTO employees VALUES (1,'홍','길동',3300);
MariaDB [mytest]> INSERT INTO employees VALUES (2,'김','이동',2300);
MariaDB [mytest]> INSERT INTO employees VALUES (3,'박','영동',2300);
  • 테이블 데이터 추가

quiz.

  • mkdir /usr/test 해당 디렉토리를 PATH 변수에 포함시켜라
[root@yangseunghyun 0728]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
[root@yangseunghyun 0728]# PATH=$PATH:/usr/test
[root@yangseunghyun 0728]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/usr/test

[데이터 입력하기]

#!/bin/bash

if [ $# -ne 4 ]
then
        echo "잘못된 입력 발견 : (사용법) -> ./test2.sh 번호 성 이름 연봉"
else
        # 정상 입력인 경우
        mysql mytest -u root -p1234 -e "insert into employees values ($1, '$2', '$3', $4)"

        # 데이터의 입력 결과 확인
        if [ $? -eq 0 ]
        then
                echo "데이터 입력 성공"
        else
                echo "데이터 입력 실패"
        fi

fi

[root@yangseunghyun 0728]# ./test2.sh 4 양 승현 6000
데이터 입력 성공
[root@yangseunghyun 0728]# mysql mytest -u root -p1234 -e 'select * from employees'


quiz2

  • 사용자 ID는 수동으로 직접 선택하지 말고, RANDOM을 이용하여 10000~20000 사이에서 선택하도록 하고 이를 DB로 전달한다.
  • 단, 처음 프로그램이 실행되면 해당 번호가 DB에 존재하는지 여부를 먼저 확인하고 존재한다면 해당 번호를 ID로 하여 DB에 추가해보자.
[root@yangseunghyun 0728]# echo $RANDOM
24107
[root@yangseunghyun 0728]# echo $((RANDOM%10+1))
1
[root@yangseunghyun 0728]# echo $((RANDOM%11+100)) -> 100부터 110까지
108
[root@yangseunghyun 0728]# echo $((RANDOM%101+200))
204

[풀이]

[root@instructor 0728]# cat test3.sh
#!/bin/bash

empid=''
result=''

if [ $# -ne 3 ]
then
        echo "잘못된 입력 발견 : (사용법) -> ./test2.sh 성 이름 연봉"
else

        while [ 1 ]
        do
                empid=$((RANDOM%10001+10000))
                result=$(mysql mytest -u root -p1234 -e "select empid from employees where empid='$empid'")

                if [ -z $result ]
                then
                        mysql mytest -u root -p1234 -e "insert into employees values ($empid, '$1', '$2', $3)"
                        echo "FINISHED"
                        break
                fi
                continue
        done
fi

[root@yangseunghyun 0728]# ./test3.sh
잘못된 입력 발견 : (사용법) -> ./test2.sh 성 이름 연봉
[root@yangseunghyun 0728]# ./test3.sh 양 승현 1000
FINISHED
[root@yangseunghyun 0728]# mysql mytest -u root -p1234 -e 'select * from employees' 
  • aws에서 인스턴스 생성시 - region(a,b,c), zone(a)

함수

  • 다른 언어와 동일하게 미리 지정된 코드를 호출하여 사용하는 것이다.
  • 코드를 간결하게 할 수 있다.
  • 함수는 이름을 지정하고 코드에서 다시 사용할 수 있는 스크립트 코드의 블록이다.
  • 함수로 묶어 놓은 스크립트 코드의 블록을 사용해야 한다면 지정해 놓은 함수의 이름을 사용하면 된다(함수호출).

함수 생성 두가지 형식

function name {
    commands
}

(위) 코드 블록에 함수 이름을 지정하는 키워드 함수. Name 속성은 함수에 지정할 고유한 이름을 정의한다. 스크립트에서 사용자가 정의하는 함수에는 각각 고유한 이름을 지정해야 한다. Commands 는 함수를 구성하는 하나 이상의 bash 쉘 명령이다. 함수를 호출할 때 bash 쉘은 보통의 스크립트 처럼 함수에 나타나는 순서로 각 명령을 실행한다.

(아래) 다른 프로그래밍 언어에서 함수를 정의하는 방법에 가깝다. 함수 이름 뒤에 있는 빈 괄호는 함수를 정의하는 것이다. 원래의 쉘 스크립트 함수 형식과 같은 이름 지정 규칙이 적용된다.

name( ) {
commands
} 
function name {
	필요한 명령들
}
2.
name() {
	필요한 명령들
}
  • 함수내의 변수명과 함수 밖의 변수명이 동일하다면 이는 동일한 변수일까?
test(){
	a=.... #지역변수
}

             echo $a 
  • bash 는 기본적으로 동일한 변수이다

배열

  • bash 는 함수내에서 사용하는 변수와 함수 밖의 변수명이 동일한 경우 이를 동일 변수로 취급한다. (다른 언어와 반대 -> global, return )

  • 배열은 변수 하나에 다수의 값을 포함시킬 수 있는 방법.

  • bash 는 1차원 배열만 지원한다.

연관배열  mytest["name"]
  • 일반적인 배열
[root@yangseunghyun 0728]# mytest=(one two three four five)
[root@yangseunghyun 0728]# echo $mytest
one
[root@yangseunghyun 0728]# echo ${mytest[0]}
one
[root@yangseunghyun 0728]# echo ${mytest[4]}
five
[root@yangseunghyun 0728]# echo ${mytest[-1]}
five
[root@yangseunghyun 0728]# echo ${mytest[-2]}
four
[root@yangseunghyun 0728]# echo ${mytest[*]}
[root@yangseunghyun 0728]# mytest[2]=seven
[root@yangseunghyun 0728]# echo ${mytest[*]}
one two seven four five
[root@yangseunghyun 0728]# unset mytest[2]
[root@yangseunghyun 0728]# echo ${mytest[*]}
one two four five
[root@yangseunghyun 0728]# echo ${mytest[2]}
.
[root@yangseunghyun 0728]# echo ${mytest[4]}
five
[root@yangseunghyun 0728]# echo ${mytest[*]}
one two four five
[root@yangseunghyun 0728]# unset mytest
[root@yangseunghyun 0728]# mytest=(one two three four five)
[root@yangseunghyun 0728]# echo ${mytest[1-3]}
four
[root@yangseunghyun 0728]# unset mytest
[root@instructor 0728]# cat mylib test10.sh
#!/bin/bash

addem(){
        echo $[ $1 + $2 ]
}

multem(){
        echo $[ $1 * $2 ]
}
#!/bin/bash

. ./mylib

value1=10
value2=20

result1=$(addem $value1 $value2) ; echo $result1
result2=$(multem $value1 $value2) ; echo $result2

[결과]
30
200


quiz3

MariaDB [mylab]> desc instance;
+--------------+-------------+------+-----+---------+----------------+
| Field        | Type        | Null | Key | Default | Extra          |
+--------------+-------------+------+-----+---------+----------------+
| num          | int(11)     | NO   | PRI | NULL    | auto_increment |    <--- NULL
| instancename | varchar(20) | YES  |     | NULL    |                | 
| instanceip   | char(15)    | YES  |     | NULL    |                |
| cpus         | smallint(6) | YES  |     | NULL    |                |
| ram          | smallint(6) | YES  |     | NULL    |                |   <---- GB 단위
| hostname     | varchar(20) | YES  |     | NULL    |                |  <---  인스턴스가 설치된
| hostcpu      | float       | YES  |     | NULL    |                |
+--------------+-------------+------+-----+---------+----------------+
MariaDB [mylab]> grant all privileges on mylab.* to 'testuser'@'%' identified by  'test123';
MariaDB [mylab]> grant all privileges on mylab.* to 'testuser'@'localhost' identi fied by 'test123';
MariaDB [mylab]> flush privileges;
compute, control, storage, network 

접속할 DB HOST : 192.168.1.199
DB NAME : mylab
TABLE : instance 
user : testuser/test123


+--------------+-------------+------+-----+---------+----------------+
| Field        | Type        | Null | Key | Default | Extra          |
+--------------+-------------+------+-----+---------+----------------+
| num          | int(11)        <--- NULL
| instancename | varchar(20) |  <-- 인스턴스 이름
| instanceip   | char(15)    | YES  |    <-- 인스턴스의 사설 주소
| cpus         | smallint(6) | YES  |     <-- 인스턴스의 CPU 개수
| ram          | smallint(6) | YES  |     <-- 인스턴스의 메모리사이즈   <---- GB 단위
| hostname     | varchar(20) | YES  |   <---  인스턴스가 설치된 리눅스의 이름
| hostcpu      | float       | YES  |     <-- 호스트의 CPU 사용량.
+--------------+-------------+------+-----+---------+----------------+
  • 192.168.1.199에 접속하여 테이블에 인스턴스 추가해보자

[풀이]

                        인스턴스 생성 프로그램

설치할 이미지를 선택하세요
1. CentOS 7
2. Ubuntu 18.04

이미지 선택 : 1

인스턴스 이름 입력 : yangSHSH

설치할 인스턴스의 개수 선택 : 1
CPU 개수 선택(1~4) : 1
메모리 사이즈 선택(1~4GB) :
 잘못된 입력입니다. 다시 입력하세요
[root@yangseunghyun 0728]# 1
-bash: 1: command not found
[root@yangseunghyun 0728]# ./yangtest1.sh
                        인스턴스 생성 프로그램

설치할 이미지를 선택하세요
1. CentOS 7
2. Ubuntu 18.04

이미지 선택 : 1

인스턴스 이름 입력 : yangSHSH

설치할 인스턴스의 개수 선택 : 1
CPU 개수 선택(1~4) : 1
메모리 사이즈 선택(1~4GB) : 1

설치가 진행됩니다

WARNING  No operating system detected, VM performance may suffer. Specify an OS with --os-variant for optimal results.

[결과 안내]
pls wait for Dhcp protocol
yangSHSH-1 의 Ip 주소 : 192.168.122.202
현재 호스트의 CPU 사용률 : 11.77 %
 설치가 완료되었습니다. 계속 진행하시려면 아무 키나 입력하세요

[root@yangseunghyun 0728]# vim yangtest1.sh
echo " 잘못된 입력입니다. 다시 입력하세요"
exit
fi
echo -n "메모리 사이즈 선택(1~4GB) : "
read tempmem
if [ -z $tempmem ]
then
echo " 잘못된 입력입니다. 다시 입력하세요"
exit
fi
ram=$[ $tempmem * 1024 ]
echo
echo "설치가 진행됩니다"
echo
# 프로그램 설치 시작
for(( i=1; i<=count; i++))
do

cp /cloud/$name /cloud/${instancename}-$i.qcow2

virt-install --name ${instancename}-$i --vcpus $vcpus --ram $ram --network network:default,model=virtio --disk /cloud/${instancename}-$i.qcow2 --import --noautoconsole > /dev/null
done
echo
echo "[결과 안내]"
echo "pls wait for Dhcp protocol"
for ((j=1; j<=count; j++))
do
vip=$(virsh domifaddr ${instancename}-$j | grep -v Name | gawk '{print $4}'| sed '/^$/d' | gawk -F/ '{print $1}')
while [ -z $vip ]
do
vip=$(virsh domifaddr ${instancename}-$j | grep -v Name | gawk '{print $4}'| sed '/^$/d' | gawk -F/ '{print $1}')
done
echo "${instancename}-$j 의 Ip 주소 : $vip "

done

hostr=$(sar 1 3 | grep -v CPU | grep Average | gawk '{print $8}')
hostr=$(echo "scale=2; 100 - $hostr" | bc)
echo "현재 호스트의 CPU 사용률 : $hostr %"
read -n 1 -p " 설치가 완료되었습니다. 계속 진행하시려면 아무 키나 입력하세요 "
echo

mysql mylab -h 192.168.1.199 -u testuser -ptest123 -e "INSERT INTO instance VALUES (null,'$instancename','$vip',$vcpus,$tempmem,'seunghyun',$hostr)"

 #!/bin/bash

# 함수 선언
diskspace(){
        clear
        df -h
} # 디스크 공간 확인

whoseon(){
        clear
        who
} # 접속자 확인

meminfo(){
        clear
        cat /proc/meminfo

} # 메모리 정보 확인
# 변수 선언


# 메인 코드

PS3="선택하세요 : "
select option in "디스크공간확인" "로그인정보확인" "메모리정보확인" "종료"
do
        case $option in
        디스크공간확인)
                        diskspace ;;
        로그인정보확인)
                        whoseon ;;
        메모리정보확인)
                        meminfo ;;
        종료)
                        break ;;
        *)
                        clear
                        echo "잘못된 입력입니다" ;;
        esac

done
clear


dialog

  • mkte
[root@yangseunghyun 0728]# yum -y install dialog

[root@yangseunghyun 0728]# dialog --title test --msgbox "hello all" 0 0

[root@yangseunghyun 0728]# dialog --title "선택해주세요" --yesno "is it OK?" 10 20

[root@yangseunghyun 0728]# dialog --title "name" --inputbox "what is your name?" 10 20

[root@yangseunghyun 0728]# dialog --title "name" --inputbox "what is your name?" 10 20 2> name.txt

[root@yangseunghyun 0728]# name=$(cat name.txt)
[root@yangseunghyun 0728]# echo $name
양승현

[root@yangseunghyun 0728]# dialog --textbox name.txt 10 20

2번 선택
[root@yangseunghyun 0728]# dialog --title "test tile" --menu "what is your favorite sports?" 0 0 0 1 "baseball" 2 "football" 3 "running" 2> sports.txt
[root@yangseunghyun 0728]# cat sports.txt
2

[root@yangseunghyun 0728]# dialog --title "파일선택" --fselect /root/ 5 5 2> dd.txt

#!/bin/bash

clear
echo -e "\t\t\t인스턴스 생성 프로그램 "
echo
echo "설치할 이미지를 선택하세요"
echo "1. CentOS 7"
echo "2. Ubuntu 18.04"
echo
echo -n "이미지 선택 : "
read name

if [ -z $name ]
then
echo "이미지를 선택하지 않았습니다. 프로그램이 종료됩니다"
exit
elif [ $name -eq 1 ]
then
name="CentOS7-Base.qcow2"
elif [ $name -eq 2 ]
then
name="Ubuntu1804.qcow2"
else
echo "잘못된 번호를 선택했습니다. 프로그램이 종료됩니다"
exit
fi

echo
echo -n "인스턴스 이름 입력 : "
read instancename
cp /cloud/name/cloud/name /cloud/{instancename}.qcow2

echo
echo -n "CPU 개수 선택(1~4) : "
read vcpus
echo
echo -n "메모리 사이즈 선택(1~4GB) : "
read tempmem
ram=$(expr $tempmem * 1024 )

echo
echo "설치가 진행됩니다"

프로그램 설치 시작

virt-install --name instancename --vcpus $vcpus --ram $ram --network network:default,model=virtio --disk /cloud/{instancename}.qcow2 --import --noautoconsole > /dev/null

#확인
virsh list --all
sleep 5

while [ 1 ]
do
var1=(virsh domifaddr ${instancename} | grep -v Name | gawk '{print $4}' | sed '/^/d' | gawk -F/ '{print $1}')
if [ -z $vmip ]
then
echo -n "#"
else
echo " 설치가 완료되었습니다"
break
fi
sleep 2
done

var2=$(sar 1 3 | tail -1 | gawk '{print 100-$8}') # cpu 사용량 확인
sleep 5

mysql -h 192.168.1.199 mylab -u testuser -ptest123 -e "insert into instance values (NULL,'name,name','var1',vcpus,vcpus,tempmem,'instancename,{instancename}',var2)"

2개의 댓글

comment-user-thumbnail
2022년 7월 28일

:)

답글 달기
comment-user-thumbnail
2022년 7월 28일

잘보고 있습니다

답글 달기