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('ホスト', 'ユーザー名', :パスワード => 'パスワード') do |sftp|
  # ファイルまたはディレクトリをリモート ホストにアップロードする
  sftp.upload!("/path/to/local", "/path/to/remote")

  # リモート ホストからファイルまたはディレクトリをダウンロードする
  sftp.download!("/path/to/remote", "/path/to/local")

  # リモートホストからバッファに直接データを取り込みます
  データ = sftp.download!("/パス/to/リモート")

  # リモートファイルの疑似 IO を開いて書き込む
  sftp.file.open("/パス/to/リモート", "w") do |f|
    f.puts "Hello, world!\n"
  終わり

  # リモートファイルの疑似 IO を開いて読み込む
  sftp.file.open("/path/to/remote", "r") do |f|
    puts f.gets
  終わり

  # ディレクトリを作成する
  sftp.mkdir! 「/パス/to/ディレクトリ」

  # ディレクトリ内のエントリを一覧表示する
  sftp.dir.foreach("/path/to/directory") do |entry|
    entry.longname を入力します
  終わり
終わり

それに基づいて、ディレクトリ エントリを一覧表示してから、findまたはを使用selectして、返されたリストを反復処理し、現在の日付のものを見つけます。そのファイル名を に渡してsftp.download!、ローカル ファイルにダウンロードします。

于 2013-06-05T22:41:00.403 に答える