반달가면 이글루에서 백업 - 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]
...
다중 사용자 환경에서 자동접속을 통한 작업을 하려면 좀 불편하더라도 위와 같은 형태로 스크립트를 만들어야 한다.
'bash script' 카테고리의 다른 글
[bash: date] 타임스탬프(timestamp)를 일반적인 표시 형식으로 변환 (0) | 2023.06.28 |
---|---|
[bash: if, case] 문자열 비교 조건에 정규표현식 사용 (0) | 2023.06.28 |
[bash: expect] 리눅스 다중 사용자(multi-user) 환경에서의 작업 자동화 문제 (0) | 2023.06.20 |
[bash: expect] rsync 자동 원격 백업 (0) | 2023.05.03 |
[bash: grep, awk] 특정 문자열을 제외한 나머지 출력하기 (0) | 2023.04.18 |