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/
いろいろ便利そうですね。