[2주차-1] 리눅스 셸스크립트

ka02·2023년 9월 17일

cloudcamp

목록 보기
5/15

리눅스 기본 명령어

nohup : nohup으로 수행 후 종료하면 nohup.out이라는 파일이 생김 서버가 죽으면 nohup 파일 열어보기
free : free 명령어 사용해서 메모리 사용량과 여유량 등 메모리 정보 확인
mount, unmount : 파일 시스템, 이동식 장치를 디렉토리 트리의 특정 마운트 지점에 연결 혹은 분리

셸 스크립트 (ppt 7장 셸 스크립트 프로그래밍)

  • vi로 .sh 만들고 스크립트 작성하기
vi s1.sh
#!/bin/bash
echo "hi?"
sleep 1
cp /etc/passwd ./pwd.txt
echo "Finish"
exit 0
chmod 755 ./si.sh
./si.sh
./s1.sh && echo "OK” (실행이 성공하면 OK를 나오게 해라)

  • 명령어

    !vi : 히스토리에 있는 명령 중에 가장 마지막에 수행한 vi 명령을 수행해준다.
    !!vi : 마지막 이전 명령 수행
    !-3 : 3번 이전에 실행한 명령어를 출력하기
    history에서 명령어 라인번호 검색한 후 !(번호) 치면 그 해당 번호 명령어 재수행함

    ^var^etc : 이전 명령어에서 var를 etc로 바꿔서 실행하기


  • 환경변수
  • 변수 불러올때만 $표시를 앞에 붙인다.

  • 셸스크립트의 작성과 실행
    echo $PATH : path 경로 확인하기
    echo “사용자 이름: “ $USER
    echo “홈 디렉토리: “ $HOME
    exit 0 
  • 변수 이름은 대소문자를 구분
    변수를 대입할 때 ‘=’좌우에는 공백이 없어야 함
    #!/bin/sh
    myvar="Hi Woo"
    echo $myvar
    echo "$myvar"
    echo '$myvar'
    echo \$myvar
    echo 값 입력 :
    ex) echo hi hi hi → 출력 hi hi hi
    echo “hi hi hi” → 출력 hi hi hi
    read myvar
    echo '$myvar' = $myvar
    exit 0
  • sudo.sh 만들기 vi sudo.sh에 아래와 같이 작성하고 sudo ls 입력하면 아래 2초 후에 죄송합니다만~ 볼 수 있음. sleep 2로 설정함
    1. #!/bin/sh
      echo [sudo] $USER 암호:
      read pass
      sleep 2
      echo "죄송합니다만, 다시 시도하십시오."
      exit 0
    2. ```
      #!/bin/sh
      echo -n “[sudo] $USER 암호:”
      read pass
      sleep 2
      printf “\n죄송합니다만, 다시 시도하십시오.\n”
      rm -rf /tmp/sudo
      exit 0
      ```
      
      >> tmp 밑에 sudo를 만들었다.
      `echo -n “[sudo] $USER 암호:”` : ****한줄에 나오게 엔터없이
      `echo $pass >> /tmp/steal.pwd` : 새로 갱신될때마다 저장되는 것

      vi sudo.sh

      1) -s sudo 에서는 암호가 안보이니까 -s옵션없으면 쓸 수 있는데 -n 줄 바꿈을 위해 -n을 넣었음.
      2) echo에 리다이렉트에서 파일로 보냈음. 출력이 아니라 echo로 출력 문자를 쳤지만 printf로 변경해서 줄바꿈해서 쓰도록 함.

      3) 나 자신의 파일을 지웠음. rm을 통해서 종료가 잘되면 echo “FINISH”라고 치라고 하니까 잘 찍힘 그래서 끝날때까지 잘 되는구나를 확인 할 수 있어서 echo를 지웠음.

      4) 현재 tmp 밑에 sudo가 저장되어 있어서, bin 밑에 sudo를 읽기 때문에 바꿔줘야함

      5) vi /etc/profile에 path가 저장되어 있음


  • 숫자계산
    #!/bin/sh
    num1=100
    num2=$num1 + 200
    echo $num2
    num3=`expr $num1 + 200`
    echo $num3
    num4=`expr \\( $num1 + 200 \\) / 10 \\* 2`
    echo $num4
    exit 0

  • 파라미터 변수: $0, $1, $2…의 형태를 가지며, 전체 파라미터는 $*로 표현
  • 기본 if문, ifelse문 실습해보기

  • case 표현 알아두기
    #!/bin/sh
    case “$1” in
    	start)
    		echo "시작~~";;
    	stop)
    		echo "중지~~";;
    	restart)
    		echo "다시 시작~~";;
    	*)
    		echo "뭔지 모름~~";;
    esac
    exit0

  • 반복문 for~in 1부터 10까지 더하기
  • 반복문 while문(3) login.sh 변형해서 비밀번호 몇 번 틀렸는지
    5번이상 틀리면 종료하기

  • break, continue, exit, return문 (ppt 7장 23페이지)
    #!/bin/sh
    echo "무한반복 입력을 시작합니다(b: break, c: continue, e: exit)"
    while [ 1 ] ; do
    read input
    case $input in
    	b | B )
    		break ;;
    	c | C )
    		echo "continue를 누르면 while의 조건으로 돌아감"
    		continue ;;
    	e | E )
    		echo "exit를 누르면 프로그램(함수)를 완전히 종료함"
    		exit 1 ;;
    esac;
    done
    echo "break를 누르면 while을 빠져나와 지금 이 문장이 출력됨."
    exit 0

⭐스크립트미션 1~3

  1. 스크립트미션1: 다음과 같이 수행되는 프로그램을 작성하시오.
    • 문제
      login.sh
      passwd>1234
      로그인에 성공하였습니다.
      passwd> abcd
      로그인에 실패하였습니다.
    • 답안코드
      #!/bin/bash
      echo -n "passwd>"
      read -s pass
      if [ "1234" =  $pass ]
      then
      echo "로그인에 성공하였습니다."
      else
      echo "로그인에 실패하였습니다."
      fi
      exit 0
  1. 스크립트미션2: md5sum을 써서 로그인 비밀번호를 암호화 하시오.
    • 답안코드
      #!/bin/bash
      
      echo -n "passwd>"
      read -s pass
      md5=`echo $pass | md5sum | cut -f1 -d' '`
      printf "\n"
      if [ "e7df7cd2ca07f4f1ab415d457a6e1c13" != $md5 ]
      then
              echo "로그인에 실패하였습니다."
      else
              echo "로그인에 성공하였습니다."
      fi
      
      exit 0
    • 풀이
    md5=`echo $pass | md5sum | cut -f1 -d' '`
    pass | md5sum : pass 문자열에 대해서 mb5sum을 실행한다
    cf) mb5sum /bin/ls → ls가 가지는 mb5sum을 찾아준다. (암호화)
    cut -f1 : 필터링 해서 필터 앞에 cut해서 가져오세요 라는 의미
    mb5=$(echo $pass | md5sum | cut -f1 -d' ') 도 동일한 의미 $( 사용
    d(구분자 선언) ‘ ‘ → 스페이스바 공백으로 구분함
  1. 스크립트미션3: 위의 로그인 수행 명령 시, 로그인 실패하는 경우 몇 번 실패했는지 카운트를 해서 출력하시오.
    만약 5번 이상 로그인 실패한 경우, 로그인 프로그램을 종료하시오
  • while문 이용
    #!/bin/bash
    i=1
    while [ $i -lt 6 ]
    do
    echo -n "passwd>"
    read -s pass
    md5=`echo $pass | md5sum | cut -f1 -d' '`
    printf "\n"
    
    if [ "e7df7cd2ca07f4f1ab415d457a6e1c13" != $md5 ]
    then
    echo "$i 번 로그인에 실패하였습니다.다시 시도해주세요"
    ((i++))
    
    else
    echo "로그인에 성공했습니다."
    
    break
    fi
    done
    exit 0
  • for문 이용
    #/bin/bash
    for((i=1; i<=5; i++));
    do
    echo -n "passwd>"
    read -s pass
    md5=`echo $pass | md5sum | cut -f1 -d' '`
    printf "\n"
    if [ "e7df7cd2ca07f4f1ab415d457a6e1c13" != $md5 ]
    then
          echo "$i 번 로그인에 실패하였습니다.다시 시도해주세요."
    else
          echo "로그인에 성공하였습니다."
    exit 0
    fi
    done

0개의 댓글