FTPとは

FTPはファイル転送プロトコル(File Transfer Protocol)のことです. FTPサーバにファイルを送ったりサーバから受け取ったりできます.

必要なの?

自身のPCであればWebREPLを通じてファイルのやりとりが可能ですが,研究室に建てたサーバだと意外と面倒です. 通常のPythonであればftplibライブラリがありますが,MicroPythonにはそんなものはありません.~~Fuck~~ ネットワークの速度を計測するためにも役立ちます.

MicroPython用のFTPライブラリ

作ってくれた人がいました.神 それがこちら.(神様はこの方) これがあればあとはサーバ側を準備すればok.ありがたや~

Ubuntuにvsftpdをインストール

これを参考にしました. 自分はUbuntu18.04LTSを使ってますが,別にバージョンに依存してるわけではなさそう(?)なのでそれ以降のバージョンでも多分大丈夫です.(~~責任は取りません~~) - まずはおなじみのあれ(アップデート)

$ sudo apt update
- インストール
$ sudo apt install vsftpd
- 設定ファイル(/etc/vsftpd.conf)を変更
$ sudo vim /etc/vsftpd.conf
#ファイルシステムを変更するFTPコマンドを許可する(コメントを外す)
write_enable=YES

#デフォルトのファイルマスク設定を変更し他ユーザからのリードを許可(コメントを外す)
local_umask=022

#アスキーモードのアップロードを許可する(コメントを外す)
ascii_upload_enable=YES
#アスキーモードのダウンロードを許可する(コメントを外す)
ascii_download_enable=YES

#設定したディレクトリより上層への移動を禁止する(コメントを外す)
chroot_local_user=YES
#YESの場合、リストアップされたユーザはchrootの対象から除外される(コメントを外す)
chroot_list_enable=YES
#リストアップのファイルの場所を指定する(コメントを外す)
chroot_list_file=/etc/vsftpd.chroot_list

#サブフォルダを含む一括アップロード・ダウンロードを出来るようにする(コメントを外す)
ls_recurse_enable=YES

#ルートディレクトリを指定する(最後に追加)
local_root=/var/www

#seccomp filter をオフを追記する(最後に追加)
seccomp_sandbox=NO
- FTP用のユーザを追加

ユーザ名はなんでもいいです

$ sudo adduser ユーザ名
するとこんな画面になるのでログイン用のパスワードを入力します 下の方にフルネームやら部屋番号やらが出てきますが特に設定する必要はないのでEnterキーでスキップ(登録したければどうぞご自由に)
Adding user `user_name' ...
Adding new group `user_name' (1003) ...
Adding new user `user_name' (1003) with group `user_name' ...
Creating home directory `/home/user_name' ...
Copying files from `/etc/skel' ...
Enter new UNIX password:  # パスワード入力
Retype new UNIX password: # パスワード入力(確認)
passwd: password updated successfully
Changing the user information for user_name
Enter the new value, or press ENTER for the default
        Full Name []:    # Enter
        Room Number []: 
        Work Phone []: 
        Home Phone []: 
        Other []: 
Is the information correct? [Y/n] Y  # Yes
※追記 小山さんからコメントをいただきました 以下の操作を行うことを推奨します.

セキュリティの観点でいうと,adduserで追加するFTP用ユーザにはシェルを無効化すると良いです.

例えば,hogeユーザのシェルを無効にするには以下が使えます. sudo usermod -s /sbin/nologin hoge

そうしたら下記のファイルにユーザ名を入力してアクセスを許可

$ sudo nano /etc/vsftpd.chroot_list
ユーザ名
- 公開用ディレクトリを作って権限を追加 公開用のディレクトリを/var/www/の配下に作ってグループに書き込み権限を追加
$ cd /var/www
$ sudo mkdir ディレクトリ名
$ sudo chgrp ユーザ名 ディレクトリ名
$ sudo chmod 775 ディレクトリ名
- サービスを再起動
$ sudo systemctl vsftpd restart
- ポートが開いているか確認(無かったら設定ファイルをミスってる可能性大)
$ nmap サーバのIPアドレス
・・・
PORT    STATE  SERVICE
・・・
21/tcp  open   ftp
・・・

いざ,ESP32でFTP

  • ftplibを使えるようにする

ftplib.pyをesp32に書き込みます(あるいはWebREPLで送ります) そうしたらFTPをインポートしてください

>>> from ftplib import FTP
- 準備ができたので接続する

ユーザ名とパスワードはさきほど設定したものです

>>> ftp = FTP("サーバのIPアドレス")
>>> ftp.login("ユーザ名", "パスワード")
ログインに成功すると以下が表示されます
'230 Login successful.'
作業ディレクトリを作成したディレクトリ(権限を追加したディレクトリ)に変更(相対パスでもok) ※ftp.dir()でディレクトリの確認が可能
>>> ftp.cwd("/var/www/ディレクトリ名")
- ファイルを送る

送りたいファイルをバイナリ形式で開きます(変数名はなんでもいいです)

>>> f = open("送りたいファイル", "rb")
STORコマンドでファイルを送ります
>>> ftp.storbinary("STOR 送り先に保存するファイル名", f)
226 Transfer complete.が表示されればok. - その他 これ以外の送受信も基本的にはftplibと同様のことができます.~~書くのが面倒になった~~ やることをやったらftp.quit()ftp.close()で終了しましょう. ftpは一定時間が経過するとタイムアウトするので注意が必要です.