bash script2023. 7. 11. 17:09

 

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

 

curl을 이용한 ftp 자동접속 방법이다. "<<" 기호를 사용하는 방법도 있지만, 스크립트에서 if 조건문을 조합해야 하는 경우 등 상황이나 필요에 따라 curl이 유용할 할 수가 있으므로 정리해 두기로.

 

만약 curl이 설치되어 있지 않다면 먼저 설치부터 하자. 터미널창에서 아래와 같이 입력(우분투/데비안 기준)

# curl 패키지 설치
sudo apt-get install curl

먼저 ftp 접속을 살펴보자. 서버 주소는 ftp.myserver.com, 사용자 계정은 ftp_user, 암호는 ftp_pw라고 가정한다.

# ftp 접속

curl ftp://ftp.myserver.com --user ftp_user:ftp_pw

 

위와 같이 입력하면 ftp 서버에 접속한 후, 시작 디렉토리의 내용을 가져와서 출력해 준다. 수동으로 ftp에 접속한 후에 ls 명령을 입력한 결과와 동일하다. 보안 측면에서 명령어 인자에 암호를 넣는 것이 문제가 될 수 있는 상황이면 암호를 생략하자. 그러면 명령어 입력 후에 암호를 입력하라는 메세지가 나오고 여기서 암호를 직접 입력할 수 있다.

# ftp 접속, 암호는 키보드로 입력
curl ftp://ftp.myserver.com --user ftp_user

특정 디렉토리에 있는 내용을 보고 싶을 경우에는 해당 디렉토리를 지정하면 된다. 예를 들어 /my_dir/documents/ 디렉토리의 내용을 보고 싶다고 가정해 보자.

# ftp 접속, /my_dir/documents/ 디렉토리 안에 있는 내용 확인
curl ftp://ftp.myserver.com/my_dir/documents/ --user ftp_user

디렉토리 명칭이 반드시 "/" 기호로 끝나야 한다는 점에 유의하자. 맨 뒤에 "/" 기호가 없으면 해당 문자열을 디렉토리가 아니라 파일로 간주하기 때문이다.

특정 디렉토리 안에 특정 파일이 있는지 확인하고 싶다면 grep 명령을 조합하면 되겠다.

# /my_dir/documents/ 디렉토리에서 my_memo.doc 파일 존재 확인
curl ftp://ftp.myserver.com/my_dir/documents/ --user ftp_user | grep "my_memo\.doc"

파일 다운로드는 url값에 파일을 포함시키고 -o 옵션으로 저장하면 된다. /my_dir/documents/ 디렉토리에 있는 my_memo.doc 파일을 다운로드한다면 아래와 같이 입력하면 된다.

# /my_dir/documents/my_memo.doc 파일 다운로드해서 ~/my_memo.downloaded.doc 파일로 저장
curl ftp://ftp.myserver.com/my_dir/documents/my_memo.doc --user ftp_user -o ~/my_memo.downloaded.doc

파일 업로드는 -T 옵션을 사용한다. 아래의 예시를 보자.

# /my_dir/documents/ 디렉토리에 ~/my_new_memo.doc 파일 업로드
curl ftp://ftp.myserver.com/my_dir/documents/ --user ftp_user -T ~/my_new_memo.doc

파일 삭제는 조금 복잡하다. -X 옵션을 이용하여 ftp 메세지를 직접 전달해야 한다. 파일 삭제를 위한 명령은 "DELE"이므로 아래의 예시와 같은 형태가 될 것이다. 삭제에 성공했다면 응답코드 250을 받게 된다.

# /my_dir/documents/ 디렉토리에 있는 my_new_memo.doc 파일 삭제
curl ftp://ftp.myserver.com/my_dir/documents/ --user ftp_user -X "DELE my_new_memo.doc"
RETR response: 250

디렉토리 생성과 삭제 역시 -X 옵션을 사용하면 된다. 디렉토리 생성은 "MKD", 삭제는 "RMD" 명령을 사용한다. 디렉토리 생성(MKD)이 성공했다면 응답코드 257, 삭제(RMD)에 성공했다면 응답코드 250을 받게 된다.

# /my_dir/documents/ 디렉토리 하위에 "test" 디렉토리 생성
curl ftp://ftp.myserver.com/my_dir/documents/ --user ftp_user -X "MKD test"
RETR response: 257

# /my_dir/documents/ 디렉토리 하위에 "test" 디렉토리 삭제
curl ftp://ftp.myserver.com/my_dir/documents/ --user ftp_uesr -X "RMD test"
RETR response: 250

위의 내용을 bash 스크립트에서 응용해 볼 수 있다. 예를 들어 /my_dir/ 디렉토리 하위에 "my_test"라는 디렉토리가 있는지 확인하고, 만약 없다면 새로 만든 후에 이 위치에 data.doc 파일을 업로드하는 것이다. 아래와 같이 스크립트를 만들어 볼 수 있다. 편리하긴 하지만 접속 암호가 인자로 들어가야 하므로 반드시 보안 측면에서 문제가 없는 상황에서만 사용하자.

# 사용자 계정 및 암호를 입력 받아 변수 user, password에 할당
echo "사용자 계정을 입력하세요"
read user
echo "암호를 입력하세요"
read password
# /my_dir/ 하위에 my_test 디렉토리 존재 여부 확인
dir_test=`curl ftp://ftp.myserver.com/my_dir/ --user "$user:$password" | grep "^d" | grep "my_test" | wc -l`
if [[ $dir_test -eq 0 ]]
  then echo "my_test 디렉토리가 없으므로 새로 만듭니다."
    curl ftp://ftp.myserver.com/my_dir/ --user "$user:$password" -X "MKD my_test"
fi
# data.doc 파일 업로드
curl ftp://ftp.myserver.com/my_dir/my_test/ --user "$user:$password" -T data.doc

만약 curl을 사용할 때 전송상태 표시 등 화면 출력 메시지를 제거하고 싶으면 -s(silent) 옵션을 추가하면 된다.

# curl 자체 화면 출력 메시지 제거, ftp 접속에 의한 결과만 출력 (-s 옵션)
curl ftp://ftp.myserver.com --user ftp_user -s

 

728x90
Posted by 반달가면