bash script2023. 5. 3. 11:23

 

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

 

expect 스크립트를 이용하면 rsync 원격 백업을 자동화할 수 있다. 이 방법은 예전에 올렸던 ssh 자동 접속 방법과 같은 맥락이다. rsync에 대한 내용은 이전 게시물을 참고하자. 여기로

 

스크립트 이름은 auto_rsync.exp로 하고, 인자(argument)는 원천(source) 디렉토리, 원격주소, 백업 디렉토리, ssh 접속암호 순서로 지정한다고 하자. 예를 들어 /home/john/my_dir 디렉토리를 192.168.0.10의 john 계정에 있는 /home/john/my_backup 디렉토리로 백업한다고 하면 아래와 같이 실행하게 될 것이다. 접속암호는 my_password라고 가정하자.

expect -f auto_rsync.exp /home/john/my_dir john@192.168.0.10 /home/john/my_backup my_password

auto_rsync.exp 스크립트는 아래와 같이 구성할 수 있다.

# auto_rsync.exp
# 변수 할당
set src_dir [lindex $argv 0]
set remote_host [lindex $argv 1]
set dst_dir [lindex $argv 2]
set password [lindex $argv 3]
# rsync 실행
spawn rsync -r -v -z -u "$src_dir" "$remote_host:$dst_dir"
# 암호 입력 메세지 기다림
expect -nocase "password"
# 암호 전송
send "$password\r"
# 이후 작업 권한을 사용자에게 넘김
interact

위 스크립트가 동작하는 과정을 간단하게 설명하자면 아래와 같다.

우선 각 인자를 변수에 할당한다(set). 첫번째 인자는 src_dir, 두번째 인자는 remote_host, 세번째 인자는 dst_dir, 네번째 인자는 password에 할당.

rsync 명령을 실행한다(spawn).

이후 암호를 입력하라는 메세지를 기다렸다가(expect) 접속암호를 보낸다(send).

암호를 입력하고 나면 rsync에서 알아서 백업이 수행되므로 실행권한을 사용자에게 되돌린다(interact).

수동으로 백업을 한다면 굳이 위와 같은 스크립트를 이용할 필요가 없으나, 다수의 디렉토리를 백업할 때 편리하다. 아래의 예시를 보자.

echo "john@192.168.0.10의 접속 암호를 입력해 주세요."
read password
# /home/john 하위에 있는 my_dir_a, my_dir_b, my_dir_c 백업
for src_dir in my_dir_a my_dir_b my_dir_c
do
  expect -f auto_rsync.exp "/home/john/$src_dir" john@192.168.0.10 "/home/john/backup_dir/$src_dir" "$password"
done

read 명령으로 접속암호를 한번만 입력 받은 후, 세개의 디렉토리를 원격에 순차적으로 백업할 수 있다.

728x90
Posted by 반달가면