Ruby获取FTP文件

技术分享 Finley Fu 2019-05-30 0评论 328
最近在工作中进行双系统交互,互相传输文件用接口恐怕服务器超时,因此选择了FTP的方式进行文件传输,总结下过程。

一、FTP安装

  • 安装
$ sudo apt-get update
$ sudo apt-get install vsftpd
  • 修改配置文件 /etc/vsftpd.conf,下面是具体配置说明
# 禁止匿名用户登录
anonymous_enable=NO
# 允许系统用户登录
local_enable=YES
# 启用可以修改文件的 FTP 命令
write_enable=YES
# 本地用户创建文件的 umask 值
local_umask=022
# 允许为目录配置显示信息,显示每个目录下面的message_file文件的内容
dirmessage_enable=YES
# 开启日记功能 
xferlog_enable=YES
# 使用标准的20端口来连接ftp 
connect_from_port_20=YES
# 使用标准日志格式 
xferlog_std_format=YES
# 如果启动这项功能,则所有列在chroot_list_file之中的使用者不能更改根目录
chroot_list_enable=YES
# 指定限制的用户文件
chroot_list_file=/etc/vsftpd/chroot_list
# ftp服务器将处于独立启动模式
listen=YES
# 设置一个本地用户登录后进入到的目录
local_root=/home/ftp
# 设置PAM认证服务的配置文件名称,该文件保存在“/etc/pam.d/”目录下
pam_service_name=vsftpd
# ftp将检查userlist_file设置文件中指定的用户是否可以访问vsftpd服务器
userlist_enable=YES
# 只允许user_list文件中记录的ftp用户能登录vsftp服务,其他的ftp用户都不可以登录。
userlist_deny=NO
# 定义限制/允许用户登录的文件
userlist_file=/etc/vsftpd/allowed_users  
# ftp服务器将使用tcp_wrappers作为主机访问控制模式
tcp_wrappers=YES
# 连接ftp服务费使用的端口
listen_port=21
  • 创建用户
#创建目录
mkdir /home/ftp
#修改目录权限
chmod -R 777 /home/ftp
#创建用户,并禁止登陆系统,将fyp目录给予这个用户
useradd -d /home/ftp -s /sbin/nologin ftpuser
#为用户创建密码
passwd ftpuser
#在etc下创建allowed_users
touch allowed_users
#然后把ftpuser写入到allowed_users文件中
vim /etc/allowed_users
  • 启动FTP服务
#启动命令
service vsftpd start
#查看状态
service vsftpd status
  •  测试访问

        在浏览器地址栏输入 ftp://ip,然后在弹出的输入框中输入刚才创建的账号密码即可访问,如图

二、Ruby读取FTP

        ruby使用自己的net/ftp即可读取ftp内容
require 'net/ftp'
class FtpHelp
  HOST = "ip"
  PORT = "21"
  USER = "ftpuser"
  PSW = "psw"
  def self.get_file_by_path(es, path)
    ftp = Net::FTP.new
    #连接ftp
    ftp.connect(HOST, PORT)
    #登陆
    ftp.login(USER, PSW)
  ftp.passive = true
    #创建本地路径
    local_path = local_path(path)	
    #临时文件路径
    tmp_path = local_path+".tmp"
    #开始读取文件
    begin
	ftp.getbinaryfile(path, tmp_path)
    rescue
	File.delete(tmp_path) if File.exist?(tmp_path)
    end
    #把临时文件改为正式文件路径
    File.rename(tmp_path, local_path) if File.exist?(tmp_path)
    #关闭ftp
    ftp.close
    if File.exist?(local_path)
      return File.open(local_path)
    else
      return nil
    end
  end
  #创建本地路径
  def self.local_path(file)
    local = File.join(PATH+"/public/ftpfile", file)
    FileUtils.makedirs(File.dirname(local))
    local
  end end