Server Management/LInux Server

ssh 를 이용한 rsync 및 스크립트 자동화

BAGE 2008. 4. 24. 17:17

 
 
 유닉스 계열에는 백업 또는 동기화로써 많이 사용되는 rsync 란 툴이 있다.
나 역시 rsync 를 백업 툴로써 사용한다. 그런차에 ssh 를 이용해 볼까 생각이 들었다.

우선 rsync를 간략히 설명하자면 서비스서버의 TCP/873 포트를 통해 특정 디렉토리의 데이터를
백업 서버의 로컬로 가져오며 2번째 실행부터는 업데이트된 내용만 가져올수 있다 그러니 백업에 대한 트래픽을
상당히 절약할 뿐 아니라 백업에 대한 서버의 부하도 줄일수 있다
다만 서비스 서버에 중요파일을 지워지거나 수정되었고 백업서버에서 rsync 를 통해 백업을 했다면
백업서버를 통해 복구할수 없는 경우가 대부분이다.
이는 rsync 가 백업툴이 아니라 동기화 툴이기 때문이다.
이런 개념을 잘 생각하고 백업툴로써 사용할것인지 아닐것인지는 사용자의 몫으로 남겨놓겠다.

일반적으로 rsync는 서비스 서버에서 xinetd 에 종속되어 실행되며 TCP/873 포트를 통해 접속한다.
그리고 tcpwrapper 등으로 접속 IP를 제어한다. 여기서 설명하고자 하는건 일반적인 rsync 를 이용하는게
아니니 일반적인 rsync를 설치하려면 다른 문서들을 참조하기 바란다.

다음은 그 설치 방법이다 환경이 다르면 약간의 차이가 있을수 있으나 조금만 노력하면 설치할수 있으리라
생각된다.

[테스트 설치 환경]
서비스서버 : CentOS 5
백업서버 : Redhat 7.3

우선 백업서버에 rsync가 설치되어 있어야 한다.
rsync 가 없다면 yum 을 이용해 설치해 보자.
# yum install rsync
혹시 redhat 7.3을 이용하는 사람이 있어 yum 이 설치되지 않았거나 yum repository 를 찾지 못하는 분들을
위해 rpm 화일을 하단에 첨부하니 다운받아서 설치하길 바란다.

rsync 가 설치되었다면 rsync 명령어를 이용해보자.
일반적인 rsync 와 ssh 를 통한 rsync 가 다른점이 이제 나타난다.
일반적인 rsync 는 서비스서버쪽에 xinetd를 통해 TCP/873 포트로 LISTEN 하는 데몬을 띄운다.
하지만 ssh를 이용한 건 서비스 서버쪽에 rsync 데몬이 필요없다.

# rsync -avz --delete -e 서비스서버도메인또는IP:/백업대상폴더 /백업을넣을폴더
# rsync -avz --delete --rsh="ssh -l 서비스서버계정" 서비스서버도메인또는IP:/백업대상폴더 /백업을넣을폴더

위 2명령어의 차이는 첫번째는 현재 백업서버의 계정이름으로 똑같이 서버에 접근한다는 것이다.
즉 root 권한이면 서비스서버에 root 권으로 접근하고 일반계정이면 서비스서버의 일반계정으로 접근을한다는
것이다. 그래서 불편한 점이 있고 게다가 root 권한이면 서비스서버에 root 로 접속해야 하니..
ssh에서 root 로그인을 풀어야 한다.

그래서 개인적으로는 두번째 명령어를 이용한다.
현재 백업계정에서 root 로 작업하는 상태라고 할때도 서비스 서버의 일반계정을 지정할수가 있기 때문이다.
물론 여기에도 단점은 있다. 서비스서버에 일반계정이 접근할수없는 화일을 가져올수 없는 문제가 발생한다.
예를들면 root 만 접근 가능한 화일들 또는 아파치만 접근가능한 파일들 업로드 되어 nobody 만 읽을수 있는
화일들이 그 대상이다. 그러니 웹 디렉토리를 백업하려거든 권한에 주의 해주어야 한다.
예를 들면 아파치가 nobody 권한으로 실행된다면 웹에서 화일을 upload 한뒤 최소한 704 가 되도록한다.

그럼 다시 돌아가서 위의 명령어중 2번째 명령어를 실행시키자.
그럼 처음 ssh 접속시에 나오는 key 값을 받아오며 저장하겠냐고 물어본다.
yes 하고 나면 password 를 물어온다.
위에서 지정한 서비스 서버 계정의 패스워드를 입력하자.
그럼 데이터를 받아오기 시작할것이다.

여기서 걸리는게 있다. 백업을 매일 수작업으로 하기 싫다는것이다.
대부분의 사람들이 여기서 멈추고 일반적인 rsync 로 돌아가는것 같다.
그래서 스크립트를 하나 짜서 돌리기로 하자.
==================================================================================================
#!/usr/bin/expect
spawn bash -c "rsync -az --delete --rsh="ssh -l 서비스서버계정" 서비스서버도메인또는IP:/백업대상폴더 /백업을넣을폴더";
expect -re "Password:"
sleep 0.2
send "서비스서버계정패스워드\r"
interact
==================================================================================================
위의 내용을 backup.sh 와같이 화일로 만든후 권한을 700 권한을 주자..
그리고 /etc/crond.daily 같은 폴더에 넣어둔다.

그럼 매일 업데이트된 내용이 백업이 될것이다.

[참고]
Redhat 7.3 에서 하다보니 없는 프로그램이 꽤 있었다.
게다가 최근까지 서비스하던 yum repository 도 잘 안보인다.
그래서 나와같이 고생하는 Redhat 7.3 User를 위해 관련된 화일을 업로드 해둔다.

expect-5.32.2-67.i386.rpm : http://ideaargo.devself.com/blog/attachment/1064738108.rpm
rsync-2.5.4-2.i386.rpm : http://ideaargo.devself.com/blog/attachment/1326425661.rpm
tk-8.3.3-67.i386.rpm : http://ideaargo.devself.com/blog/attachment/1264166103.rpm 


[

#!/usr/bin/expect -> #! : 실행하겠다.

spawn bash -c "rsync -az --delete --rsh="ssh -l 서비스서버계정" 서비스서버도메인또는IP:/백업대상폴더 /백업을넣을폴더";

expect -re "Password:"

sleep 0.2 ->기다리는 시간 0.2초

send "서비스서버계정패스워드\r" : \r->return

interact  ]
[출처] [서버운영] ssh 를 이용한 rsync 및 스크립트 |작성자 민경훈