FTPコマンドの練習環境を作ってみた

2022.07.07

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

データアナリティクス事業本部の鈴木です。

FTPを使った通信の、FTPクライアントを使った実装を検証したいことがあり、便利なdockerイメージとFTPクライアントを使って、環境を構築してみました。

最初は特にFTPサーバーを構築するところが大変そうだなと悩んでいましたが、docker-pure-ftpdという便利なイメージが公開されていたのでとても簡単に検証環境を作ることができました。

準備

環境

以下の環境で検証しました。

  • macOS Monterey
  • LFTP Version 4.9.2

FTPサーバー

docker-pure-ftpdイメージを使いました。

Dockerfileなどは以下のGitHubレポジトリで公開されています。

docker-compose.ymlのサンプルもGitHubレポジトリにて公開されているので、参考にして以下のyamlファイルを作成しておきました。 今回はあくまでローカル上での練習用なので、通信の暗号化はしていないのでご注意ください。

docker-compose.yml

version: '3'

services:
  ftpd_server:
    image: stilliard/pure-ftpd
    container_name: pure-ftpd
    ports:
      - "21:21"
      - "30000-30009:30000-30009"
    
    # docker-compose.ymlがあるディレクトリに、コンテナとの共有ディレクトリを作る
    volumes: 
      - "./data:/home/username/"
      - "./passwd:/etc/pure-ftpd/passwd"

    environment:
      PUBLICHOST: "localhost"
      FTP_USER_NAME: username
      FTP_USER_PASS: mypass
      FTP_USER_HOME: /home/username

    restart: always

FTP_USER_NAME環境変数のユーザー名とFTP_USER_PASS環境変数のパスワードでユーザーが作成されます。このユーザーのホームはFTP_USER_HOME環境変数の場所になります。この場所はvolumesでdocker-compose.ymlがあるディレクトリのdataディレクトリと共有するように設定しました。

FTPクライアント

今回はLFTPを使いました。LFTPのGitHubレポジトリは以下になります。

macの場合はHomebrew Formulaeに記載があり、homebrewでインストールできることが分かったので、以下のコマンドでインストールしました。

brew install lftp

やってみる

コンテナを起動する

docker-compose.ymlがあるディレクトリでdocker-compose upを実行し、コンテナを起動します。

docker-compose up

FTP_USER_NAME環境変数で設定したユーザー名と、FTP_USER_PASS環境変数で設定したパスワードでログインできることを確認しました。

# lftp の起動
lftp 

# 以下はlftpのコマンド入力
lftp :~> open -u username ftp://localhost/
#パスワード: FTP_USER_PASS環境変数で設定したパスワード

ログインすると、ディレクトリはコンテナ側の、FTP_USER_HOME環境変数で設定した場所になっています。

起動すると、ホスト側に共有ディレクトリが作成され、以下のようになっています。

.
├── data
├── docker-compose.yml
└── passwd

ファイルを受け渡ししてみる

簡単にですが、ファイルを受け渡しができるか確認しておきます。

新しく別のコンソールを開き、適当なsample.txtというファイルをカレントディレクトリに作っておきます。

touch sample.txt

sample.txtと同じディレクトリでlftpでログインし、putコマンドでファイルを送ってみます。

# ファイルの転送
lftp username@localhost:/> put ./sample.txt
# 結果の確認
lftp username@localhost:/> ls                                                  
-rw-r--r--    1 1000       ftpgroup            0 Jun 18 13:49 sample.txt

送信できたことが確認できました。

今度はローカルのsample.txtを削除しておいた状態で、FTPサーバー側からさっき送ったsample.txtを取ってきます。

FTPサーバーに接続していない方のコンソールで以下を実行し、ファイルを削除しておきます。

rm sample.txt
ls sample.txt
# ls: sample.txt: No such file or directory

FTPサーバーに接続していない方のコンソールで以下を実行し、ファイルを取得します。

# ファイルの取得
lftp username@localhost:/> get sample.txt

FTPサーバーに接続していない方のコンソールで以下を実行し、取得したファイルを確認します。

ls sample.txt
# sample.txt

最後に

docker-pure-ftpdイメージとLFTPで、ローカルにFTPの練習環境を構築してみました。 参考になりましたら幸いです。

参考