bash script2023. 6. 20. 17:11

 

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

 

이전에 작성했던 리눅스 다중 사용자 환경에서의 expect 스크립트 관련 문제에 대한 해결책이다. ssh, rsync 등 원격접속이 포함된 작업을 자동화할 때 생기는 보안 문제이며, 이에 대한 자세한 내용은 이전 게시물을 참고하자. 여기로

 

기본적인 접근 방식은 사용자로부터 암호를 입력 받아서 이것을 임시 파일에 저장한 후, expect 스크립트에서 이 임시 파일을 조회하여 사용하도록 하는 것이다. 말로 설명하면 복잡하니 예시를 보는 편이 더 빠르겠다. 이전 게시물에서 사용한 auto_rsync.exp 스크립트를 가지고 생각해 보자. 일단 expect 스크립트 실행은 아래와 같은 형태다.

 

expect -f auto_rsync.exp [source_dir] [remote_host] [remote_dir] [password]

여기서 마지막 인자 [password] 부분을 아래와 같이 바꿔보자는 것이다.

expect -f auto_rsync.exp [source_dir] [remote_host] [remote_dir] temp_file.txt

위와 같이 하면 프로세스 목록에 접속암호가 드러나지 않을 것이다. 또한 임시 파일(위의 예시에서 temp_file.txt)의 접근권한을 제대로 설정하면 다른 사용자는 접속암호가 저장된 임시 파일을 열람할 수 없다. 아래의 예시 스크립트를 보자. 접속암호를 입력받은 후에 auto_rsync.exp를 실행하기 위한 스크립트다.

# auto_rsync.exp를 실행하기 위한 스트립트
src_dir="/home/john/documents"
remote_host="john@192.168.0.10"
remote_dir="/home/john/backup_dir"
# 암호 입력 받기
echo "john@192.168.0.10의 접속암호를 입력해 주세요."
read password
# 임시 파일 생성 ($$: 프로세스 식별자, PID)
touch temp_$$.txt
# 접근권한 설정(사용자 본인만 접근 가능)
chmod 600 temp_$$.txt
# 접속암호 저장
echo "$password" > temp_$$.txt
# expect 스크립트 auto_rsync.exp 실행
expect -f auto_rsync.exp "$src_dir" "$remote_host" "$remote_dir" temp_$$.txt
# 임시 파일 제거
rm temp_$$.txt

임시 파일 생성은 touch와 chmod의 조합 대신에 mktemp 명령을 활용해도 편리하다. mktemp에 대한 내용은 이전 게시물을 참고하자. 여기로

 

자, 그러면 auto_rsync.exp 스크립트의 내용은 어떻게 바꿔야 할까? 우선 이전 게시물에 있었던 내용을 잠깐 보자. 접속암호에 해당되는 변수인 password의 값을 인자(argument)로부터 할당했다.

# 이전 게시물에 있던 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]
...

위의 예시에서 password 변수의 값을 인자가 아니라 파일로부터 받아야 하므로, 임시 파일 이름을 인자로 받은 후 해당 파일을 열어서 그 내용을 password 변수에 할당하면 된다. 즉, 아래와 같이 고쳐야 할 것이다.

set src_dir [lindex $argv 0]
set remote_host [lindex $argv 1]
set dst_dir [lindex $argv 2]
# 임시 파일 이름을 인자로 받아 temp_filename 변수에 할당
set temp_filename [lindex $argv 3]
# 파일 열기
set file_open [open $tmp_filename]
# 파일 내용을 읽어서 password 변수에 할당
set password [read $file_open]
...

다중 사용자 환경에서 자동접속을 통한 작업을 하려면 좀 불편하더라도 위와 같은 형태로 스크립트를 만들어야 한다.

 

728x90
Posted by 반달가면