6

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

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

例如昨天的文件被调用visits_20130604-090003.dat.gz

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

到目前为止我的设置:

我的主目录包含名为downloads_fullname和的子目录downloads_wildcard

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

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 中使用通配符?或者有人有任何狡猾的解决方法吗?我试过\*无济于事。

4

2 回答 2

4

谢谢铁男!!!

对其他人来说,这是我最终遵循 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
于 2013-06-05T23:39:35.403 回答
3

我不认为你可以使用 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!其下载到本地文件。

于 2013-06-05T22:41:00.403 回答