ubuntu部署ftp服务让windows直接通过浏览器读取指定目录下的文件,以及ftpClient.storeFile方法time out问题

一、安装

sudo apt install vsftpd

卸载
sudo apt purge vsftpd

查看版本

vsftpd -v

二、修改服务配置文件

对于ftp的登录目录需要先设置777权限
sudo chmod 777 /home/myftp -R

创建用户(用户名为myftp,与后面vsftpd配置文件对应),也可以直接使用当前登录用户:

sudo useradd -m myftp -d /home/myftp
若不想让该用户登录系统
sudo useradd -m myftp -d /home/myftp -s /bin/bash/nologin
设置用户密码:
sudo passwd myftp

/etc目录下的配置文件vsftpd.conf,整体配置文件结构及部分解释

listen=YES
#listen_ipv6=YES      #使用IPV6和上面的listen只能开一个不然启动会报错
anonymous_enable=NO   #不允许匿名访问
local_enable=YES      #允许本地用户登录
write_enable=YES      #允许FTP写入
local_umask=022      #新建文件夹或文件的权限默认为077,大多数ftp服务器设置为022
#anon_upload_enable=YES  #不允许匿名用户上传文件
#anon_mkdir_write_enable=YES #不允许匿名用户新建目录
dirmessage_enable=YES        #进入目录时向远程用户发送消息
use_localtime=YES            #显示带有时间的目录列表
xferlog_enable=YES           #激活上传/下载的日志记录
connect_from_port_20=YES     #确保ftp传输端口号为20
#chown_uploads=YES           #可将上传的匿名文件由指定用户拥有
#chown_username=whoever
xferlog_file=/var/log/vsftpd.log  #日志文件路径,也可以直接使用默认路径
xferlog_std_format=YES           #使用标准化格式的日志文件
#idle_session_timeout=600         #空闲会话超时的默认值
#data_connection_timeout=120     #数据连接超时的默认值
#Nopriv_user= ftpsecure         #创建唯一的用户,将该用户用作完全隔离且无特权的用户
#async_abor_enable=YES        #识别异步abor请求,可能会拒绝一些老的FTP客户端的连接
#ascii_upload_enable=YES      #设置ASCII上传下载
#ascii_download_enable=YES 
ftpd_banner=Welcome to blah FTP service. #登录欢迎语
#deny_email_enable=YES          #拒绝匿名email地址的文件,防止攻击
#banned_email_file=/etc/vsftpd.banned_emails
#chroot_local_user=YES           #将本地用户限制在主目录中
local_root=/home/myftp             #设置主目录
chroot_local_user=YES            #限制用户权限,默认情况下,为了防止安全漏洞,启用chroot后,如果用户锁定的目录可写,则vsftpd将拒绝上传文件。
allow_writeable_chroot=YES		#如果必须将用户的可写访问权限授予其主目录,请使用此选项
chroot_list_enable=YES			#chroot_local_user和chroot_list_enable都为YES的时候/etc/vsftpd.chroot_list中的用户可以不受限制访问任务目录
chroot_list_enable=NO			
chroot_list_file=/etc/vsftpd.chroot_list  #允许访问的用户列表文件
#ls_recurse_enable=YES              #激活ls -r选项
secure_chroot_dir=/var/run/vsftpd/empty   #空目录名称
pam_service_name=vsftpd                   #用户认证的PAM文件位置/etc/pam.d/vsftpd.vu)
#rsa_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem  #ssl的RSA证书位置
#rsa_private_key_file=/etc/ssl/private/ssl-cert-snakeoil.key #ssl的RSA秘钥位置
#ssl_enable=NO                          #开启ssl加密
#utf8_filesystem=YES                    #使用utf8文件系统
pasv_min_port=30000						#passive模式的时候随机端口范围最小端口
pasv_max_port=31000						#passive模式的时候随机端口范围最大端口
userlist_enable=YES						#要仅允许某些用户登录FTP服务器,将用户名添加到/etc/vsftpd.user_list文件(每行一个用户)来明确指定哪些用户可以登录。
userlist_file=/etc/vsftpd.user_list		#要仅允许某些用户登录FTP服务器,将用户名添加到/etc/vsftpd.user_list文件(每行一个用户)来明确指定哪些用户可以登录。
userlist_deny=NO						#要仅允许某些用户登录FTP服务器,将用户名添加到/etc/vsftpd.user_list文件(每行一个用户)来明确指定哪些用户可以登录。

local_root=/home/myftp //该目录为之前创建的ftp目录

chroot_local_user和chroot_list_enable详解
在这里插入图片描述

vsftpd.user_list中设置允许访问的用户
在这里插入图片描述

一般不建议这么设置,因为这样就意味着这个用户不受主目录限制,可以随便访问其他地方
创建文件vsftpd.chroot_list
sudo vi /etc/vsftpd.chroot_list
并将之前创建的用户名(myftp)添加到该文件中。
在这里插入图片描述

三、重启命令和添加开机启动

#启动服务
sudo service vsftpd start
#重启服务
sudo service vsftpd restart  
#停止服务  
sudo service vsftpd stop 
 
开机启动
sudo systemctl enable vsftpd

遇到的问题

windows的cmd连接上后敲命令显示这个
200 PORT command successful. Consider using PASV.
在这里插入图片描述
这是因为电脑连接无线网络,属性设置为“公用”导致,修改为“专用”,重新ftp连接恢复正常在这里插入图片描述

ftp启动失败
service vsftpd status查看状态(code=exited, status=2)
主要原因:ipV4和ipV6不能同时被监听,这边需要去掉一个监听设置,常规情况下只要去掉ipV6得就可以了。
在这里插入图片描述
在这里插入图片描述

使用windows本地文件夹访问时,提示FTP文件夹错误,227 Entering Passive Mode…
在这里插入图片描述
查询相关资料,这是由于FTP的主动模式和被动模式导致的。解决方法为:

打开浏览器->工具 ->Internet 选项 -> 高级->取消使用被动FTP的勾选->应用->确定。

在这里插入图片描述

按照上述步骤部署完之后,到chrome中去访问目标地址发现无法访问现场以及原因
demo
在这里插入图片描述

但是到文件中直接访问是ok的
在这里插入图片描述

在cmd中登录也是ok的
可以直接ftp 192.168.56.101登录ftp
如果登录超时之后可以open 192.168.56.101例如下图中就是连接超时之后重新open
在这里插入图片描述

后续我查看了service vsftpd status的状态,里面有登录的日志,发现浏览器一直以匿名方式在访问,而匿名方式访问又被我们禁止掉了,所以浏览器才访问不到
在这里插入图片描述

不过我想来想去还是没想到原因.后来停了大佬的建议,应该是权限问题,具体哪个权限引发的问题我还是不知道

我新建了一个用户,顺便把ftp的那个local_root的目录权限改成这个用户下

sudo useradd -d /home/ubuntu/app/downloads -g ftp -s /sbin/nologin myftp
sudo passwd myftp

然后重启了下vsftp

sudo service vsftpd restart

然后就一切ok了
浏览器也能访问了…迷幻

参考了大佬的博客,然后自己手动搭建了一下
https://blog.csdn.net/fangye945a/article/details/85109404?utm_medium=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase

当我们限定了用户不能跳出其主目录之后,使用该用户登录FTP时往往会遇到这个错误:
500 OOPS: vsftpd: refusing to run with writable root inside chroot()
在这里插入图片描述
从2.3.5之后,vsftpd增强了安全检查,如果用户被限定在了其主目录下,则该用户的主目录不能再具有写权限了!如果检查发现还有写权限,就会报该错误。

要修复这个错误,可以用命令chmod a-w /home/user去除用户主目录的写权限,注意把目录替换成你自己的。或者你可以在vsftpd的配置文件中增加下列两项中的一项:

allow_writeable_chroot=YES

然后在实际使用过程中发现连接的时候没问题,但是一上传文件就time out 最后关了防火墙就ok了......这个是真坑....
这个是为什么呢,我后面理解了一下,原因是连接的时候是通过21端口和ftp服务端进行连接的,我的防火墙是开启了21和20端口的通信的所以连接是ok的,但是一般我们采用的是passive模式去连接,也就是ftp服务端随机开一个端口给客户端去连接,要是这个端口不在防火墙的允许端口范围内,这个时候就会time out.所以我给ftp服务端随机开的端口限定了范围,然后在防火墙允许这个范围的端口通信,一切就ok了.

/etc/vsftpd.conf配置文件中

pasv_min_port=30000
pasv_max_port=31000
sudo ufw allow 30000:31000/tcp

FTP一般使用2个端口,一个是命令端口(默认为21),一个为数据端口(默认为20)。

两种模式介绍:

  • 主动模式:FTP客户端向FTP服务器端的21端口请求,FTP客户端告知FTP服务器端自己的端口是多少,FTP服务器端的20端口会连接FTP客户端的端口并进行数据传输。
  • 被动模式:FTP客户端向FTP服务器端的21请求,告知自己是被动模式,FTP服务器打开数据端口并告知FTP客户端,FTP客户端连接该FTP服务器数据端口并进行数据传输。

主动模式的缺点:当FTP客户端通过NAT接入公网时,因为防火墙或端口映射原因,FTP服务器端无法直接连接FTP客户端的端口。此时可以通过被动模式来实现数据的传输

参考了一位大佬的博客
https://www.myfreax.com/how-to-setup-ftp-server-with-vsftpd-on-ubuntu-18-04/

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: ftpclient.storefileFTPClient类中的一个方法,用于将本地文件上传到FTP服务器上。 具体用法如下: 1. 首先创建一个FTPClient对象,并连接到FTP服务器。 2. 然后使用storefile方法上传文件,该方法需要传入两个参数:远程文件名和本地文件名。 3. 上传完成后,关闭FTP连接。 示例代码: ``` FTPClient ftpClient = new FTPClient(); ftpClient.connect("ftp.example.com"); ftpClient.login("username", "password"); File localFile = new File("localfile.txt"); InputStream inputStream = new FileInputStream(localFile); ftpClient.storeFile("remotefile.txt", inputStream); inputStream.close(); ftpClient.logout(); ftpClient.disconnect(); ``` 以上代码将本地文件localfile.txt上传到FTP服务器上,并将其命名为remotefile.txt。 ### 回答2: FTPClient是Java中常用的FTP客户端连接工具,其中ftpclient.storefileFTPClient中上传文件方法之一。 使用ftpclient.storefile进行上传文件,首先需要创建一个FTP连接,并使用FTPClient的login方法进行登录。然后,需要设置上传文件的相关参数,包括上传文件的路径、文件名、上传模式等。 在设置好相关参数之后,调用ftpclient.storefile方法即可上传文件指定FTP服务器中。上传文件的过程需要关注的是上传进度、异常处理和上传结果的返回值。FTPClient中提供了多种方法来获取上传进度、处理异常和获得上传结果。 需要注意的是,在上传文件的过程中,我们需要保证文件名和上传路径的正确性,避免出现上传路径不存在或文件名重复等问题。同时,也需要检查上传文件的访问权限,确保上传文件的可读性和可写性。 总之,ftpclient.storefile方法是Java中上传文件FTP服务器的重要方法,使用时需要注意设置上传参数并处理相关异常,以确保文件能够正确地上传到FTP服务器中。 ### 回答3: FTPClient是Java中常用的FTP客户端库,可以连接到FTP服务器并执行各种FTP操作。其中,storefileFTPClient中用来上传文件方法storefile的基本用法是将本地文件上传到FTP服务器中指定的路径下。使用该方法需要执行以下步骤: 1. 连接到FTP服务器。可以通过FTPClient的connect方法连接FTP服务器,需要指定服务器的主机地址、端口号、用户名和密码等信息。 2. 设置传输模式。FTPClient支持两种传输模式:二进制传输和ASCII传输。通过设置FTPClient的setFileType方法指定传输模式,一般情况下使用二进制传输。 3. 设置工作目录。使用FTPClient的changeWorkingDirectory方法FTP服务器的当前工作目录切换到要上传文件目录。 4. 执行上传操作。调用FTPClientstoreFile方法上传文件。需要指定本地文件的路径和文件名,以及上传后保存在FTP服务器中的文件名。 5. 关闭连接。上传完成后,使用FTPClient的disconnect方法关闭与FTP服务器之间的连接。 以下是storefile方法的代码示例: ``` FTPClient ftpClient = new FTPClient(); ftpClient.connect("ftp.example.com", 21); ftpClient.login("username", "password"); ftpClient.setFileType(FTP.BINARY_FILE_TYPE); ftpClient.changeWorkingDirectory("/upload"); File localFile = new File("localfile.txt"); InputStream inputStream = new FileInputStream(localFile); ftpClient.storeFile("uploadedfile.txt", inputStream); inputStream.close(); ftpClient.logout(); ftpClient.disconnect(); ``` 在实际使用中,还需要处理上传文件失败的情况,并且考虑到网络传输中可能出现的稳定性问题,需要进行断点续传等操作。对于大文件的上传,可以考虑使用多线程或分片上传等技术来提高上传效率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值