【问题标题】:How do I process a URL in ruby to extract the component parts (scheme, username, password, host, etc)?如何处理 ruby​​ 中的 URL 以提取组件部分(方案、用户名、密码、主机等)?
【发布时间】:2020-01-04 21:11:14
【问题描述】:

我正在尝试使用 ruby​​(和 Net::SSH)创建一个程序来连接服务器并执行一些任务。服务器的详细信息将提供如下:

ssh://user:pass@host:port (for a host that does not yet have SSH keys)

user@host

Net::SSH 需要以下格式:

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

是否有可以将 URL 处理成这种格式的 gem/stdlib?还是可以匹配不同部分的简单正则表达式?

注意:我知道并使用 capistrano,但在这种情况下,我需要较低级别的控制。

【问题讨论】:

    标签: ruby url net-ssh


    【解决方案1】:

    URIAddressable::URI 都可以解析 URL 并让您将它们分解为它们的组件。

    URI 包含在 Ruby 的标准库中,这很好,但 Addressable::URI 具有更多功能,当我必须对 URL 做大量工作时,我会使用它。

    require 'addressable/uri'
    
    uri = Addressable::URI.parse('ssh://user:pass@www.example.com: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:pass@www.example.com:81')
    uri.host # => "www.example.com"
    uri.user # => "user"
    uri.password # => "pass"
    uri.scheme # => "ssh"
    uri.port # => 81
    

    【讨论】:

    • URI 显然在仅给出 'user@host' 时不起作用。这解释了我昨天是如何设法尝试它的,然后我问了这个问题并认为它没有提取组件。 (经过测试——addressable/uri 也没有)
    • 'user@host' 信息不足以让解析器做任何有用的事情。它可以被解释为电子邮件地址片段,或主机片段中的用户。因为它模棱两可,我希望解析器保释。你可以很容易地感知和解析它并提供缺失的方案(“ssh:”),但那是因为你对解析器没有的问题有特殊的了解。
    • 没错,我今天早上就是这么想的。
    • 总而言之,删除 URL 通常并不难,我们可以使用简单的正则表达式,但是当我们处理任意 URL 或不受控制的查询列表时,我们会遇到麻烦,正则表达式模式崩溃,应用程序死亡。解析器会发光。
    猜你喜欢
    • 1970-01-01
    • 2010-11-24
    • 1970-01-01
    • 2014-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-24
    • 2013-07-24
    相关资源
    最近更新 更多