Как я могу разобрать URL FTP с именем пользователя или паролем, имеющим специальные символы? - PullRequest
4 голосов
/ 08 января 2012

Я пытаюсь проанализировать URL-адрес FTP, который содержит некоторые специальные символы, такие как @ в имени пользователя и пароле:

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

Когда я пытаюсь:

URI.parse(url)

, я получаю:

URI :: InvalidURIError: схема ftp не принимает часть реестра: имя пользователя: p @ sswrd @ ftp.myhost.com (или неверное имя хоста?)

Затем я попытался закодировать URL:

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 ]

1 голос
/ 09 января 2012
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
0 голосов
/ 11 марта 2019

Мне удалось проанализировать URL-адрес 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)
0 голосов
/ 16 июля 2012

Мне нужно было установить пассивный режим, поскольку я получал следующую ошибку:

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
0 голосов
/ 09 января 2012

Если ваш ftp-сервер поддерживает Unicode:

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

должно работать.Как указано в этом обсуждении .

Но только что понял, что вы пытались кодировать, и это не удалось.К сожалению.

...