2013-06-05 15 views
5

Ich brauche eine Datei täglich von einem Client, den ich habe SCP aber nicht SSH Zugriff auf.Ruby NET :: SCP enthält Wildcard

Der Dateiname wird immer /outgoing/Extract/visit_[date]-[timestamp].dat.gz' sein

Zum Beispiel yesterdays Datei visits_20130604-090003.dat.gz

genannt wurde ich nicht darauf verlassen kann, dass der Zeitstempel immer das gleiche sein wird, aber soll das Datum immer yesterdays seinem Datum:

Mein aufgebaut bisher:

My Home-Verzeichnis Unterverzeichnisse enthält downloads_fullname und downloads_wildcard benannt.

Es enthält auch ein einfaches Ruby-Skript mit dem Namen foo.rb.

Der Inhalt foo.rb sind 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 

das downloads_fullname Verzeichnis enthält die Datei Sobald er ausgeführt wird, aber das downloads_wildcard Verzeichnis nicht.

Gibt es eine Möglichkeit, Platzhalterzeichen in Net :: SCP zu verwenden? Oder hat jemand schlaue Umwege? Ich versuchte \* ohne Erfolg.

Antwort

3

Ich glaube nicht, dass Sie mit scp dorthin gelangen können, weil Sie erwarten, dass Sie genau wissen, welche Datei Sie wollen, aber sftp lässt Sie eine Verzeichnisliste bekommen.

Sie können Net::SFTP verwenden, um Ihre Datei programmgesteuert auszuwählen und anzufordern. Dies ist der Beispielcode:

 
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 

auf dieser Grundlage Sie die Verzeichniseinträge dann find oder select verwenden Liste kann über die zurückgegebene Liste zu durchlaufen, die eine mit dem aktuellen Datum zu finden. Übergeben Sie diesen Dateinamen an sftp.download!, um es in eine lokale Datei herunterzuladen.

4

Danke Tin Man !!!

Für alle anderen, hier ist der Code, den ich mit folgenden Tin Man Führung endete:

(Versuchte es als Kommentar zu posten, aber hatte Formatierungsprobleme)

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