2023/06/19(月) [n年前の日記]
#1 [python] PythonでFTP関係を処理したい
Python 3.10.10 で、FTP関係の処理をしたい。環境は Windows10 x64 22H2。
◎ Pythonで簡易FTPサーバを立てる :
Pythonを使って簡易FTPサーバを立てたい。pyftpdlib を使えばできるらしい。pip でインストール。
_1_ftpserver.py
python 1_ftpserver.py を実行すると、FTPサーバのIPアドレスは 127.0.0.1、ユーザ名は user、パスワードは password でFTP接続を受け付けるようになる。
pip install pyftpdlib
_1_ftpserver.py
import pyftpdlib.authorizers import pyftpdlib.handlers import pyftpdlib.servers wwwdir = "D:\\home\\prg\\python\\_test_sample\\ftp\\www" # 認証ユーザーを作る authorizer = pyftpdlib.authorizers.DummyAuthorizer() authorizer.add_user('user', 'password', wwwdir, perm='elradfmw') # 個々の接続を管理するハンドラーを作る handler = pyftpdlib.handlers.FTPHandler handler.authorizer = authorizer # FTPサーバーを立ち上げる server = pyftpdlib.servers.FTPServer(("127.0.0.1", 21), handler) server.serve_forever()
python 1_ftpserver.py を実行すると、FTPサーバのIPアドレスは 127.0.0.1、ユーザ名は user、パスワードは password でFTP接続を受け付けるようになる。
◎ PythonでFTPクライアント処理を行う :
Pythonを使って、FTPサーバに接続してファイルをアップロードしたい。ftplibを使えばできるらしい。このモジュールはおそらく標準で入ってる。たぶん。
_2_ftpclient.py
_b.png
_index.html.txt
python 2_ftpclient.py を実行すると、127.0.0.1 に、ユーザ名:user、パスワード:password でFTP接続して、ファイルを2つほどアップロードして終了する。
拡張子の種類によって、アスキーモードで転送するか、バイナリモードで転送するかの処理を分けている。
_2_ftpclient.py
import os import ftplib IP_ADDRESS = "127.0.0.1" USER = "user" PASSWORD = "password" files = [ ["D:\\home\\prg\\python\\_test_sample\\ftp\\src\\index.html", "/public_html/2_natsu"], ["D:\\home\\prg\\python\\_test_sample\\ftp\\src\\b.png", "/public_html/2_natsu"], ] asciimode_ext = ["html", "htm", "css", "cgi", "pl", "py", "rb", "php", "js"] try: ftp = ftplib.FTP(IP_ADDRESS) ftp.set_pasv('true') ftp.login(USER, PASSWORD) print("# FTP login (%s@%s)" % (USER, IP_ADDRESS)) print(ftp.getwelcome()) # get file list print(ftp.nlst(".")) print(ftp.nlst("./public_html")) for d in files: src, dst = d if not os.path.isfile(src): print("Error : Not found %s" % src) continue ftp.cwd(dst) fn = os.path.basename(src) ext = os.path.splitext(src)[1][1:] if ext in asciimode_ext: print("Upload (Ascii) %s -> %s/%s" % (src, dst, fn)) # ftp.voidcmd('TYPE A') with open(src, "rb") as f: ftp.storlines("STOR %s" % fn, f) else: print("Upload (Binary) %s -> %s/%s" % (src, dst, fn)) # ftp.voidcmd('TYPE I') with open(src, "rb") as f: ftp.storbinary("STOR %s" % fn, f) ftp.quit() # ftp.close() print("# FTP close.") except ftplib.all_errors as e: print('FTP Error :', e)
_b.png
_index.html.txt
python 2_ftpclient.py を実行すると、127.0.0.1 に、ユーザ名:user、パスワード:password でFTP接続して、ファイルを2つほどアップロードして終了する。
拡張子の種類によって、アスキーモードで転送するか、バイナリモードで転送するかの処理を分けている。
◎ 余談。WindowsのFTPツールを使って自動でアップロード :
Windows10 には標準で ftp.exe が入ってる。一般的には ftp.exe を実行して、コマンドを一つ一つ打ち込んで ―― という使い方が説明されてることが多いけれど、テキストファイルに一連のコマンドを列挙しておいて、そのテキストファイルを渡せば、一括で処理することができる。
以下は、前述の Pythonスクリプトでやっていたことを、ftpのコマンドで列挙した事例。
_ftp_cmd_list.txt
ftp -s:ファイル名、で実行。
以下は、前述の Pythonスクリプトでやっていたことを、ftpのコマンドで列挙した事例。
_ftp_cmd_list.txt
open 127.0.0.1 user password cd /public_html/2_natsu lcd src ascii put index.html binary put b.png quit
ftp -s:ファイル名、で実行。
ftp -s:ftp_cmd_list.txt
◎ 余談その2。アスキーモードについて :
ftp転送する際は、アスキーモードとバイナリモードの2つがあって、アスキーモードで転送すると改行コードが変化したりするのだけど…。今回、前述の Pythonスクリプトで動作確認してみたら、Windows10 + Pythonで立てた簡易FTPサーバに対してFTPでアップロードした場合、改行コードが変化しなくて悩んでしまった。Windows上で動かしてるから改行コードが変わらない状態が正解なのか、それとも簡易FTPサーバだからそこまで対応していないだけなのか…。
Ubuntu Linux 22.04 LTS がインストールされてるサブPCに、FTPサーバ vsftpd をインストールして動作確認してみたところ、前述の Pythonスクリプトでファイルをアップロードした場合でも、ちゃんと改行コードが変化してることが確認できた。とメモ。
Ubuntu Linux 22.04 LTS がインストールされてるサブPCに、FTPサーバ vsftpd をインストールして動作確認してみたところ、前述の Pythonスクリプトでファイルをアップロードした場合でも、ちゃんと改行コードが変化してることが確認できた。とメモ。
◎ 参考ページ :
_すぐ作ってすぐ壊せるFTPサーバーを立てる (Pythonで) - Qiita
_ftplibでFTPサーバをPythonで作る
_GitHub - giampaolo/pyftpdlib: Extremely fast and scalable Python FTP server library
_Tutorial - pyftpdlib 1.5.4 documentation
_ftplib --- FTPプロトコルクライアント - Python 3.11.4 ドキュメント
_PythonでFTPを使う方法 - Qiita
_[Python] PythonからFTPを実行する - YoheiM .NET
_Python ftplibでFTPサーバからダウンロード - fukuの犬小屋
_PythonでFTPクライアントを作成する
_python - FTP Upload--ASCII mode--a bytes-like object is required, not 'str' - Stack Overflow
_Windowsのftpコマンドをスクリプトで使う:Tech TIPS - @IT
_UbuntuでFTPサーバーを設定する
_UbuntuでFTPを使えるようにする | ばったんの技術系ブログ
_Ubuntu 20.04.4 LTS にFTPサーバを構築 - Qiita
_Ubuntu 22.04 LTS : Vsftpd : インストール : Server World
_【備忘録】vsftpdで”OOPS: vsftpd: refusing to run with writable root inside chroot()”が出た時の対処法 - 株式会社シーポイントラボ
_Linuxでテキストファイルの改行コードを調べる方法: 小粋空間
_ftplibでFTPサーバをPythonで作る
_GitHub - giampaolo/pyftpdlib: Extremely fast and scalable Python FTP server library
_Tutorial - pyftpdlib 1.5.4 documentation
_ftplib --- FTPプロトコルクライアント - Python 3.11.4 ドキュメント
_PythonでFTPを使う方法 - Qiita
_[Python] PythonからFTPを実行する - YoheiM .NET
_Python ftplibでFTPサーバからダウンロード - fukuの犬小屋
_PythonでFTPクライアントを作成する
_python - FTP Upload--ASCII mode--a bytes-like object is required, not 'str' - Stack Overflow
_Windowsのftpコマンドをスクリプトで使う:Tech TIPS - @IT
_UbuntuでFTPサーバーを設定する
_UbuntuでFTPを使えるようにする | ばったんの技術系ブログ
_Ubuntu 20.04.4 LTS にFTPサーバを構築 - Qiita
_Ubuntu 22.04 LTS : Vsftpd : インストール : Server World
_【備忘録】vsftpdで”OOPS: vsftpd: refusing to run with writable root inside chroot()”が出た時の対処法 - 株式会社シーポイントラボ
_Linuxでテキストファイルの改行コードを調べる方法: 小粋空間
[ ツッコむ ]
以上、1 日分です。