From: castillo.bryan@... Date: 2007-03-21T14:55:06+09:00 Subject: Re: FTPS - How to connect with Ruby? On Mar 20, 10:40 am, "ChrisKaelin" wrote: > On 20 Mrz., 17:42, "Jan Vesel�" wrote: > > > > > Hello, I'm new to Ruby and have the first problem I can't solve myself > > after a lot of googling - connecting to a FTPS server (FTP AUTH TLS/ > > SSL). > > > - there's some library called chilkat, but it's not free (for this > > little script it's really too expensive to solve it that way) > > - ftpfxp library is targeted on fxp transfers, but it connects ok - > > but it doesn't seem like a good library for normal ftp-related work > > - the standard ftp library doesn't look like it has some support for > > firewall/proxy to get there a program like TLSWrap between client and > > server and solve the problem > > - I found some curl library in prealfa state that could possibly help > > me somehow - but it looks like the last solution when everything else > > fails (prealfa, weird installation) > > > Could you please give me a hint? > > Try net/sftp Module. With that I made a backup script on window$ using > scp and/or sftp, because rsync is not available on the server, I have > to back up. > > net/sftp project:http://raa.ruby-lang.org/project/net-sftp/ > Unfortunately, sftp is a different protocol than FTPS and that module probably won't help. (3 months ago I received a spec saying my company would communicate with another company using SFTP, only to figure out after code had been written that they meant FTPS.) I looked in my install of ruby and found a file net/ftptls.rb. That code looks like it's only for Implicit FTPS, not explicit. I'd try it anyway. The code I ended up writing (in Java) was a class that interfaced to the curl command line client. It worked very well. As dirty as it seemed at the time, I still think it was better than writing JNI to the curl C interface. Here is a quick and dirty class to interface to the curl command line client from ruby. This should work for FTPS, if your curl client was compiled with it. curl -V will list the protocols it supports. class CurlFtp CURL = "curl" def initialize(url, user, pass, verbose=false) @url = url @user = user @pass = pass @verboseFlag = (verbose) ? '-v' : '' end def put(path, &block) command = sprintf "'%s' %s --upload-file - --user '%s:%s' '%s/ %s'", CURL, @verboseFlag, @user, @pass, @url, path IO.popen(command, "w", &block) raise "Curl error: #{$?.to_i / 256}" if $? != 0 end def get(path, &block) command = sprintf "'%s' %s --user '%s:%s' '%s/%s'", CURL, @verboseFlag, @user, @pass, @url, CGI.escape(path) IO.popen(command, "r", &block) raise "Curl error: #{$?.to_i / 256}" if $? != 0 end end ftp = CurlFtp.new('ftp://localhost:21', 'bcastill', 'pass', false) ftp.put('/upload/file.txt') do |io| io.puts("Writing to FTP server....") end puts "Getting data:" ftp.get('/upload/file.txt') do |io| io.each_line do |line| puts "LINE: #{line}" end end