前几天迁移服务器,其中有个ftp,当时以为这个ftp只是公司用来上传视频的,所以搭建了一个vsftpd服务,没想到这个ftp同时还被java程序连接,而java使用vsftpd进行文件移动时总会报错‘550 Rename failed’,其实就是移动时会先更改源文件名称,而改名时名称前面会加上路径,其中‘/’是不允许在命名时使用的,所以最后只能还使用原来的proftpd服务。
1、环境
阿里云ECS CentOS7
2、下载文件
wget ftp://ftp.proftpd.org/distrib/source/proftpd-1.3.5.tar.gz
3、解压文件
tar -zvxf proftpd-1.3.5.tar.gz
4、编译安装
cd proftpd-1.3.5
./configure --prefix=/usr/local/proftpd --sysconfdir=/etc/ --enable-nls --enable-openssl --enable-shadow
make
make install
编译说明:
--prefix=PREFIX 指定安装路径(--prefix=
/usr/local/
)
--sysconfdir=DIR 指定FTP服务配置文件路径(--sysconfdir=
/etc
)
--localstatedir=DIR 指定运行状态的文件存放位置(默认
/var/proftpd
)
--with-modules=mod_ldap 指定加载功能模块
--
enable
-memcache 支持缓存功能
--enable-nls 支持多语言环境(如中文),安装完成后在主配置文件中 需要指定字符编码(UseEncoding UTF-8 CP936)
--
enable
-openssl 支持TLS加密FTP服务
--
enable
-shadow 支持使用
/etc/shadow
验证用户密码
5、创建共享目录
用户名 ftpuser1 对应目录:
/data/ftp_dir1
用户名 ftpuser2 对应目录:
/data/ftp_dir2
6、编辑配置文件 /etc/proftpd.conf
ServerName "abiftp"
ServerType standalone
DefaultServer on
Port 21
Umask 002
MaxInstances 30
MaxClients 30
User nobody
Group nobody
DefaultRoot ~
UseEncoding UTF-8 GBK
AllowOverwrite on
AllowRetrieveRestart on
AllowStoreRestart on
MaxClientsPerHost 20
UseReverseDNS off
TimeoutLogin 60
TimeoutNoTransfer 600
LogFormat myxfer "%h %u %t \"%r\" %s %b"
LogFormat default "%h %a %u %t \"%r\" %s %b $$ \'%F\'"
LogFormat auth "%h %a %t \"%r\" %s"
LogFormat write "%h %a %t \"%r\" %s %b"
SetEnv TZ :/etc/localtime
SystemLog /usr/local/proftpd/var/proftpd.log
TransferLog /usr/local/proftpd/var/xfer.log
# 目录及权限配置
RequireValidShell off
<Directory /data/ftp_dir1>
<Limit READ>
AllowUser ftpuser1
DenyAll
</Limit>
<Limit WRITE>
AllowUser ftpuser1
DenyAll
</Limit>
<Limit STOR MKD>
AllowUser ftpuser1
DenyAll
</Limit>
<Limit DELE RMD>
AllowUser ftpuser1
DenyAll
</Limit>
<Limit RETR>
AllowUser ftpuser1
DenyAll
</Limit>
</Directory>
<Directory /data/ftp_dir2>
<Limit READ>
AllowUser ftpuser2
DenyAll
</Limit>
<Limit WRITE>
AllowUser ftpuser2
DenyAll
</Limit>
<Limit STOR MKD>
AllowUser ftpuser2
DenyAll
</Limit>
<Limit DELE RMD>
AllowUser ftpuser2
DenyAll
</Limit>
<Limit RETR>
AllowUser ftpuser2
DenyAll
</Limit>
</Directory>
7、创建用户
先创建一个系统用户,该用户拥有/data/ftp_dir1 和 ftp_dir2的属主和属组权限
useradd -s /sbin/nologin ftpuser
chown ftpuser:ftpuser /data/ftp_dir1
chown ftpuser:ftpuser /data/ftp_dir2
创建连接ftp的用户
useradd -d /data/ftp_dir1/ -g ftpuser -s /sbin/nologin ftpuser1
useradd -d /data/ftp_dir2/ -g ftpuser -s /sbin/nologin ftpuser2
passwd ftpuser1
passwd ftpuser2
8、测试配置文件及启动
测试
/usr/local/proftpd/sbin/proftpd -t6
启动
/usr/local/proftpd/sbin/proftpd
完成!
附加:虚拟用户
/etc/proftpd.con增加配置
AuthOrder mod_auth_file.c
RequireValidShell off
AuthUserFile /usr/local/proftpd/ftpd.passwd
创建用户
/usr/local/proftpd/bin/ftpasswd --passwd --file=/usr/local/proftpd/ftpd.passwd --name=ftpuser1 --uid=1004 --home=/data/ftp_dir1/ --shell=/bin/false
当时我配置虚拟用户,但配置文件中的权限似乎没有生效,所以我为了服务快速可用,使用了系统用户连接ftp的方式,但后来想想,应该是相对路径和绝对路径的问题。
所以当使用虚拟用户时,配置文件中的权限应该将:
<Directory /data/ftp_dir1> 改为 <Directory />
这样我觉得可行,但我并未测试,可以参考一下