2012-01-04 17 views
5

xlsログファイルだけを持つサーバーが1台あります。各ファイルは5〜15MBで、ファイルがいつでも追加されるという意味では動的です。今私はRubyを使って以下のプロセスを行う方法が必要です。あるサーバーから別のサーバーにファイルをコピーするにはどうすればよいですか?

  1. ログファイル以外のサーバーから別のサーバーにファイル名を送信してファイルをコピーします。
  2. サーバーパスワードを引数として渡す必要があります。
  3. すべてがバックグラウンドで発生します。これはRubyスクリプトからトリガされます。

答えて

4

これは@theTinManにより示唆されるように、私はネットのssh &ネット-SCPの宝石を使用し、私は自分のファイルをコピーすることができました

を働いていた方法です。

require 'rubygems' 
require 'net/ssh' 
require 'net/scp' 

Net::SSH.start("ip_address", "username",:password => "*********") do |session| 
    session.scp.download! "/home/logfiles/2-1-2012/login.xls", "/home/anil/Downloads" 
end 

とコピーにフォルダ全体

require 'rubygems' 
require 'net/ssh' 
require 'net/scp' 

Net::SSH.start("ip_address", "username",:password => "*********") do |session| 
    session.scp.download!("/home/logfiles/2-1-2012", "/home/anil/Downloads", :recursive => true) 
end 
1

あなた自身のものを転がす代わりに、おそらくrsyncを使用してください。 sshをパブリック/プライベートキーアクセスで使用すると、パスワードを避けることができます。パスワードをまったく使用することは、おそらく悪い考えです。

+0

なしに可能であるようです。パスワードを扱うのは苦痛ですが、セキュリティポリシーの一部でもあります。 –

+1

一部の企業では、IT部門にトロールをスタッフが雇っています。パスワードは推測できます。鍵は盗まれなければならない。 – tadman

+0

そうかもしれません。実際には、パスワードが必要な場所もあります。 –

10

Net::SCPNet::SSHの宝石をご覧ください。第1の方法では、安全なコピーを使用してファイルを取り出すことができます.2番目の方法では、取り出せるファイルの名前を簡単に見つけることができます。 Net :: SSHでは、ssh.exec!があなたの友人になります。 Net::SCPドキュメントから

ネット:: SCPは、Rubyプログラムがしっかりしてプログラム的に、リモートサーバから個々のファイルまたはディレクトリツリー全体を転送することができ、SCP(セキュアコピー)クライアントプロトコルを実装しています。これは、同じ接続上で並行して動作する複数の同時SCPコピーをサポートし、同期シリアルコピーもサポートします。 Net::SSHドキュメントから

 
    # if you want to read from a URL voa SCP: 
    require 'uri/open-scp' 
    puts open("scp://[email protected]/path/to/file").read 

ネット:: SCPはまた、オープン-URIをタイで、開くとリモートファイルを読むためにカーネル#openメソッドを使用できるように提供して

require 'net/ssh' 

Net::SSH.start('host', 'user', :password => "password") do |ssh| 
    # capture all stderr and stdout output from a remote process 
    output = ssh.exec!("hostname") 

上記のコードにendを追加してブロックを閉じます。ブロック内には、outputには送信したコマンドの結果が含まれます。

ファイルを含むマシンからRuby経由でファイルを取得する代わりに、Rubyがファイルをホストしているマシンから直接転送を開始し、scp経由で他のマシンに転送するようにすることもできます。

Net :: SCPとNet :: SSHを使用する代わりに、Net::SFTPを使用してすべてを1つのgemで管理できます。安全な接続もありますが、SFTPは利用できない可能性があります。 Net::SFTP::Operations::DirNet::SFTP::Operations::Downloadのクラスとドキュメントがあなたの友人になります。

その他のオプションには、標準のrsyncを@tadmanというシンプルなシェルで使用するオプションがあります。これを達成する方法は数多くあり、ホスティング環境では一般的な必要性があります。


、他のより良い方法?

rsync、コマンドラインで。非常にスマートで、必要に応じてファイルのフォルダやデルタを移動できます。また、 "How to transfer files using ssh and Ruby"とそのリンクは "Ruby file upload ssh intro"です。

Rubyでの融資@ tadmanのrsyncの推奨事項は、「Cheapest rsync replacement (with Ruby)」です。

+0

ボスは私の日を救った。 net/sshが動作しました。問題のコードを追加していただきありがとうございます。 –

+1

彼があなたを助けた場合、あなたは質問を受け入れるべきです(投票ボタンの下に小さな目盛り)、それは良いSOのエチケットです。 –

+0

@theTinManこれは1つのファイルで動作します。フォルダ全体をコピーする方法はありますか?上記の宝石で試しましたが、SCPは正常終了しました(Net :: SCP :: Error) –

0

それは一部の企業は、キーのアクセスを許可していないSCP

@session = Net::SSH.start(@ftpIp, @ftpUser, :password => @ftpPass) 
@conn = Net::SFTP::Session.new(@session).connect! 

def download_remote_folder(remote_path, local_path, use_ssh = @use_ssh) 
    @conn ||= connect 
    if (use_ssh) 
     @conn.download!(remote_path,local_path,:recursive => true) 
    else 
     @conn.get(remote_path, local_path) 
    end 
    end 

    def download_remote_file(remote_path, local_path, use_ssh = @use_ssh) 
    @conn ||= connect 
    if (use_ssh) 
     @conn.download!(remote_path,local_path) 
    else 
     @conn.get_file(remote_path, local_path) 
    end 
    end 
関連する問題