使用Ruby语言获取FTP服务器上的文件

发表时间: 2019-08-26 09:54

一、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