bash script (backup)2020. 10. 19. 09:48

 

반달가면 이글루에서 백업 - bahndal.egloos.com/391964

 

앞에 게시한 ftp, telnet, ssh 자동접속 script를 사용할 경우 script에 접속 암호가 그대로 표시된다. 그러므로 반드시 해당 파일에 대한 접근권한을 제대로 설정해 주어야만 한다.

 

예를 들어 login.sh라는 파일을 만들었다면, 다른 사용자가 script 내용을 볼 수 없도록 권한을 설정해 주어야 한다.

ssh

chmod 700 login.sh

 

권한을 이렇게 해 놓아도 당연히 root는 해당 내용을 볼 수 있다. 자동접속 기능은 편리하긴 하지만 보안 측면에서는 분명히 위험요소가 있다는 점을 명심하고, 사용해도 괜찮은 상황인지 꼼꼼하게 따져 보고 결정하자.

 

Posted by 반달가면

댓글을 달아 주세요

bash script (backup)2020. 10. 19. 09:02

 

반달가면 이글루에서 백업 - bahndal.egloos.com/391590

 

앞에서 올린 telnet 자동 접속 방법으로 ssh 접속은 불가능하다.

ssh 로그인을 자동화하려면 우선 expect를 설치해야 한다. 패키지 관리자에서 expect를 검색해서 설치하면 된다.

터미널창에서 설치하고 싶다면 아래와 같이 입력하면 되겠다.

sudo apt-get install expect
(데비안/우분투 계열 배포판)

또는

sudo zypper install expect
(오픈수세)

expect가 설치되었으면 이제 ssh 자동 접속을 해 보자.

 

예를 들어 ssh 서버가 192.168.0.10이고 사용자명은 john, 암호는 my_password라고 가정하자. 또한 서버에 로그인하면 셸 프롬프트(shell prompt)는 john> 이렇게 나온다고 가정하자. (셸 프롬프트가 어떤 형태로 표시되는지 미리 알고 있어야 한다)

 

처음 접속할 때는 암호화 통신을 위한 열쇠(RSA key)를 받아야 되니까 처음 한번은 수동으로 접속해서 열쇠를 받고, 그 다음부터 자동화 스크립트를 이용하면 되겠다. (만약 열쇠를 무조건 자동으로 받고 싶다면 ssh 접속에서 -o StrictHostKeyChecking=no 항목을 추가해야 한다. 아래 예시의 내용을 참고하자)

 

문서편집기를 이용해서 자동화 스크립트 ssl_login.exp를 아래와 같이 작성한다. #으로 시작되는 줄은 주석(comment)이다. 서버 192.168.0.10에 john이라는 사용자가 ssh 접속을 해서 서버의 커널 버전을 확인하기 위해 uname -r 명령을 실행한 경우이다.

 

# script file: ssl_login.exp

# spawn ssh process

spawn ssh john@192.168.0.10

# to accept RSA key automatically, set StrictHostKeyChecking=no

# spawn ssh -o StrictHostKeyChecking=no john@192.168.0.10

# wait for password request

expect -nocase "password"

# send password (\r is for return key)

send "my_password\r"

# wait for shell prompt expect "john>"

# execute commands (in this example, identify kernel version with 'uname -r' command)

send "uname -r\r"

# wait for user prompt

expect "john>"

# exit

send "exit\r"

 

위와 같이 스크립트를 만들었으면, 아래의 명령으로 실행하면 된다.

 

expect -f ssl_login.exp

 

여기에 사용된 expect 스크립트 명령어에 대해 간단히 적어 보자면,

 

spawn: 새로운 프로세스를 실행한다

 

expect: 특정 문자열이 나올 때까지 기다린다. -nocase 옵션을 주면 대소문자를 구별하지 않는다.

 

send: 특정 문자열을 실행중인 프로세스로 보낸다. 명령어를 입력하고 엔터를 누르는 경우 마지막에 \r 추가.

 

Posted by 반달가면

댓글을 달아 주세요

bash script (backup)2020. 10. 16. 11:47

 

반달가면 이글루에서 백업 - bahndal.egloos.com/388042

 

telnet 로그인을 자동화하는 방법이다.

 

telnet 서버가 192.168.0.10이고 사용자명은 john, 암호는 my_password라고 가정하면, 아래와 같은 shell script를 이용할 수 있다. telnet으로 접속해서 uname -r 명령으로 서버의 커널 버전을 확인하는 경우다.

 

(

sleep 2

echo "john"

sleep 2

echo "my_password"

sleep 2

echo "uname -r"

sleep 2

echo "exit" ) | telnet 192.168.0.10

 

입력을 보낸 후 응답이 올 때까지 걸리는 시간을 고려해서 각 입력 사이에 몇초간 대기하도록 sleep 명령을 사이사이에 추가해 주는 것이 좋다.(위의 예시에서는 2초)

 

 

Posted by 반달가면

댓글을 달아 주세요

bash script (backup)2020. 10. 16. 11:43

 

반달가면 이글루에서 백업 - bahndal.egloos.com/385339

 

for문을 이용해서 특정 디렉토리에 있는 특정 파일에 대해 일률적으로 반복 작업을 할 수 있다.

홈 디렉토리에 있는 txt 파일을 골라 내용을 화면에 표시하는 예시를 보자.

 

for file_name in ~/*.txt
do
echo "[ opening $file_name ]"
cat $file_name
echo " "
done

 

자, 그럼 앞에 올렸던 ftp 자동접속 방법을 합쳐서 홈 디렉토리의 txt파일만 골라 특정 서버에 올리는 작업도 쉽게 해 볼 수 있겠다.

 

for file_name in ~/*.txt
do
echo "[ uploading $file_name ]"
ftp -n 192.168.0.10 << SCRIPT
  user john my_password
  binary
  put $file_name
  quit
SCRIPT
done

 

 

Posted by 반달가면

댓글을 달아 주세요

bash script (backup)2020. 10. 16. 11:38

 

반달가면 이글루에서 백업 - bahndal.egloos.com/382770

 

리눅스 shell script에서 FTP 서버에 자동으로 접속해서 파일을 올리거나 가져오는 방법이다.

 

형식은 대략 아래와 같다.

 

ftp -n [서버 주소] << [구분자]

user [사용자id] [암호]

[ftp 명령어]

quit

[구분자]

 

예를 들어 사용자 이름 john, 암호 my_password, ftp 서버 192.168.0.10, my_data.dat 파일을 가져오는 경우라면 이렇게 만들면 되겠다.

 

ftp -n 192.168.0.10 << SCRIPT

  user john my_password

  binary

  get my_data.dat

  quit

SCRIPT

 

구분자로 사용한 SCRIPT는 들여쓰기(indentation)하면 안된다는 점에 주의하자. 구분자 위쪽의 ftp 명령어 부분은 들여쓰기해도 된다.

 

ftp에서 -n 옵션은 접속후 자동으로 계정과 암호를 묻지 않도록 하기 위한 것이다. 계정과 암호는 "SCRIPT"라는 구분자로 묶인 부분에서 수동으로 입력하므로 자동접속에서는 -n 옵션이 반드시 포함되어 있어야 한다.

 

만약 script 구성상 전체적으로 들여쓰기를 해야 보기가 좋다면 아래와 같이 해 보자. ("<<" 대신 "<<-" 사용)

 

  ftp -n 192.168.0.10 <<- SCRIPT

    user john my_password

    binary

    get my_data.dat

    quit

  SCRIPT

 

한가지 유의할 점은, 들여쓰기를 할 때 반드시 탭(tab)을 사용해야 한다는 것이다. 공백(space)으로 들여쓰기를 하면 안 된다.

 

FTP는 접속정보가 암호화되지 않으므로 보안에 유의하자! 되도록 anonymous 사용을 추천.

 

 

Posted by 반달가면

댓글을 달아 주세요

bash script (backup)2020. 10. 15. 20:32

 

반달가면 이글루에서 백업 - bahndal.egloos.com/363294

 

find와 grep을 이용해서 특정 디렉토리와 그 하위 디렉토리에서 특정 문자열이 포함된 파일을 찾을 수 있다. find 명령에 -type f 옵션으로 파일을 출력한 후 grep으로 찾으면 되겠다. 검색 범위는 지정한 디렉토리와 그 하위 디렉토리가 된다.

 

현재 디렉토리와 그 하위 디렉토리에서 myfile이라는 문자열이 포함된 파일을 찾으려면

find ./ -type f | grep "myfile"

 

/etc 디렉토리에서 찾으려면

find /etc -type f | grep "myfile"

 

그렇게 찾은 파일을 rm 명령으로 지우고 싶으면

find /etc -type f | grep "myfile" | xargs rm

 

또는 역따옴표(`)를 이용해서

rm `find /etc -type f | grep "myfile"`

 

디렉토리를 찾고 싶으면 -type d라고 지정하면 된다.

find ./ -type d

 

Posted by 반달가면

댓글을 달아 주세요

bash script (backup)2020. 10. 15. 20:28

 

반달가면 이글루에서 백업 - bahndal.egloos.com/339889

파일 생성 시점을 파일명에 넣어서 임시 파일을 만드는 경우다.  

 

shell script에서 임시로 파일을 만들어서 사용해야 할 경우, 파일명이 다른 파일과 겹치지 않게 하기 위해 date를 활용할 수 있다. 현재 시각을 임시 파일의 이름에 넣으면 된다. 

현재 시각을 "연월일_시분초" 형식으로, 예를 들어 2012년 11월 29일 17시 45분 23초를 20121129_174523 이런 식으로 얻어서 파일명에 사용하자. 

date "+%Y%m%d_%H%M%S"

 

아래의 예는 현재 시각을 time_stamp라는 변수에 할당하여 임시 파일명을 my_tmp_file.$time_stamp.tmp로 정하고 여기에 "this is my temp file" 문자열을 저장한 경우이다.

 

time_stamp=`date "+%Y%m%d_%H%M%S"`

tmp_file_name="my_tmp_file.$time_stamp.tmp"

echo "this is my temp file" > "$tmp_file_name"

 

시각이 2012년 11월 29일 17시 45분 23초라면 임시 파일은 my_tmp_file.20121129_174523.tmp가 될 것이다.

 

만약 이런 script를 거의 동시에 여러 개를 실행해야 하는 경우라면, 임시 파일 이름이 겹치지 않기 위해 초 단위보다 더 세밀하게 시각을 얻어야겠다. 이럴 때는 나노초(nanosecond)를 포함시키면 된다. time_stamp 변수의 값이 10억분의 1초 단위로 정해지니까 겹칠 일이 없을 것이다. 아래와 같이 하면 된다.

 

time_stamp=`date "+ %Y%m%d_%H%M%S_%N"`

 

 

Posted by 반달가면

댓글을 달아 주세요

bash script (backup)2020. 10. 15. 20:21

 

반달가면 이글루에서 백업 - bahndal.egloos.com/356262

 

리눅스에서 date 명령에 추가 조건을 주면 오늘 날짜 말고도 갖가지 날짜를 편리하게 구할 수 있구나!

어제
date -d "yesterday"

내일
date -d "tomorrow"

3일후
date -d "+3 days"

4일전
date -d "-4 days"

지난 금요일
date -d "last friday"

다음주 월요일
date -d "next monday"

 

 

Posted by 반달가면

댓글을 달아 주세요

bash script (backup)2020. 10. 15. 15:28

 

반달가면 이글루에서 백업 - bahndal.egloos.com/332093

 

파일을 지우려면 우선 해당 파일명을 찾아야 한다. ls -l 명령으로 timestamp가 표시되도록 한 후 awk로 파일명을 골라내자.

예를 들어 5월 24일이 찍힌 파일을 찾으려면 이렇게 할 수 있다.

ls -l | grep "^\-r" | grep "May 24" | awk '{print $9}'

퍼미션 표시에서 (디렉토리나 링크가 아닌) 파일은 -rwxr--r-- 이런 식으로 나올 테니 "-r"로 시작하는 항목만 grep으로 고른다.('-'가 grep에서 연산자로 해석되지 않도록 '\-' 이런식으로 쓰자)

거기서 원하는 timestamp가 있는 항목을 골라낸다.

거기서 파일명이 표시되는 위치인 9번째 항목(field)을 awk 명령으로 골라낸다.

자, 이제 지워야겠으니 위의 명령을 역따옴표(`)로 묶어서 rm 명령에 넘기자.

rm `ls -l | grep "^\-r" | grep "May 24" | awk '{print $9}'`

 

 

Posted by 반달가면

댓글을 달아 주세요

bash script (backup)2020. 10. 15. 15:24

 

반달가면 이글루에서 백업 - http://bahndal.egloos.com/141751

 

초보자를 위한 리눅스 shell 명령 소개

An Introduction to the Linux Command Shell For Beginners

 

ShellIntro.pdf
0.12MB

 

13쪽 분량의 간단한 명령어 소개 자료

 

먼저 올렸던 "24시간에 배우는 셸 프로그래밍(https://freewin.tistory.com/186)"과 함께 활용.

 

Posted by 반달가면

댓글을 달아 주세요