2010-11-25 5 views
3

Ich versuche ein Programm mit Ruby (und Net :: SSH) zu erstellen, um eine Verbindung zu Servern herzustellen und einige Aufgaben auszuführen. Die Einzelheiten des Servers sind wie vorgesehen, wie etwas sein:Wie verarbeite ich eine URL in Ruby, um die Komponenten (Schema, Benutzername, Passwort, Host, etc) zu extrahieren?

ssh://user:[email protected]:port (for a host that does not yet have SSH keys) 

oder

[email protected] 

Net :: SSH erwartet das folgende Format:

Net::SSH.start('host', 'user', :password => "password") 

Gibt es sind gem/stdlib das kann die URL in dieses Format verarbeiten? Oder eine einfache Regex, die die verschiedenen Teile zusammenbringen kann?

Hinweis: Ich kenne und benutze capistrano, aber in diesem Fall brauche ich niedrigere Kontrolle.

Antwort

11

Sowohl URI als auch Addressable::URI können URLs analysieren und in ihre Komponenten zerlegen.

URI ist in Rubys Standard-Bibliothek enthalten, das ist nett, aber Adressable :: URI hat mehr Funktionen, und das ist, was ich verwende, wenn ich viel Arbeit mit URLs zu tun habe.

require 'addressable/uri' 

uri = Addressable::URI.parse('ssh://user:[email protected]:81') 
uri.host # => "www.example.com" 
uri.user # => "user" 
uri.password # => "pass" 
uri.scheme # => "ssh" 
uri.port # => 81 

require 'uri' 
uri = URI.parse('ssh://user:[email protected]:81') 
uri.host # => "www.example.com" 
uri.user # => "user" 
uri.password # => "pass" 
uri.scheme # => "ssh" 
uri.port # => 81 
+0

URI funktioniert anscheinend nicht, wenn nur 'user @ host' obwohl gegeben. Was erklärt, wie ich es gestern versucht habe, bevor ich die Frage gestellt habe und dachte, dass es die Komponenten nicht extrahiert hat. (Nach dem Testen - weder adressierbar/uri) –

+1

'Benutzer @ Host' ist nicht genug Info für die Parser, etwas Nützliches zu tun. Es könnte als E-Mail-Adressfragment oder als Benutzer eines Hostfragments interpretiert werden. Da es zweideutig ist, möchte ich, dass die Parser ablegen. Sie könnten das leicht genug erfassen und analysieren und das fehlende Schema ("ssh:") liefern, aber das liegt daran, dass Sie spezielle Kenntnisse über das Problem haben, die die Parser nicht haben. –

+0

Stimmt, das habe ich heute Morgen gedacht. –

0

Es gibt eine URI Klasse, die helfen sollte. Möglicherweise müssen Sie zuerst das ssh Schema durch http manuell ersetzen, aber ich glaube nicht, URI versteht die ssh Schema aus der Box.