CLOVER🍀

That was when it all began.

Apache MINAで簡単FTPD

Apache MINAに、FTPサーバとSSHサーバがあり、けっこう簡単に使えるそうな。

テスト用途とかであると便利そうなので、試してみることにしました。まずはFTPサーバから。

Apache FtpServer
http://mina.apache.org/ftpserver-project/

MINAといえばNIOフレームワークのイメージが強いのですが、こんなのもあるんですねぇ、と。

追記)SSHD編も書きました!
Apache MINAで簡単SSHD
http://d.hatena.ne.jp/Kazuhira/20140308/1394264682

では、試していってみましょう。

インストール

FTPサーバの方は、スタンドアロンで使用することができます。

また、Apache MINAで書かれているので、Javaがインストールされているのは前提事項とします。

とりあえず、ダウンロード。
http://mina.apache.org/ftpserver-project/downloads.html

今回使用するバージョンは、1.0.6です。

ダウンロードしたzipを展開。

$ unzip ftpserver-1.0.6.zip

展開すると、ディレクトリは「apache-ftpserver-1.0.6」に…。

$ cd apache-ftpserver-1.0.6

まずは起動

この時点で、もう起動することができます。

$ bin/ftpd.sh

が、ポート21で起動しようとするので、rootでなかった場合はコケます…。

$ bin/ftpd.sh 
Using default configuration
org.apache.ftpserver.FtpServerConfigurationException: Failed to bind to address 0.0.0.0/0.0.0.0:21, check configuration
	at org.apache.ftpserver.listener.nio.NioListener.start(NioListener.java:181)
	at org.apache.ftpserver.impl.DefaultFtpServer.start(DefaultFtpServer.java:80)
	at org.apache.ftpserver.main.CommandLine.main(CommandLine.java:62)
Caused by: java.net.SocketException: 許可がありません

というわけで、手順に従ってデフォルトの設定ファイルを使って起動してみましょう。

Running FtpServer stand-alone in 5 minutes
http://mina.apache.org/ftpserver-project/running_ftpserver_standalone.html

起動。

$ bin/ftpd.sh res/conf/ftpd-typical.xml
Using XML configuration file res/conf/ftpd-typical.xml...
FtpServer started

今度は、うまくいきました。この場合、起動ポートは2121になります。

デフォルトでは、匿名ユーザと「admin」の2つが登録されています。

$ ftp localhost 2121
Connected to localhost.
220 Service ready for new user.
Name (localhost:xxxxx): admin
331 User name okay, need password for admin.
Password:
230 User logged in, proceed.
Remote system type is UNIX.
ftp> bye
221 Goodbye.

パスワードは、「admin」です。

匿名ユーザの場合は、パスワードなし。

$ ftp localhost 2121
Connected to localhost.
220 Service ready for new user.
Name (localhost:xxxxx): anonymous
331 Guest login okay, send your complete e-mail address as password.
Password:
230 User logged in, proceed.
Remote system type is UNIX.
ftp> bye
221 Goodbye.

ユーザの設定

では、ここでいったんサーバを落として、ユーザを追加してみましょう。

ユーザの設定は、先ほど起動時に指定していた

res/conf/ftpd-typical.xml

に以下のような記載があります。

        <file-user-manager file="./res/conf/users.properties" />

これで、ユーザの設定は「./res/conf/users.properties」ファイルから読み込み、パスワードはMD5で保存(デフォルト)という意味になっています。

ファイルベースの設定は、以下を見ると良いらしいです。

File based user manager
http://mina.apache.org/ftpserver-project/configuration_user_manager_file.html

他にも、データベースでユーザ管理もできるようだとか。

ここは、デフォルトの設定ファイルをコピーして、新規に設定を作成しましょう。

        <file-user-manager file="./res/conf/my-users.properties" encrypt-passwords="clear" />

パスワードは、平文で。

コピー。

$ cp res/conf/users.properties res/conf/my-users.properties

新規に作成したファイルの中身は、このようにしました。

ftpserver.user.myuser.userpassword=mypassword
ftpserver.user.myuser.homedirectory=./res/home/myuser
ftpserver.user.myuser.enableflag=true
ftpserver.user.myuser.writepermission=true
ftpserver.user.myuser.maxloginnumber=0
ftpserver.user.myuser.maxloginperip=0
ftpserver.user.myuser.idletime=0
ftpserver.user.myuser.uploadrate=0
ftpserver.user.myuser.downloadrate=0

ちなみに、オリジナルはこんな感じです。

# Password is "admin"
ftpserver.user.admin.userpassword=21232F297A57A5A743894A0E4A801FC3
ftpserver.user.admin.homedirectory=./res/home
ftpserver.user.admin.enableflag=true
ftpserver.user.admin.writepermission=true
ftpserver.user.admin.maxloginnumber=0
ftpserver.user.admin.maxloginperip=0
ftpserver.user.admin.idletime=0
ftpserver.user.admin.uploadrate=0
ftpserver.user.admin.downloadrate=0

ftpserver.user.anonymous.userpassword=
ftpserver.user.anonymous.homedirectory=./res/home
ftpserver.user.anonymous.enableflag=true
ftpserver.user.anonymous.writepermission=false
ftpserver.user.anonymous.maxloginnumber=20
ftpserver.user.anonymous.maxloginperip=2
ftpserver.user.anonymous.idletime=300
ftpserver.user.anonymous.uploadrate=4800
ftpserver.user.anonymous.downloadrate=4800

「ftpserver.user」の次に来るのが、ユーザ名っぽいですね。また、ホームディレクトリは「ftpserver.user.[ユーザ名].homedirectory」で指定するようです。

今回、ホームディレクトリは明示してみました。

ftpserver.user.myuser.homedirectory=./res/home/myuser

で、サーバ側にホームディレクトリを作成して

$ mkdir res/home/myuser

ファイルも何か作っておきましょうか。

$ echo 'File From Server' > res/home/myuser/server.txt

動作確認

それでは、サーバを起動します。

$ bin/ftpd.sh res/conf/ftpd-typical.xml 
Using XML configuration file res/conf/ftpd-typical.xml...
FtpServer started

では、クライアント側でもテスト用にファイルを作成。

$ echo 'File From Client' > client.txt

接続。

$ ftp localhost 2121
Connected to localhost.
220 Service ready for new user.
Name (localhost:xxxxx): myuser
331 User name okay, need password for myuser.
Password:
230 User logged in, proceed.
Remote system type is UNIX.
ftp> 

lsで、サーバ側のファイルが見えます。

ftp> ls
200 Command PORT okay.
150 File status okay; about to open data connection.
-rw-------   1 user group           17 Mar  8 13:53 server.txt
226 Closing data connection.

サーバのファイルを取得。

ftp> get server.txt
local: server.txt remote: server.txt
200 Command PORT okay.
150 File status okay; about to open data connection.
226 Transfer complete.
17 bytes received in 0.01 secs (1.9 kB/s)

ファイル送信。

ftp> put client.txt
local: client.txt remote: client.txt
200 Command PORT okay.
150 File status okay; about to open data connection.
226 Transfer complete.
17 bytes sent in 0.00 secs (425.7 kB/s)

さよなら。

ftp> bye
221 Goodbye.

クライアント側には、ちゃんと取得したファイルが来ていますね。

$ cat server.txt
File From Server

サーバ側にも、ちゃんとファイルが送信されています。

$ find res/home/myuser/
res/home/myuser/
res/home/myuser/server.txt
res/home/myuser/client.txt

今回はスタンドアロンのサーバとして使用しましたが、プログラムへの組み込みも可能のようです。

Embedding FtpServer in 5 minutes
http://mina.apache.org/ftpserver-project/embedding_ftpserver.html

アプリケーションへの組込みも可能な「Apache FtpServer」
http://news.mynavi.jp/column/tool/005/

いろいろ便利そうですね。