421 Service not available, remote server has closed connectionバグです。アホらしいのでこれ以上追求していません。
$ tar xzf proftpd-1.2.9rc1.tar.gz $ cd proftpd-1.2.9rc1 proftpd-1.2.9rc1$ vi src/fsio.cFTP クライアントソフトから chmod コマンドを使われてもグループ s ビットが変化しないようパッチを当てる (※ fetch 対策)proftpd-1.2.9rc1$ install_user=root install_group=wheel ./configure proftpd-1.2.9rc1$ make proftpd-1.2.9rc1$ su proftpd-1.2.9rc1# make install proftpd-1.2.9rc1# vi /usr/local/etc/proftpd.conf
static int sys_chmod(pr_fs_t *fs, const char *path, mode_t mode) { struct stat buf ; mode_t fmode = stat(path,&buf) ; fmode = (buf.st_mode & ~(S_IRWXO | S_IRWXG | S_IRWXU)) | (mode & (S_IRWXO | S_IRWXG | S_IRWXU)) ; return chmod(path,fmode) ; }proftpd-1.2.9rc1# cat >> /etc/shells FTP アカウントの shell は passwd コマンドしてやるため、これが必要
ServerType inetd inetd,xinetd から起動させるので inetd にする Group nobody RedHat のデフォルトに nogroup は存在しないので変更する <Anonymous> を全てコメントアウト anonymous はなるべく使わない
/usr/bin/passwd
xinetd を使う場合 proftpd-1.2.9rc1# vi /etc/xinetd.d/ftpproftpd-1.2.9rc1# /etc/rc.d/init.d/xinetd restart
service ftp { flags = REUSE socket_type = stream wait = no user = root server = /usr/local/sbin/in.proftpd log_on_failure += USERID disable = no }
inetd (tcpd) を使う場合 proftpd-1.2.9rc1# vi /etc/inetd.confproftpd-1.2.9rc1# /etc/rc.d/init.d/inet restart
ftp stream tcp nowait root /usr/sbin/tcpd /usr/local/sbin/in.proftpd
proftpd.conf で bind を省略すると、ホスト名から IP アドレスを解決しようとします。 IP アドレスが解決できないと起動に失敗し、エラーログも残りません。 そんなときは、(inetd ではなく) コマンドラインから手動で in.proftpd を立ち上げてみましょう。
fetch 対策 fetch は元々のパーミッションを無視して自分の設定をサーバに強制します。 そして 4 桁の 8 進数を認めないので、2755 等の s ビットの設定が出来ません。 つまり、1 度でもファイルを転送すると、s ビットがクリアされ、元に戻すことが出来ないのです。 プログラムがタコなだけですが、そんなことは macintosh ユーザには理解できません。 (FFFTP には回避方法があります) UMASK ステートメントでも s ビットの変更は禁止できません。 仕方が無いのでサーバを macintosh ユーザに合わせます。 ちなみに、このパッチを proftpd 開発グループにメールし、 s ビットを変更しない拡張とそのオプションを提案しましたが、見事に無視されました。