2013-06-05 17 views
5

Ho bisogno di scaricare un file al giorno da un client che ho SCP ma non SSH accesso a.Ruby NET :: SCP contenente caratteri jolly

Il nome del file sarà sempre /outgoing/Extract/visit_[date]-[timestamp].dat.gz'

Ad esempio di file di ieri è stato chiamato visits_20130604-090003.dat.gz

non può fare affidamento sul fatto che il timestamp sarà sempre lo stesso, ma la data deve essere sempre di ieri data:

mio istituito finora:

La mia home directory contiene al sub-directory di nome downloads_fullname e downloads_wildcard.

Contiene anche un semplice script rubino denominato foo.rb.

Il contenuto di foo.rb sono 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 

Quando esegue la directory downloads_fullname contiene il file, ma la directory downloads_wildcard non lo fa.

C'è un modo per utilizzare caratteri jolly in Net :: SCP? O qualcuno ha qualche astuzia? Ho provato \* inutilmente.

risposta

3

Non penso che ci si possa arrivare usando scp perché si aspetta che tu sappia esattamente quale file vuoi, ma sftp ti permetterà di ottenere un elenco di directory.

È possibile utilizzare Net::SFTP per prelevare a livello di codice il file e richiederlo. Questo è il codice di esempio:

 
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 

Sulla base di che è possibile elencare le voci della rubrica quindi utilizzare find o select per scorrere l'elenco restituito per trovare quello con la data corrente. Passa il nome file a sftp.download! per scaricarlo in un file locale.

4

Grazie Tin Man !!!

Per chiunque altro, ecco il codice ho finito con seguente piombo Tin Man:

(problemi provato a pubblicarlo come un commento, ma era di formattazione)

#! /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