【问题标题】:Ruby NET::SCP containing WildcardRuby NET::SCP 包含通配符
【发布时间】:2013-06-01 18:19:14
【问题描述】:

我需要每天从我有 SCP 但没有 SSH 访问权限的客户端下载文件。

文件名将始终为/outgoing/Extract/visit_[date]-[timestamp].dat.gz'

例如昨天的文件被称为visits_20130604-090003.dat.gz

我不能依赖时间戳总是相同的事实,但日期应该总是昨天的日期:

到目前为止我的设置:

我的主目录包含名为 downloads_fullnamedownloads_wildcard 的子目录。

它还包含一个名为 foo.rb 的简单 ruby​​ 脚本。

foo.rb的内容是这个`

#! /usr/bin/ruby
require 'net/ssh'
require 'net/scp'
yesterday = (Time.now - 86400).strftime('%Y%m%d')

Net::SCP.start('hostname', 'username') do |scp|
  scp.download!('/outgoing/Extract/visits_' + yesterday + '-090003.dat.gz', 'downloads_fullname')
  scp.download!('/outgoing/Extract/visits_' + yesterday + '-*.dat.gz', 'downloads_wildcard')
end

运行时downloads_fullname 目录包含文件,但downloads_wildcard 目录不包含。

有没有办法在 Net::SCP 中使用通配符?或者有人有任何狡猾的解决方法吗?我试过\*无济于事。

【问题讨论】:

    标签: ruby scp net-ssh


    【解决方案1】:

    谢谢铁皮人!!!

    对其他人来说,这是我最终遵循 Tin Man 的代码:

    (试图将其作为评论发布,但存在格式问题)

    #! /usr/bin/ruby
    require 'net/sftp'
    yesterday = (Time.now - 86400).strftime('%Y%m%d')
    
    Net::SFTP.start('hostname', 'username') do |sftp|
      sftp.dir.foreach("/outgoing/Extract") do |file|
         if file.name.include? '_' + yesterday + '-'
           sftp.download!('/outgoing/Extract/' + file.name, 'downloads/'+ file.name)
         end
      end
    end
    

    【讨论】:

      【解决方案2】:

      我不认为你可以使用 scp 到达那里,因为它希望你确切地知道你想要哪个文件,但是 sftp 会让你得到一个目录列表。

      您可以使用Net::SFTP 以编程方式选择您的文件并请求它。这是示例代码:

      需要'net/sftp' Net::SFTP.start('host', 'username', :password => 'password') 做 |sftp| # 上传文件或目录到远程主机 sftp.upload!("/path/to/local", "/path/to/remote") # 从远程主机下载文件或目录 sftp.download!("/path/to/remote", "/path/to/local") # 从远程主机上直接抓取数据到缓冲区 data = sftp.download!("/path/to/remote") # 打开并写入远程文件的伪 IO sftp.file.open("/path/to/remote", "w") 做 |f| f.puts "你好,世界!\n" 结尾 # 打开并从伪 IO 读取远程文件 sftp.file.open("/path/to/remote", "r") 做 |f| 放 f.gets 结尾 # 创建目录 sftp.mkdir! “/路径/到/目录” # 列出目录中的条目 sftp.dir.foreach("/path/to/directory") 做 |entry| puts entry.longname 结尾 结尾

      基于此,您可以列出目录条目,然后使用findselect 遍历返回的列表以找到具有当前日期的列表。将该文件名传递给 sftp.download! 以将其下载到本地文件。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-10-21
        • 2013-03-29
        • 1970-01-01
        • 1970-01-01
        • 2013-11-16
        • 2023-03-06
        • 1970-01-01
        相关资源
        最近更新 更多