如何使用具有特殊字符的用户名或密码解析FTP URL?

时间:2012-01-08 18:46:27

标签: ruby ftp uri url-encoding

我正在尝试解析用户名和密码中包含@等特殊字符的FTP URL:

username:p@sswrd@ftp.myhost.com/mypath

当我尝试:

URI.parse(url)

我明白了:

  

URI :: InvalidURIError:方案ftp不接受注册表部分:用户名:p @ sswrd @ ftp.myhost.com(或错误的主机名?)

然后,我尝试对网址进行编码:

url = URI.encode(url, '@')

但也有另一个错误:

  

URI :: InvalidURIError:方案ftp不接受注册表部分:用户名:p%40sswrd%40ftp.myhost.com(或错误的主机名?)

最后,我尝试了另一种解决方案:

URI::FTP.build(:userinfo => 'username:p@sswrd', :host=>'ftp.myhost.com', :path => '/mypath')

但我也有错误:

  

URI :: InvalidComponentError:坏组件(预期的用户组件):p @ ssword

我使用的是ruby 1.8.7。

4 个答案:

答案 0 :(得分:1)

require 'net/ftp'
ftp=Net::FTP.new
ftp.connect("ftp.myhost.com",21)
ftp.login("username","p@sswd")
ftp.getbinaryfile("/mypath"){|data| puts data}
ftp.close

答案 1 :(得分:0)

如果你的ftp服务器支持unicode:

URI::FTP.build(:userinfo => 'username:p%00%40sswrd', :host=>'ftp.myhost.com', :path => '/mypath')

应该有效。如this discussion所示。

但只是意识到你尝试过编码而且失败了。遗憾。

答案 2 :(得分:0)

我需要设置被动模式,因为我收到以下错误:

425 Could not open data connection to port XXXXX: Connection timed out

我是这样做的:

require 'net/ftp'
ftp = Net::FTP.new
ftp.passive = true
ftp.connect("ftp.myhost.com",21)
ftp.login("username","p@sswd")
ftp.getbinaryfile("/mypath"){|data| puts data}
ftp.close

答案 3 :(得分:0)

我能够解析ftp网址并像这样打开它:

ftp_regex = /\/\/(.*)?\:(.*)?@([^\/]*)?\/(.*)/
user, password, host, path = ftp_file_url.match(ftp_regex).captures

ftp = Net::FTP.new
ftp.connect(host, 21)
ftp.login(user, password)
ftp.passive = true
file = ftp.getbinaryfile(path, nil)