From: ara.t.howard@... Date: 2006-05-05T00:14:13+09:00 Subject: Re: New thread for RUBY ftp problems . . . ---1400102478-397658438-1146755641=:24574 Content-Type: MULTIPART/MIXED; BOUNDARY="-1400102478-397658438-1146755641=:24574" This message is in MIME format. The first part should be readable text, while the remaining parts are likely unreadable without MIME-aware tools. ---1400102478-397658438-1146755641=:24574 Content-Type: TEXT/PLAIN; charset=US-ASCII; format=flowed On Thu, 4 May 2006, Peter Bailey wrote: > I'm starting a new thread, because, my problem appears even in the > simplest try of RUBY's ftp. > > Here's a simple attempt to just ftp a file over to one of our UNIX > servers here at my company. It's left hanging after the last "end" and I > have to kill the shell. > > > C:\workflows\graphics\OneVision\MPC\indexes\6x9>irb > irb(main):001:0> require 'net/ftp' > => true > irb(main):002:0> ftp = Net::FTP.open('quark.bna.com') do |ftp| > irb(main):003:1* ftp.login('user','passw') > irb(main):004:1> ftp.chdir('/home/pb4072') > irb(main):005:1> ftp.putbinaryfile("lrr095.pdf") > irb(main):006:1> end > > Is RUBY's ftp reliable? Or, what am I doing wrong?? - you may need passive - you may not be logging in - either way you will see what's happening by doing ftp.debug_mode = true here are three commandline scripts i used daily moving tens of thousands of files around, usage is obivous, never had an issue with any of them: harp:~ > ftpls cf0 drwxrwsr-x 3 457 11111 45056 Apr 20 17:43 cf0-0 drwxrwsr-x 2 457 11111 954368 Apr 20 17:42 cf0-1 harp:~ > ftpput a.rb cf0://cf0-0/ --- - "/cf0-0/a.rb" harp:~ > ftpget cf0://cf0-0/a.rb --- - "./a.rb" note that you can also use ftp://cf0/cf0-0/a.rb syntax and that any path with a trailing slash on the command line is interpreted as a directory. here are the scripts. harp:~ > cat ftpls #!/dmsp/reference/bin/ruby require "net/ftp" require "uri" def uriparse uri unless uri =~ %r/^ftp/ host, path = uri.split %r|:/+|o URI::parse "ftp://#{ host }/#{ path }" else URI::parse uri end end abort "#{ $0 } uri [uris]+" if ARGV.empty? user = ENV["FTP_USER"] || "anonymous" password = ENV["FTP_PASS"] || ENV["FTP_PASSWORD"] || "foo@bar.org" while((uri = ARGV.shift)) uri = uriparse uri Net::FTP.open(uri.host) do |ftp| ftp.login user, password ftp.passive = true ftp.list(uri.path || "/"){|path| puts path} end end harp:~ > cat ftpput #!/dmsp/reference/bin/ruby require "net/ftp" require "uri" require "socket" require "yaml" def uriparse uri unless uri =~ %r/^ftp/ host, path = uri.split %r|:/+|o URI::parse "ftp://#{ host }/#{ path }" else URI::parse uri end end abort "#{ $0 } src [srcs]+ dsturi" if ARGV.empty? user = ENV["FTP_USER"] || "anonymous" password = ENV["FTP_PASS"] || ENV["FTP_PASSWORD"] || "foo@bar.org" debug = ENV["FTP_DEBUG"] srcs, uri = ARGV[0..-2], ARGV[-1] uri = uriparse uri host, hostdest = uri.host, uri.path rpaths = [] hostname, pid = Socket::gethostname, Process::pid Net::FTP.open(host) do |ftp| ftp.debug_mode = true if debug ftp.login user, password ftp.passive = true ftp.binary = true srcs.each do |src| dest = if hostdest =~ %r|/+\s*$|o or srcs.size > 1 File::join(hostdest, File::basename(src)) else hostdest end destdir = File::dirname dest destdirs = [] d = nil destdirs.unshift(d) while((d = File::dirname(d || dest)) !~ %r|^\s*/+\s*$|o) dirname, basename = File::dirname(dest), File::basename(dest) tmp = File::join(dirname, ".#{ basename }.#{ hostname }.#{ pid }.ftp") if debug state = <<-eos |@src <#{ src }> |@host <#{ host }> |@dest <#{ dest }> |@destdir <#{ destdir }> |@destdirs <#{ destdirs.inspect }> |@tmp <#{ tmp.inspect }> eos state.gsub!(%r/^\s*\|/o,'') puts state end destdirs.each{|d| begin; ftp.mkdir d; rescue Net::FTPPermError; end} ftp.putbinaryfile src, tmp ftp.rename tmp, dest rpaths << dest end end y rpaths harp:~ > cat ftpget #!/dmsp/reference/bin/ruby require "net/ftp" require "uri" require "yaml" def uriparse uri unless uri =~ %r/^ftp/ host, path = uri.split %r|:/+|o URI::parse "ftp://#{ host }/#{ path }" else URI::parse uri end end abort "#{ $0 } srcuri [srcuris]+ dst" if ARGV.empty? user = ENV["FTP_USER"] || "anonymous" password = ENV["FTP_PASS"] || ENV["FTP_PASSWORD"] || "foo@bar.org" debug = ENV["FTP_DEBUG"] ARGV << '.' if ARGV.size == 1 dest = ARGV.pop lpaths = [] while((src = ARGV.shift)) src = uriparse src Net::FTP.open(src.host) do |ftp| ftp.debug_mode = true if debug ftp.login user, password ftp.passive = true ftp.binary = true paths = [] if src.path =~ %r|\*$|o dir = File::dirname(src.path) ftp.list(src.path) do |listing| path = listing.split(%r/\s+/o).last paths << File::join(dir, path) end else paths << src.path end paths.each do |path| lpath = if test ?d, dest File::join(dest, File::basename(path)) else dest end ftp.getbinaryfile path, lpath lpaths << lpath end end end y lpaths good luck. -a -- be kind whenever possible... it is always possible. - h.h. the 14th dali lama ---1400102478-397658438-1146755641=:24574 Content-Type: TEXT/PLAIN; charset=US-ASCII; name=ftpls Content-Transfer-Encoding: BASE64 Content-ID: Content-Description: Content-Disposition: attachment; filename=ftpls IyEvZG1zcC9yZWZlcmVuY2UvYmluL3J1YnkNCnJlcXVpcmUgIm5ldC9mdHAi DQpyZXF1aXJlICJ1cmkiDQoNCmRlZiB1cmlwYXJzZSB1cmkNCiAgdW5sZXNz IHVyaSA9fiAlci9eZnRwLw0KICAgIGhvc3QsIHBhdGggPSB1cmkuc3BsaXQg JXJ8Oi8rfG8NCiAgICBVUkk6OnBhcnNlICJmdHA6Ly8jeyBob3N0IH0vI3sg cGF0aCB9Ig0KICBlbHNlDQogICAgVVJJOjpwYXJzZSB1cmkNCiAgZW5kDQpl bmQNCg0KYWJvcnQgIiN7ICQwIH0gdXJpIFt1cmlzXSsiIGlmIEFSR1YuZW1w dHk/DQp1c2VyID0gRU5WWyJGVFBfVVNFUiJdIHx8ICJhbm9ueW1vdXMiDQpw YXNzd29yZCA9IEVOVlsiRlRQX1BBU1MiXSB8fCBFTlZbIkZUUF9QQVNTV09S RCJdIHx8ICJmb29AYmFyLm9yZyINCg0Kd2hpbGUoKHVyaSA9IEFSR1Yuc2hp ZnQpKQ0KICB1cmkgPSB1cmlwYXJzZSB1cmkgDQogIE5ldDo6RlRQLm9wZW4o dXJpLmhvc3QpIGRvIHxmdHB8DQogICAgZnRwLmxvZ2luIHVzZXIsIHBhc3N3 b3JkDQogICAgZnRwLnBhc3NpdmUgPSB0cnVlDQogICAgZnRwLmxpc3QodXJp LnBhdGggfHwgIi8iKXt8cGF0aHwgcHV0cyBwYXRofQ0KICBlbmQNCmVuZA0K ---1400102478-397658438-1146755641=:24574 Content-Type: TEXT/PLAIN; charset=US-ASCII; name=ftpput Content-Transfer-Encoding: BASE64 Content-ID: Content-Description: Content-Disposition: attachment; filename=ftpput IyEvZG1zcC9yZWZlcmVuY2UvYmluL3J1YnkNCnJlcXVpcmUgIm5ldC9mdHAi DQpyZXF1aXJlICJ1cmkiDQpyZXF1aXJlICJzb2NrZXQiDQpyZXF1aXJlICJ5 YW1sIg0KDQpkZWYgdXJpcGFyc2UgdXJpDQogIHVubGVzcyB1cmkgPX4gJXIv XmZ0cC8NCiAgICBob3N0LCBwYXRoID0gdXJpLnNwbGl0ICVyfDovK3xvDQog ICAgVVJJOjpwYXJzZSAiZnRwOi8vI3sgaG9zdCB9LyN7IHBhdGggfSINCiAg ZWxzZQ0KICAgIFVSSTo6cGFyc2UgdXJpDQogIGVuZA0KZW5kDQoNCmFib3J0 ICIjeyAkMCB9IHNyYyBbc3Jjc10rIGRzdHVyaSIgaWYgQVJHVi5lbXB0eT8N CnVzZXIgPSBFTlZbIkZUUF9VU0VSIl0gfHwgImFub255bW91cyINCnBhc3N3 b3JkID0gRU5WWyJGVFBfUEFTUyJdIHx8IEVOVlsiRlRQX1BBU1NXT1JEIl0g fHwgImZvb0BiYXIub3JnIg0KZGVidWcgPSBFTlZbIkZUUF9ERUJVRyJdDQpz cmNzLCB1cmkgPSBBUkdWWzAuLi0yXSwgQVJHVlstMV0NCg0KdXJpID0gdXJp cGFyc2UgdXJpIA0KaG9zdCwgaG9zdGRlc3QgPSB1cmkuaG9zdCwgdXJpLnBh dGgNCnJwYXRocyA9IFtdDQpob3N0bmFtZSwgcGlkID0gU29ja2V0OjpnZXRo b3N0bmFtZSwgUHJvY2Vzczo6cGlkDQoNCk5ldDo6RlRQLm9wZW4oaG9zdCkg ZG8gfGZ0cHwNCiAgZnRwLmRlYnVnX21vZGUgPSB0cnVlIGlmIGRlYnVnIA0K ICBmdHAubG9naW4gdXNlciwgcGFzc3dvcmQNCiAgZnRwLnBhc3NpdmUgPSB0 cnVlDQogIGZ0cC5iaW5hcnkgPSB0cnVlDQoNCiAgc3Jjcy5lYWNoIGRvIHxz cmN8DQogICAgZGVzdCA9IA0KICAgICAgaWYgaG9zdGRlc3QgPX4gJXJ8Lytc cyokfG8gb3Igc3Jjcy5zaXplID4gMQ0KICAgICAgICBGaWxlOjpqb2luKGhv c3RkZXN0LCBGaWxlOjpiYXNlbmFtZShzcmMpKQ0KICAgICAgZWxzZQ0KICAg ICAgICBob3N0ZGVzdA0KICAgICAgZW5kDQogICAgZGVzdGRpciA9IEZpbGU6 OmRpcm5hbWUgZGVzdA0KDQogICAgZGVzdGRpcnMgPSBbXQ0KICAgIGQgPSBu aWwgDQogICAgZGVzdGRpcnMudW5zaGlmdChkKSB3aGlsZSgoZCA9IEZpbGU6 OmRpcm5hbWUoZCB8fCBkZXN0KSkgIX4gJXJ8XlxzKi8rXHMqJHxvKQ0KDQog ICAgZGlybmFtZSwgYmFzZW5hbWUgPSBGaWxlOjpkaXJuYW1lKGRlc3QpLCBG aWxlOjpiYXNlbmFtZShkZXN0KQ0KICAgIHRtcCA9IEZpbGU6OmpvaW4oZGly bmFtZSwgIi4jeyBiYXNlbmFtZSB9LiN7IGhvc3RuYW1lIH0uI3sgcGlkIH0u ZnRwIikNCg0KICAgIGlmIGRlYnVnDQogICAgICBzdGF0ZSA9IDw8LWVvcw0K ICAgICAgfEBzcmMgPCN7IHNyYyB9Pg0KICAgICAgfEBob3N0IDwjeyBob3N0 IH0+DQogICAgICB8QGRlc3QgPCN7IGRlc3QgfT4NCiAgICAgIHxAZGVzdGRp ciA8I3sgZGVzdGRpciB9Pg0KICAgICAgfEBkZXN0ZGlycyA8I3sgZGVzdGRp cnMuaW5zcGVjdCB9Pg0KICAgICAgfEB0bXAgPCN7IHRtcC5pbnNwZWN0IH0+ DQogICAgICBlb3MNCiAgICAgIHN0YXRlLmdzdWIhKCVyL15ccypcfC9vLCcn KQ0KICAgICAgcHV0cyBzdGF0ZQ0KICAgIGVuZA0KDQogICAgZGVzdGRpcnMu ZWFjaHt8ZHwgYmVnaW47IGZ0cC5ta2RpciBkOyByZXNjdWUgTmV0OjpGVFBQ ZXJtRXJyb3I7IGVuZH0NCiAgICBmdHAucHV0YmluYXJ5ZmlsZSBzcmMsIHRt cCANCiAgICBmdHAucmVuYW1lIHRtcCwgZGVzdA0KICAgIHJwYXRocyA8PCBk ZXN0DQogIGVuZA0KZW5kDQoNCnkgcnBhdGhzDQo= ---1400102478-397658438-1146755641=:24574 Content-Type: TEXT/PLAIN; charset=US-ASCII; name=ftpget Content-Transfer-Encoding: BASE64 Content-ID: Content-Description: Content-Disposition: attachment; filename=ftpget IyEvZG1zcC9yZWZlcmVuY2UvYmluL3J1YnkNCnJlcXVpcmUgJ25ldC9mdHAn DQpyZXF1aXJlICd1cmknDQpyZXF1aXJlICd5YW1sJw0KDQpkZWYgdXJpcGFy c2UgdXJpDQogIHVubGVzcyB1cmkgPX4gJXIvXmZ0cC8NCiAgICBob3N0LCBw YXRoID0gdXJpLnNwbGl0ICVyfDovK3xvDQogICAgVVJJOjpwYXJzZSAiZnRw Oi8vI3sgaG9zdCB9LyN7IHBhdGggfSINCiAgZWxzZQ0KICAgIFVSSTo6cGFy c2UgdXJpDQogIGVuZA0KZW5kDQoNCmFib3J0ICIjeyAkMCB9IHNyY3VyaSBb c3JjdXJpc10rIGRzdCIgaWYgQVJHVi5lbXB0eT8NCnVzZXIgPSBFTlZbIkZU UF9VU0VSIl0gfHwgImFub255bW91cyINCnBhc3N3b3JkID0gRU5WWyJGVFBf UEFTUyJdIHx8IEVOVlsiRlRQX1BBU1NXT1JEIl0gfHwgImZvb0BiYXIub3Jn Ig0KZGVidWcgPSBFTlZbJ0ZUUF9ERUJVRyddDQoNCkFSR1YgPDwgJy4nIGlm IEFSR1Yuc2l6ZSA9PSAxDQpkZXN0ID0gQVJHVi5wb3ANCmxwYXRocyA9IFtd DQoNCndoaWxlKChzcmMgPSBBUkdWLnNoaWZ0KSkNCiAgc3JjID0gdXJpcGFy c2Ugc3JjIA0KICBOZXQ6OkZUUC5vcGVuKHNyYy5ob3N0KSBkbyB8ZnRwfA0K ICAgIGZ0cC5kZWJ1Z19tb2RlID0gdHJ1ZSBpZiBkZWJ1ZyANCiAgICBmdHAu bG9naW4gdXNlciwgcGFzc3dvcmQNCiAgICBmdHAucGFzc2l2ZSA9IHRydWUN CiAgICBmdHAuYmluYXJ5ID0gdHJ1ZQ0KDQogICAgcGF0aHMgPSBbXQ0KDQog ICAgaWYgc3JjLnBhdGggPX4gJXJ8XCokfG8NCiAgICAgIGRpciA9IEZpbGU6 OmRpcm5hbWUoc3JjLnBhdGgpDQogICAgICBmdHAubGlzdChzcmMucGF0aCkg ZG8gfGxpc3Rpbmd8DQogICAgICAgIHBhdGggPSBsaXN0aW5nLnNwbGl0KCVy L1xzKy9vKS5sYXN0DQogICAgICAgIHBhdGhzIDw8IEZpbGU6OmpvaW4oZGly LCBwYXRoKQ0KICAgICAgZW5kDQogICAgZWxzZQ0KICAgICAgcGF0aHMgPDwg c3JjLnBhdGgNCiAgICBlbmQNCg0KICAgIHBhdGhzLmVhY2ggZG8gfHBhdGh8 DQogICAgICBscGF0aCA9DQogICAgICAgIGlmIHRlc3QgP2QsIGRlc3QNCiAg ICAgICAgICBGaWxlOjpqb2luKGRlc3QsIEZpbGU6OmJhc2VuYW1lKHBhdGgp KQ0KICAgICAgICBlbHNlDQogICAgICAgICAgZGVzdA0KICAgICAgICBlbmQN CiAgICAgIGZ0cC5nZXRiaW5hcnlmaWxlIHBhdGgsIGxwYXRoIA0KICAgICAg bHBhdGhzIDw8IGxwYXRoDQogICAgZW5kDQogIGVuZA0KZW5kDQoNCnkgbHBh dGhzDQo= ---1400102478-397658438-1146755641=:24574-- ---1400102478-397658438-1146755641=:24574--