[23.01.13] 57일차 [클라우드]

W·2023년 1월 13일
0

국비

목록 보기
84/119

IP 주소

  • 컴퓨터가 가지는 주소
  • IPv4 = IP 주소

IPv4 주소

  • 4byte 주소 체계(1byte = 8bit)
  • 32bit 주소 체계
  • 2^32개의 주소 크기 = 42억여개
  • 2진수( 0,1)
  • 필드 개념을 적용. 필드와 필드 사이를 마침표(.)로 구분
  • 하나의 필드는 8개의 bit로 구성 (8 x 4 = 32)
  • 4개의 필드로 구성
  • 하나의 필드에서 가질 수 있는 가장 작은 형태
    => 00000000
  • 하나의 필드에서 가질 수 있는 가장 큰 형태
    => 11111111
  • 가장 작은 10진수 형태의 IPv4 주소
    => 0.0.0.0
  • 가장 큰 10진수 형태의 IPv4주소
    => 255.255.255.255

IPv6 주소

  • 16byte 주소 체계
  • 128bit 주소 체계
  • 16진수(0~9,A~F)
  • 필드 개념을 적용. 필드와 필드 사이를 콜론(:)으로 구분
  • 하나의 필드는 16개의 bit로 구성 (16 x 8 = 128)
  • 8개의 필드로 구성
  • 하나의 필드에서 가질 수 있는 가장 작은 형태
    0000000000000000 (0이 16개)
    => 4개의 비트씩 16진수로 변환
    => 16진수 가장 큰 형태인 F는 2진수 1111과 같음.
    => 2진수 1111(1x2^3 + 1x2^2 + 1x2^1 + 1x2^0)
    => 하나의 필드에서 가질 수 있는 가장 작은 16진수 형태 : 0x0000
  • 하나의 필드에서 가질 수 있는 가장 큰 형태
    1111111111111111 (1이 16개)
    => 16진수 형태로 변경
    => FFFF
  • 가장 작은 IPv6 주소 형태
    0000:0000:0000:0000:0000:0000:0000:0000
  • 가장 큰 IPv6 주소 형태
    FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF

IPv4와 IPv6의 차이점

  1. IPv4는 2진수, IPv6 16진수 사용
  2. IPv4에 존재하던 서브넷 마스크는 IPv6에는 없음
    => IPv6는 prefix 라는 개념이 존재
    => IPv6주소/n 형태로 표시
    예를 들어 2001:1:1:1:0:0:0:1/64 주소가 있다면 이 주소는 64개의 비트가 같으면 같은 네트워크 다르면 다른 네트워크이다.
    64(16x4)bit = 4개의 필드가 같으면 같은 네트워크이다.
    위의 주소와 같은 네트워크에 있는 주소들은
    주소 앞부분이 '2001:1:1:1:' 시작하는 모든 주소들
  3. IPv4 => Network ID / Host ID
    IPv6 => Netwrok ID / Interface ID (기본값 : 64bit씩)
  4. IPv4에는 통신의 형로 유니캐스트, 멀티캐스트, 브로드캐스트
    IPv6에는 유니캐스트, 멀티캐스트, 애니캐스트

IPv6로 의 전환은 IPv4만 지원하는 장비가 아직 존재해서 하지않고 있음.

※ 2001:1:1:1:0:0:0:1/64
=> IPv6주소는 8개의 필드 128개의 비트로 되어 있어 주소 형태가 길다.
=> 주소를 조금 줄여서 쓸 수 있는 방법
1) 연속 된 0은 단 한번 ::으로 대체
2) 앞의 0은 생략 가능(중간 또는 마지막 0은 생략 불가)
=> 위의 내용을 적용하면 2001:1:1:1::1/64

그러나 만약 ::0a2d:41c3:: 이런주소 있다면 잘못된 형태!!
1) 0:0:0a2d:41c3:0:0:0:0
2) 0:0:0:0a2d:41c3:0:0:0
3) 0:0:0:0:0:a2d:41c3:0:0
=> 경우의 수가 많아서 제대로 된 주소를 사용할 수 없음!
=> 연속 된 0은 단 한번 ::으로 대체해야 한다!

FDEC:BA90:0074:000F:BBFF:1011:0000:FFFF
=> 줄여쓰면 FDEC:BA90:74:F:BBFF:1011:0:FFF
=> 중간에 있는 0또는 마지막에 있는 0은 생략이 불가능
=> 0000 이 있는 필드는 하나의 0은 써줘야 함.

셸 스크립트 프로그래밍

리눅스 4대 요소

사용자(애플리케이션), 셸(Shell), 커널, 하드웨어

셸(SHELL) 특징

  1. 명령어 해석
  2. 환경 제어
  3. 셸 프로그래밍

셸의 종류

  • Bournce셸, C셸, Korn셸, Bash셸
  • CentOS 리눅스는 기본으로 Bash셸을 사용함.

Bash셸의 특징

  • Alias 기능(명령어 단축 기능)
  • History 기능
  • 연산 기능
  • Job Control 기능
    (프로그램을 프론트 또는 백엔드에서 동작)
  • 자동 이름 완성 기능(Tab)
  • 프롬프트 제어 기능
  • 명령 편집 기능

현재 사용중인 셸 확인 방법

echo $SHELL

  • 파일에 셸 명령어와 변수들을 사용하는 프로그램
    => 셸 스크립트 또는 셸 프로그램

셸 스크립트 작성

=> 편집기(vi또는 emacs) 사용
=> 파일명은 자유롭게 지정
=> 파일명의 확장자는 .sh를 사용
=> 파일명에 한글이나 공백문자가 들어가면 문제가 발생

간단한 셸 스크립트 작성

vi showuser.sh

#!/bin/sh
echo "사용자 이름 : " $USER
echo "호스트 이름 : " $HOSTNAME
exit

:wq

ls
=> showuser.sh

file showuser.sh

셸 스크립트 실행법

1) sh 명령어 사용
2) '실행 가능' 상태로 변경 후 실행

sh showuser.sh
=>
사용자 이름 : root
호스트 이름 : localhost.localdomain

cp showuser.sh /home/itwill/

su - itwill
pwd
=> /home/itwill
※ su 명령어 사용 시 '-' 옵션을 붙여야 홈 디렉터리로 이동

ls -l showuser.sh
Permisson(권한): rw- r-- r--
rw- : 소유자(root)
r-- : 소유그룹(root)
r-- : 그 밖의 사람(itwill)

chmod +x showuser.sh
chmod: changing permissions of `showuser.sh': 명령을 허용하지 않음
=> showuser.sh 의 소유자가 root 이므로 itwill 계정으로는 변경 불가능!

exit
=> itwill 계정을 로그아웃!

(root 계정으로)
chmod +x /home/itwill/showuser.sh

su - itwill

showuser.sh
=> bash: showuser.sh: 명령을 찾을 수 없습니다...
=> 실행파일로 변경된 showuser.sh를 명령어로 인식

./showuser.sh
(= /home/itwill/showuser.sh)
=> 실행권한이 있는 스크립트 파일을 sh 명령어 없이
실행하고자 할 때는 '절대경로' 형태로 입력!!
※ 절대 경로 : 파일 명 앞에 '/' 으로 시작

환경변수

  • 지역 환경변수, 사용자 환경변수, 시스템 환경변수
  • 지역 환경변수
    => 현재 로그인 중인 세션에만 적용
    => 접속을 종료하면 사라지게 되는 변수
  • 사용자 환경변수
    => 각 사용자에게 적용되는 환경 변수
    => ~/.bash_profile 에 적용되어 있음.
  • 시스템 환경변수
    => 전체 사용자에게 적용되는 환경 변수

환경변수 설정 확인

=> env or printenv 또는 set 명령어 사용

환경변수 값 변경

export 환경변수=값

<itwill 계정의 홈 디렉터리를 변경>

su - itwill

env
=> HOME=/home/itwill
=> ~ : /home/itwill

export HOME=/home
=> 홈 디렉터리를 /home 변경

cd /var/www/html
=> 위치를 /var/www/html로 이동

cd
=> 홈 디렉터리로 이동
=> pwd를 하면 /home이 출력됨!

다시 홈 디렉터리를 /home/itwill로 변경하려면
export HOME=/home/itwill

[셸 스크립트의 변수]

  • 미리 설정되어 있는 환경변수와는 달리
    관리자가 필요에 의해서 직접 변수를 지정
  • 변수를 사용하기 전에 미리 선언하지 않고,
    처음 변수에 값이 할당되면 자동으로 변수 생성
  • 변수에 있는 모든 값들은 문자열(String)으로 취급
  • 변수는 대소문자 구분을 함.

myname = KJS
=> bash: myname: 명령을 찾을 수 없습니다...
=> 띄어쓰기 금지!

myname=KJS
echo $myname
=> KJS 가 출력

myname="Kang Jin Seok"
echo $myname
=> "Kang Jin Seok"

myname=1+1
echo $myname
=> 1+1

[변수의 설정 및 사용]

  • 변수는 echo $변수명으로 출력
  • 만약 $를 특수기호로 사용하려면 '\' 붙임
  • "" 로 변수를 묶어도 되고, 묶지 않아도 됨

[myname.sh]

vi myname.sh

#!/bin/sh
myname="Kang Jin Seok"
echo $myname

echo "$myname"

echo '$myname'

echo \$myname

echo 값 입력 :

read myname

echo '$myname' = $myname
exit 0

:wq

[ID.sh]

vi ID.sh

#!/bin/sh
echo -n "Enter your ID : "
read id
echo -n "Enter your NAME : "
read name
echo -n "Enter your NUMBER : "
read number

echo "Now your ID is $id."
echo "NAME : $name , NUMBER : $number"

:wq

sh ID.sh

[if]
기본 문법
if [ 조건 ]
then
참일 경우 실행
fi
=> '[' 앞 뒤 공백 필요!
=> 마지막에 'fi' 끝내야 함

[if1.sh]

vi if1.sh

#!/bin/sh
if [ "itwill" = "itwill" ]
then 
  echo "참 입니다."
fi
exit 0

:wq

[if~else]

if [ 조건 ]
then
참일 경우 실행
else
거짓일 경우 실행
fi

[if2.sh]

vi if2.sh

#!/bin/sh
if [ "itwll" != "itwill" ]
then
  echo "참 입니다."
else
  echo "거짓 입니다."
fi
exit 0

[셸 비교연산자]

= : 두 문자열이 같으면 참
!= : 두 문자열이 같지 않으면 참
-n : 문자열이 NULL(빈 문자열)이 아니면 참
-z : 문자열이 NULL(빈 문자열)이면 참

-eq : 두 수식(또는 변수)이 같으면 참
-ne : 두 수식(또는 변수)이 같지 않으면 참
수식 1 -gt 수식2 : 수식1이 크다면 참
수식 1 -ge 수식2 : 수식1이 크거나 같으면 참
수식 1 -lt 수식2 : 수식1이 작으면 참
수식 1 -le 수식2 : 수식1이 작거나 같으면 참
!수식 : 수식이 거짓이라면 참

[if3.sh]

vi if3.sh

#!/bin/sh
if [ 100 -eq 200 ]
then
  echo "100과 200은 같다."
else
  echo "100과 200은 다르다."
fi
exit 0

[if ~ elif ~ else문]

if [ 조건 ]
then 명령어
elif [ 조건 ]
then 명령어
else 명령어
fi

Q. comparison.sh

A와 B의 값을 입력받아
1) 비교값이 같을 때
2) A가 B보다 클 때
3) A가 B보다 작을 때
각각의 조건에 따른 결과값을 출력
셸 스크립트 작성

#!/bin/sh
echo -n "A : "
read A
echo -n "B : "
read B

if [ $A -eq $B ]
then
  echo "A is equal to B"
elif [ $A -gt $B ]
then
  echo "A is greater than B"
elif [ $A -lt $B ]
then
  echo "A is less than B"
fi

[파일과 관련된 조건]

-d 파일이름 : 파일이 디렉터리면 참
-e 파일이름 : 파일이 존재하면 참
-f 파일이름 : 파일이 일반 파일이면 참
-g 파일이름 : 파일에 set-group-id가 설정되어 있으면 참
-r 파일이름 : 파일이 읽기 기능이면 참
-w 파일이름 : 파일이 쓰기 가능한 상태이면 참
-x 파일이름 : 파일이 실행 가능한 상태이면 참
-s 파일이름 : 파일 크기가 0이 아니면 참
-u 파일이름 : 파일에 set-user-id가 설정되어 있으면 참

[if4.sh]

vi if4.sh

#!/bin/sh
if [ -d "/root/test" ]
then
  if [ -e "/root/test/newfile.txt" ]
  then
    echo "파일이 존재합니다."
  else
    touch /root/test/newfile.txt
  fi
else
  echo "/root/test 디렉터리가 존재하지 않습니다."
fi
exit 0

:wq

Q. /root/test/newfile.txt 파일이 존재하는지 확인하고
파일이 없다면 "파일이 없습니다" 를 출력하고
만약 파일이 존재하는 경우 이 파일의 크기가 0인지 확인한 후
0이 아니라면 "비어있는 파일이 아닙니다."를
0이라면 어떤 문자든(자유롭게) 입력받아 내용을 추가하는
셸 스크립트를 작성해보자.
Hint) 내용 추가 시 리다이렉트 기호 사용 ('>>')

if [ -f /root/test/newfile.txt ]
  then
   if [ -s /root/test/newfile.txt ]
     then
       echo "비어있는 파일이 아닙니다!"
     else
      echo "파일이 비어있습니다."
      echo -n "추가할 문자를 입력하세요. : "
      read TEXT 
      echo $TEXT > /root/test/newfile.txt
    fi
else
  echo "파일이 없습니다!"
fi

0개의 댓글