如何将文件从一台服务器复制到另一台服务器?

时间:2012-01-04 14:55:06

标签: ruby

我有一台服务器只有xls日志文件。每个文件都是5-15Mb,并且在任何时候都可以添加文件的意义上它是动态的。现在我需要一种方法来使用Ruby进行以下过程。

  1. 通过从一台服务器发送文件名来复制文件,该服务器只有日志文件,只能发送到另一台服务器。
  2. 我需要将服务器密码作为参数传递。
  3. 后台发生的一切都是从Ruby脚本触发的。

4 个答案:

答案 0 :(得分:10)

查看Net::SCPNet::SSH宝石。第一个允许您使用安全副本检索文件,第二个允许您轻松找到可供检索的文件的名称。在Net :: SSH中,ssh.exec!将是您的朋友。

来自Net::SCP文档:

  

Net :: SCP实现了SCP(Secure CoPy)客户端协议,允许Ruby程序安全地以编程方式将单个文件或整个目录树传输到远程服务器或从远程服务器传输。它支持在同一连接上并行工作的多个同时SCP副本,以及同步,串行副本。

     

Net :: SCP还提供了一个open-uri绑定,因此您可以使用Kernel#open方法打开并读取远程文件:

  # if you want to read from a URL voa SCP:
  require 'uri/open-scp'
  puts open("scp://user@remote.host/path/to/file").read

来自Net::SSH文档:

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::SFTP代替使用Net :: SCP和Net :: SSH,在一个gem中管理它。它也依赖于安全连接,但您可能无法使用SFTP。 Net::SFTP::Operations::DirNet::SFTP::Operations::Download课程和文档将成为您的朋友。

其他选项包括在@tadman提到的简单shell中使用标准rsync。有很多种方法可以实现这一点,这是托管环境中的常见需求。


  

还有其他更好的方法吗?

rsync,在命令行。它非常智能,可以根据需要移动文件夹和文件的增量。此外,“How to transfer files using ssh and Ruby”及其与“Ruby file upload ssh intro”的链接。

Melding @ tadman对Ruby的rsync推荐,有“Cheapest rsync replacement (with Ruby)”。

答案 1 :(得分:4)

这就是它的工作方式

我用过net-ssh& @theTinMan建议的net-scp gem,我能够复制我的文件。

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

答案 2 :(得分:1)

您应该只使用rsync而不是滚动自己的东西。使用公共/私钥访问ssh,您将避免使用密码。完全使用密码可能是一个坏主意。

答案 3 :(得分: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