阿里云搭建 FTP 服务器
前置条件
- 阿里云服务器
- vsftpd(介绍)
安装与配置
安装
yum install -y vsftpd
进入文件夹
cd /etc/vsftpd/
vsftpd.conf
是核心配置文件ftpusers
是黑名单文件,此文件里的用户不允许访问 FTP 服务器user_list
是白名单文件,是允许访问 FTP 服务器的用户列表
常用配置
#允许匿名用户登录FTP
anonymous_enable=YES
#设置匿名用户的登录目录(如需要,需自己添加并修改)
anon_root=/var/ftp/pub
#打开匿名用户的上传权限
anon_upload_enable=YES
#打开匿名用户创建目录的权限
anon_mkdir_write_enable=YES
#打开匿名用户删除和重命名的权限(如需要,需自己添加)
anon_other_write_enable=YES
#匿名用户的掩码(如需要,需自己添加,含义:如umask是022,这时创建一个权限为666的文件,文件的实际权限为666-022=644)
anon_umask=022
vsftpd
安装后默认开启了匿名 FTP 的功能
,使用匿名 FTP,用户无需输入用户名密码即可登录 >FTP 服务器,但没有权限修改或上传文件
配置匿名用户上传文件权限
在此之前我们先复制一份配置文件如下:
cat vsftpd.conf |grep -v "#" | grep -v "^$" > vsftpd.conf1
在重命名一下,这样做的原因是把没有注释的成为主配置来使用
mv vsftpd.conf vsftpd.conf2
mv vsftpd.conf1 vsftpd.conf
修改 vsftpd.conf 的配置文件的选项,可以赋予匿名 FTP 更多的权限。
vim /etc/vsftpd/vsftpd.conf
# 是否禁止匿名登录
anonymous_enable=YES
anon_upload_enable=YES
anon_mkdir_write_enable=YES
# 是否允许登录用户的写入操作
allow_writeable_chroot=YES
local_enable=YES
write_enable=YES
local_umask=022
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_std_format=YES
listen=NO
listen_ipv6=YES
pam_service_name=vsftpd
userlist_enable=YES
tcp_wrappers=YES
# 是否关闭passive的安全检测
pasv_promiscuous=YES
pasv_enable=YES
pasv_min_port=30000
pasv_max_port=30999
运行以下命令更改/var/ftp/pub
目录的权限,为 FTP用户添加写权限,并重新加载配置文件
chown root /var/ftp
chmod o+w /var/ftp/pub/
systemctl restart vsftpd.service
配置本地用户登录
本地用户登录就是指用户使用 Linux 操作系统中的用户账号和密码登录 FTP 服务器
可在 ftpuser(黑名单)和 userlist(白名单)中添加用户
vsftpd 安装后默只支持匿名 FTP 登录,用户如果试图使用 Linux 操作系统中的账号登录服务器,将会被 vsftpd 拒绝,但可以在 vsftpd 里配置用户账号和密码登录。具体步骤如下:
cd /var/ftp/pub/
useradd test1
passwd test1
添加test1本地帐户,下面是用业查询本地帐号,及黑名单
cat /etc/passwd
vi /etc/vsftpd/ftpusers
vi /etc/vsftpd/user_list
Windows FTP 来登录及测试
在用Windows连接前我们先做几个配置:
服务器就可以把安全组放开21端口,不是服务器也要放开 21端口那就先执行以下命令
firewall-cmd --zone=public --add-port=21/tcp --permanent
firewall-cmd --zone=public --permanent --add-port=30000-30999/tcp
firewall-cmd --reload
坚信vsftp安装后不对/etc/vsftpd/vsftpd.conf
做任何修改就可以通过新建的Linux用户(本地用户)访问下载和上传文件
匿名用户配置
修改配置文件
vim /etc/vsftpd/vsftpd.conf
# 是否禁止匿名登录
anonymous_enable=YES
anon_upload_enable=YES
anon_mkdir_write_enable=YES
# 是否允许登录用户的写入操作
allow_writeable_chroot=YES
local_enable=YES
write_enable=YES
local_umask=022
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_std_format=YES
listen=NO
listen_ipv6=YES
pam_service_name=vsftpd
userlist_enable=YES
tcp_wrappers=YES
# 是否关闭passive的安全检测
pasv_promiscuous=YES
pasv_enable=YES
pasv_min_port=30000
pasv_max_port=30999
重启服务器
systemctl restart vsftpd
touch /var/ftp/pub/xm.txt
chown ftp /var/ftp/pub
服务器配置上面的就可以访问并上传文件到pub目录下
虚拟用户配置
1、添加虚拟用户口令文件并生成认证文件
vim /etc/vsftpd/vuser.txt
文件格式:用户名和密码分别占两行,用户名在前。
添加虚拟用户tom和jack,密码分别为 tom123 和 jack123。
tom
tom123
jack
jack123
下载依赖和配置
yum -y install db4-utils
db_load -T -t hash -f /etc/vsftpd/vuser.txt /etc/vsftpd/vuser.db
2、编辑vsftpd的PAM认证文件
vim /etc/pam.d/vsftpd
#%PAM-1.0
#session optional pam_keyinit.so force revoke
#auth required pam_listfile.so item=user sense=deny file=/etc/vsftpd/ftpusers onerr=succeed
#auth required pam_shells.so
#auth include password-auth
#account include password-auth
#session required pam_loginuid.so
#session include password-auth
auth required /lib64/security/pam_userdb.so db=/etc/vsftpd/vuser
account required /lib64/security/pam_userdb.so db=/etc/vsftpd/vuser
3、建立本地映射用户并设置宿主目录权限
useradd -d /home/vftproot -s /sbin/nologin vuser
chmod 600 /home/vftproot/
4、修改配置文件,重启vsftpd服务,并测试
vi /etc/vsftpd/vsftpd.conf
把你之前的删除,只留现在我的
# 是否禁止匿名登录
anonymous_enable=NO
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES
# 是否允许登录用户的写入操作
allow_writeable_chroot=YES
local_enable=YES
write_enable=YES
local_umask=022
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_std_format=YES
listen=NO
listen_ipv6=YES
pam_service_name=vsftpd
userlist_enable=YES
tcp_wrappers=YES
# 是否关闭passive的安全检测
pasv_promiscuous=YES
pasv_enable=YES
pasv_min_port=30000
pasv_max_port=30999
##
guest_enable=YES
guest_username=vuser
重启服务器
systemctl restart vsftpd.service
5、调整虚拟用户权限,并继续设置:到此下载可以但上传是不是行的
mkdir /home/vftproot/pub
chmod 777 /home/vftproot/pub
ll -d /home//vftproot/pub
常用命令
介绍 | 命令 |
---|---|
开机自启vsftpd | systemctl enable vsftpd.service |
启动vsftpd | systemctl start vsftpd.service |
停止vsftpd | systemctl stop vsftpd.service |
重启vsftpd | systemctl restart vsftpd.service |
# 设置是否允许匿名用户登录
anonymous_enable=NO
# 匿名用户登录目录
anon_root=/home/anonymitys/
# 用户只读配置
# 设置 NO 表示用户可以浏览 FTP 目录和下载文件
anon_world_readable_only=NO
# 设置是否允许本地用户登录
local_enable=YES
# 设置本地用户目录(因为是映射到另一个用户配置目录,所以这里暂时不需要指定目录)
local_root=/home/locals/robotlab2020
# NO 不允许下载
#download_enable=NO
# 不同用户不同权限,将不同用户不同权限的配置映射到其他目录下的文件去配置
#user_config_dir=/etc/vsftpd_user_conf
# 是否允许本地用户对FTP服务器文件具有写权限,默认设置为YES允许
# 因为具体的是否有此权限调整到/etc/vsftpd_user_conf配置了,所以这里注释掉,不打开
#write_enable=YES
# 掩码,本地用户掩码默认为777,也可直接设置为缺省的022
local_umask=022
# 匿名用户是否允许上传,须将全局的write_enable=YES。默认为YES
anon_upload_enable=NO
# 是否允许匿名用户创建新文件夹
#anon_mkdir_write_enable=YES
###
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
#chown_uploads=YES
#chown_username=whoever
#xferlog_file=/var/log/xferlog
xferlog_std_format=YES
#idle_session_timeout=600
#data_connection_timeout=120
#nopriv_user=ftpsecure
#async_abor_enable=YES
###
# 是否以ASCII方式传输数据。默认情况下,服务器会忽略ASCII方式的请求。
# 启用此选项将允许服务器以ASCII方式传输数据
#ascii_upload_enable=YES
#ascii_download_enable=YES
###
#ftpd_banner=Welcome to blah FTP service.
#deny_email_enable=YES
#banned_email_file=/etc/vsftpd/banned_emails
###
# 用于指定用户列表文件中的用户是否允许切换到上级目录。默认值为 NO。
chroot_local_user=YES
# 设置是否启用 chroot_list_file 配置项指定的用户列表文件。默认值为 NO。
chroot_list_enable=NO
# 用于指定用户列表文件,该文件用于控制哪些用户 可以 切换到用户家目录的 上级目录。
#chroot_list_file=/etc/vsftpd/chroot_list
###########################
# 注:
#(1)当chroot_local_user=YES,chroot_list_enable=YES 时,在 /etc/vsftpd.chroot_list 文件中
#列出的用户,可以切换到其他目录;未在文件中列出的用户,不能切换到其他目录。
#(2)当 chroot_local_user=NO,chroot_list_enable=YES 时,在 /etc/vsftpd.chroot_list 文件中
#列出的用户,不能切换到其他目录;未在文件中列出的用户,可以切换到其他目录。
# !!(3)当 chroot_local_user=YES, chroot_list_enable=NO 时,所有的用户均不能切换到其他目录。
#(4)当 chroot_local_user=NO, chroot_list_enable=NO 时,所有的用户均可以切换到其他目录。
###########################
#ls_recurse_enable=YES
# 是否允许监听。
# 如果设置为YES,则vsftpd将以独立模式运行,由vsftpd自己监听和处理IPv4端口的连接请求
listen=YES
# 设定是否支持IPV6。如要同时监听IPv4和IPv6端口,
# 则必须运行两套vsftpd,采用两套配置文件
# 同时确保其中有一个监听选项是被注释掉的
#listen_ipv6=YES
# 虚拟用户使用 PAM 认证方式
pam_service_name=vsftpd
###
#控制用户访问 FTP 的文件,里面写着用户名称。一个用户名称一行。(用 userlist 来限制用户访问)
userlist_enable=YES
# 名单中的人不允许访问
# userlist_deny=no
# 限制名单文件放置的路径
# userlist_file=/etc/vsftpd/userlist_deny.chroot
tcp_wrappers=YES
# 若设置为 YES,则使用 PASV 工作模式(被动模式);若设置为 NO,则使用 PORT 模式。默认值为 YES,即使用 PASV 工作模式。
pasv_enable=YES
# 设置 FTP 服务器在指定的 IP 地址上侦听用户的 FTP 请求。
pasv_address=<ip地址>
# 在 PASV 工作模式下,数据连接可以使用的端口范围的最小端口和最大端口,0表示任意端口。默认值为 0。
pasv_min_port=<最小端口号>
pasv_max_port=<最大端口号>
#500 OOPS: vsftpd: refusing to run with writable root inside chroot ()错误时添加
# 从 2.3.5 之后,vsftpd 增强了安全检查,如果用户被限定在了其主目录下,则该用户的主目录不能再具有写权限了!
# 如果检查发现还有写权限,就会报该错误。
# 要修复这个错误,可以用命令 chmod a-w /home/dgut 去除用户主目录的写权限,注意把目录替换成你自己的;
# 或者可以在 vsftpd 的配置文件中增加下列项,将值设置为 YES
allow_writeable_chroot=YES
idea连接ftp
<!-- 在maven工程 pom中导入 -->
<!--工具包-->
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.7.21</version>
</dependency>
<dependency>
<groupId>commons-net</groupId>
<artifactId>commons-net</artifactId>
<version>3.8.0</version>
</dependency>
<!---->
<dependency>
<groupId>ant</groupId>
<artifactId>ant-jakarta-oro</artifactId>
<version>1.6.1</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.3.15</version>
</dependency>
Java 代码开始了
public class updateHootlFtp {
public static void main(String[] args) throws IOException {
insertFile("远程文件夹目录","test.txt");
}
/**
* @param directory 远程目录的位置
* @param winFilePath 本地文件名称
* @throws IOException
*/
public static void insertFile(String directory,String winFilePath) throws IOException {
//匿名登录(无需帐号密码的FTP服务器)
//Ftp ftp = new Ftp("远程host", 服务端口号, "远程登录用户", "远程登录密码",Charset.forName("utf-8"));
Ftp ftp = new Ftp("远程host", 21, "远程登录用户", "远程登录密码",Charset.forName("utf-8"));
try {
//启动被动模式
ftp.setMode(FtpMode.Passive);
//进入远程目录
ftp.cd("/root/img/");
//上传本地文件
boolean flag = ftp.upload("/root/img/", FileUtil.file("E:\\Test\\"+winFilePath));
System.err.println( flag ? "上传成功" : "上传失败!!");
} catch (Exception e) {
e.printStackTrace();
} finally {
//关闭连接
ftp.close();
}
}
}
idea查询本地文件夹中的文件
public class WinFile {
public static void main(String[] args) {
//输入一个路径
String path = "E:\\Game\\test";
getFile(path);
System.out.println("统计完毕");
}
private static void getFile(String path) {
File f = new File(path);
File[] fs = f.listFiles();
if (fs == null) {
return;
}
for (File file : fs) {
//将统计的文件的字节数(单位:B) 方便计算大小
if (file.isFile()) {
System.out.println("文件名:" + file.getName() + ",文件大小是:" + file.length());
} else {
getFile(file.getAbsolutePath());
}
}
}
}
# 完成
参考文献
命令详解: https://blog.csdn.net/qq_57258570/article/details/121605842
FTP连接时出现“227 Entering Passive Mode”:https://www.cnblogs.com/bkywanly/p/9767246.html
CentOS7服务器环境下vsftpd安装及配置方法:https://www.yingsoo.com/news/posts/65516.html
vsftpd 配置文件超详细讲解(常用参数配置):https://blog.csdn.net/Awwwze/article/details/109405632
227 Entering Passive Mod:https://blog.51cto.com/whnba/1619597
虚拟用户:https://blog.csdn.net/owenxiaobai/article/details/128441281