我需要每天从我有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
Run Code Online (Sandbox Code Playgroud)
运行时,downloads_fullname目录包含该文件,但该downloads_wildcard目录不包含该文件.
有没有办法在Net :: SCP中使用通配符?或者有人有任何狡猾的解决方法吗?我试着\*无济于事.
我不认为你可以使用 scp 到达那里,因为它希望你确切地知道你想要哪个文件,但 sftp 会让你获得目录列表。
您可以使用Net::SFTP以编程方式选择文件并请求它。这是示例代码:
需要“net/sftp”
Net::SFTP.start('主机', '用户名', :password => '密码') do |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") do |f|
f.puts “你好,世界!\n”
结尾
# 打开并从伪 IO 读取远程文件
sftp.file.open("/path/to/remote", "r") 做 |f|
放置 f.gets
结尾
# 创建一个目录
sftp.mkdir!“/路径/到/目录”
# 列出目录中的条目
sftp.dir.foreach("/path/to/directory") do |entry|
放置条目.longname
结尾
结尾
基于此,您可以列出目录条目,然后使用find或select迭代返回的列表以查找具有当前日期的条目。将该文件名传递给sftp.download!以将其下载到本地文件。