2013-06-05 7 views
5

Мне нужно ежедневно скачивать файл с клиента, который у меня есть SCP, но не SSH доступ к.Ruby NET :: SCP, содержащий Wildcard

Имя файла всегда будет /outgoing/Extract/visit_[date]-[timestamp].dat.gz'

Для примера файла вчера был назван visits_20130604-090003.dat.gz

Я не могу рассчитывать на то, что метка времени всегда будет то же самое, но дата всегда должна быть вчера дата:

Мои настройки до сих пор:

Мой домашний каталог содержит в поддиректории имени downloads_fullname и downloads_wildcard.

Он также содержит простой рубиновый скрипт с именем foo.rb.

Содержание foo.rb являются this`

#! /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? Или у кого-нибудь есть хитрые обходные пути? Я пробовал \* безрезультатно.

ответ

3

Я не думаю, что вы можете попасть туда с помощью scp, потому что он ожидает, что вы точно знаете, какой файл вы хотите, но sftp позволит вам получить список каталогов.

Вы можете использовать Net::SFTP, чтобы программно выбрать файл и запросить его. Это пример кода:

 
require 'net/sftp' 

Net::SFTP.start('host', 'username', :password => 'password') do |sftp| 
    # upload a file or directory to the remote host 
    sftp.upload!("/path/to/local", "/path/to/remote") 

    # download a file or directory from the remote host 
    sftp.download!("/path/to/remote", "/path/to/local") 

    # grab data off the remote host directly to a buffer 
    data = sftp.download!("/path/to/remote") 

    # open and write to a pseudo-IO for a remote file 
    sftp.file.open("/path/to/remote", "w") do |f| 
    f.puts "Hello, world!\n" 
    end 

    # open and read from a pseudo-IO for a remote file 
    sftp.file.open("/path/to/remote", "r") do |f| 
    puts f.gets 
    end 

    # create a directory 
    sftp.mkdir! "/path/to/directory" 

    # list the entries in a directory 
    sftp.dir.foreach("/path/to/directory") do |entry| 
    puts entry.longname 
    end 
end 

Основываясь на том, что вы можете перечислить записи каталога используйте find или select перебрать возвращаемый список, чтобы найти тот, с текущей датой. Передайте это имя файла sftp.download!, чтобы загрузить его в локальный файл.

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 
Смежные вопросы