Python FTP 활용하기

Python 2020. 8. 8. 09:27

Python에서는 간단한 방법으로 FTP에 접속해서 데이터를 다운로드 받고 혹은 업로드 할 수 있습니다.

 

바로,

ftplib 라는 라이브러리를 활용하는 방법 입니다.

 

ftplib 사용법

import ftplib

ftp = ftplib.FTP()
ftp.connect(host='ftp ip address', port=21)
ftp.login(user='user_id', passwd='user_pw')


# Download 받을 파일을 wb(write binary) mode 로 열어줍니다.
download_file = open('file.dat', 'wb')


# RETR은 FTP 명령어로 다운로드 받기 위한 명령어입니다.
ftp.retrbinary('RETR /file_path', download_file)


# Download가 완료되면 파일을 닫습니다.
download_file.close()


# Upload 받을 파일을 rb(read binary) mode 로 열어줍니다.
upload_file = open('file.dat', 'rb')


# STOR은 FTP 명령어로 업로드 하기 위한 명령어입니다.
ftp.storbinary('STOR /file_path', upload_file)


# Upload가 완료되면 파일을 닫습니다.
upload_file.close()

위와 같이 간단하게 FTP에 접속하여 파일을 다운로드 받거나 업로드 하는 기능을 구현할 수 있습니다!

 

 

FTP login 상황에서 id와 pw가 정확하지만 로그인이 안된다면,

FTP 서버 측에서 설정을 확인해 보시기 바랍니다.

 

ftp.retrbinary 혹은 ftp.storbinary가 550 fail error가 발생할 경우 FTP에 접속하는 계정이 경로를 접근하는데 문제가 있을 수 있습니다. FTP 서버에서 경로 접근 권한에 대한 부분을 확인해 주세요.

 

Python에서 FTP로 접속하고, 파일 다운로드 및 업로드하는 기능을 구현하는 건 매우 쉽습니다.

다소 어려운 문제는 사실 FTP 서버를 구축하는 일이라고 생각됩니다.

 

https://energycastle.tistory.com/4

 

Linux(Ubuntu) FTP server 구축하기

Ubuntu 18.04 버전을 중심으로 작성한 문서입니다. 처음으로 FTP 서버를 구축해보면서 몇가지 시행착오를 겪으며 최종 정리를 하겠습니다. 우선 vsftpd를 이용하면 간단하게 FTP 환경을 구성하고 설정

energycastle.tistory.com

Ubuntu에서 FTP 서버를 구축하는 법에 대해서는 제가 간단하게 정리해놓은 글이 있습니다.

해당 글을 보면서 차근차근 해보시면 어렵지 않게 FTP 서버를 만들고 Python으로 파일을 주고 받을 수 있을 것 입니다.

'Python' 카테고리의 다른 글

[Python] ffmpeg 커맨드창 실행 안되게 하는 방법  (0) 2020.10.26
Python 파일 실행 옵션 만들기  (0) 2020.08.18
Posted by EnergyCastle
,

Ubuntu 18.04 버전을 중심으로 작성한 문서입니다.

 

처음으로 FTP 서버를 구축해보면서 몇가지 시행착오를 겪으며 최종 정리를 하겠습니다.

 

우선 vsftpd를 이용하면 간단하게 FTP 환경을 구성하고 설정 할 수 있습니다.

전체적으로 간략하게 필요한 명령어 및 구성은 아래와 같습니다.

vsftpd 설정 가이드

sudo apt install vsftpd


sudo nano /etc/vsftpd.conf

    listen=YES
    local_enable=YES
    write_enable=YES
    local_umask=022
    connect_from_port_20=YES
    chroot_local_user=YES
    chroot_list_enable=YES
    chroot_list_file=/etc/vsftpd.chroot_list
    utf8_filesystem=YES
    pasv_enable=YES
    pasv_min_port=50000
    pasv_max_port=51000

ctrl+x >> y >> enter (편집한 내용 저장)

sudo nano /etc/vsftpd.chroot_list

    user_id 추가

ctrl+x >> y >> enter (편집한 내용 저장)

sudo nano ftpusers

    root >> #root

    (root를 주석처리 함으로 ftp에 root계정 접근 허용)

ctrl+x >> y >> enter (편집한 내용 저장)

ufw allow 21/tcp

ufw allow 50000:51000/tcp


ufw reload

 

위 순서로 진행하면 21번 포트로 FTP 접속이 허용됩니다.

WinSCP나 파일질라등을 통해서 FTP 접속이 원활하게 이루어지는지 확인해 보십시오.

 

그러면 각 명령어마다 간단한 설명을 붙여보겠습니다.

 

sudo apt install vsftpd
vsftpd를 설치합니다.
sudo nano /etc/vsftpd.conf
vsftpd의 설정을 편집하는 작업입니다.
저는 간단하게 nano 편집기를 사용했지만, vim이나 다른 기타 편집기로 편집하셔도 무방합니다.
listen=YES ipv4로 들어오는 요청을 수락합니다.
local_enable=YES 로컬 계정 사용자의 접속을 승인합니다.
write_enable=YES 사용자가 파일을 쓸 수 있습니다.
FTP에 파일을 업로드 하기 위해서 필요합니다.
local_umask=022 로컬 계정 사용자가 생성한 파일에 대한 권한 설정 부분입니다.
connect_from_port_20=YES 20번 포트로도 접속을 허용하겠다는 의미입니다.
chroot_local_user=YES 로컬유저가 root경로로 접근하는 것을 허용합니다.
특정 프로그램 실행을 통해 자동으로 로그나 데이터를 업로드하는 경우,
허용해주는 것이 편리합니다.
chroot_list_enable=YES
chroot를 할 수 있는 유저 목록을 관리합니다.
chroot_list_file=/etc/vsftpd.chroot_list /etc 경로 아래에 vsftpd.chroot_list라는 파일이 없다면,
그냥 해당 경로에 직접 파일을 생성하고 원하는 계정명을 입력하면 됩니다.
utf8_filesystem=YES utf8 인코딩을 사용합니다.
pasv_enable=YES FTP는 Active mode와 Passive mode가 존재하는데, passive mode도 사용한다는 의미입니다.
python의 ftplib를 이용해서 파일을 업로드 시킬때 passive mode가 꺼져있으면 접속이 안되어서, passive mode를 enable하고, 해당 포트도 방화벽에서 같이 열어두어야 합니다.
pasv_min_port=50000 passive mode로 접근할 포트 하한 범위
pasv_max_port=51000 passive mode로 접근할 포트 상한 범위
sudo nano /etc/vsftpd.chroot_list
위에서 chroot_list를 사용하기로 했다면, 해당 파일에 사용자 계정명을 입력해주어야 합니다.
sudo nano ftpusers
vsftpd.conf 파일의 설정에 따라서 ftpusers의 내용이 정반대가 될 수 있음을 주의하셔야 합니다!
기본 설정에서는 ftpusers 내부에 있는 계정명은 접근이 불가합니다.
root 계정을 이용해서 FTP에 접근하고 싶다면, root 앞에 #을 붙여 주석처리하고 저장하시면 됩니다.
ufw allow 21/tcp
ufw allow 50000:51000/tcp

ufw reload
ubuntu 18.04(아마도 16.04버전 부터)는 ufw를 이용해서 간단하게 방화벽 설정을 바꿀 수 있습니다.
해당 커맨드들을 통해 21번, 50000~51000(passive 연결)을 허용하고, 방화벽을 다시 읽어와서 바로 적용 할 수 있습니다.

 

저는 파이썬 코드를 이용해서 오디오 특징 추출을 진행하고,

그 결과를 FTP 서버에 업로드 하기 위해서 FTP 서버를 구축했습니다.

 

WinSCP로 접속이 잘되는데도 파이썬 코드를 실행하면 접속이 안되거나, 파일 업로드 및 다운로드가 안되어서 반나절을 고생했습니다.. ㅠㅠ

 

vsftpd를 이용하면 정말 쉽게 FTP 환경을 구축할 수 있습니다!

인터넷 검색 활용도 좋지만 우선 vsftpd.conf 파일 내부의 주석부터 꼼꼼히 읽어보는게 중요한 것 같습니다...

설명을 제대로 읽지도 않고 무작정 하라는대로 따라만했더니 문제가 생길때 어디서부터 손대야될지를 몰라 더 고생한 것 같습니다... 쉬워보이는 문제도 역시 그 원리를 알고 풀어야 진정 내 것이 되는 것 같습니다.

 

하지만, 저도 아직 초급 개발자로서 혹시 잘못된 내용이 있다면 댓글로 알려주시면 최대한 빠르게 읽고 수정하겠습니다.

 

그리고,

python을 이용해서 ftp를 활용하는 것에 대해서도 조만간 정리해서 올리도록 하겠습니다.

 

감사합니다!

'Linux' 카테고리의 다른 글

Windows와 Linux 에서 작성한 .sh 파일의 차이  (0) 2020.08.06
Posted by EnergyCastle
,

간단한 쉘 스크립트를 작성하면서 처음 접한 가장 큰 문제였습니다.

 

쉘 스크립트를 실행하면 그 안에서 python 프로그램을 실행시키도록 만들었는데,

어째서인지 argparse를 이용해 만들어둔 옵션들을 쉘 스크립트가 실행할 때 똑바로 인식하지 못하는 것입니다.

 

몇시간동안 대체 무엇을 잘못했는지 찾다가 의외로 해결책은 가까운 곳에 있었습니다.

 

https://www.snoopybox.co.kr/1613

 

윈도우에서 작성한 Shell 스크립트 리눅스에서 에러나는 경우

윈도우에서 메모장으로 작성한 Bash 스크립트 파일을 리눅스에 넣어 돌리면 오류가 발생합니다. 그 이유는 DOS와 UNIX 계열의 개행 방식이 서로 다르기 때문인데요, 눈에 보이지는 않지만 각 줄의 �

www.snoopybox.co.kr

윈도우에서는 문장 마지막에 커서를 문장 시작부분으로 옮기는 \r이 붙어있다는 사실을 처음 알았습니다.

 

결론부터 말하자면,

Windows -> Linux

sed -i -e 's/\r$//' file.sh

Linux -> Windows

sed -i -e 's/$/\r/' file.sh

 

위의 명령어를 통해서 .sh파일의 문장들을 간단하게 수정한 후 실행하면 정상적으로 작동하게 됩니다.

 

간략하게 설명해보자면,

  • sed 명령어의 경우 정규표현식을 이용해서 단순 반복작업을 간단하게 끝내버릴수 있는 명령어입니다.
  • $는 정규 표현식에서 문장의 끝을 의미하고, 따라서 \r$은 \r이 문장 끝에 등장한다는 의미가 됩니다.

sed의 옵션에 대해서는 잘 정리해 놓은 블로그 링크를 첨부합니다.

https://m.blog.naver.com/PostView.nhn?blogId=int_s&logNo=220483567708&proxyReferer=https:%2F%2Fwww.google.com%2F

 

01. sed 옵션 정리

- p 명령 : 출력 sed '/north/p' datafile -기본적으로 모든 줄을 출력하고, 패턴과 일치하는 줄을 한번 더...

blog.naver.com

 

'Linux' 카테고리의 다른 글

Linux(Ubuntu) FTP server 구축하기  (0) 2020.08.07
Posted by EnergyCastle
,