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
$ 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
ユーザ名はなんでもいいです
$ sudo adduser ユーザ名
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
ユーザ名
$ 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.'
>>> ftp.cwd("/var/www/ディレクトリ名")
送りたいファイルをバイナリ形式で開きます(変数名はなんでもいいです)
>>> f = open("送りたいファイル", "rb")
>>> ftp.storbinary("STOR 送り先に保存するファイル名", f)
226 Transfer complete.が表示されればok.
- その他
これ以外の送受信も基本的にはftplibと同様のことができます.~~書くのが面倒になった~~
やることをやったらftp.quit()かftp.close()で終了しましょう.
ftpは一定時間が経過するとタイムアウトするので注意が必要です.