From: castillo.bryan@... Date: 2007-03-21T14:55:07+09:00 Subject: Re: FTPS - How to connect with Ruby? On Mar 20, 10:51 pm, castillo.br...@gmail.com wrote: > 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 > (In case it wasn't obvious, you should change ftp to ftps in the url and you may need to supply a port.) > 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