2016-09-24 24 views
2

我想从远程主机/root/files/*.log所有文件复制到我的当前目录 - ./files1/如何使用Ruby Net :: SSH.start传输多个文件?

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

Net::SSH.start(scp_hostname, scp_username, :keys => scp_keys, :timeout => 360) do |ssh| 
    ssh.scp.download!('/root/files/*.log', './files1/') 
    ssh.exec!(..) 
    ssh.exec!(..) 
end 

我有一个例外:

caught exception SCP did not finish successfully (1): scp: /root/files/*.log: No such file or directory 

但它工作时,我复制一个特定的文件

ssh.scp.download!('/root/files/myfile.log', './files1/') 

任何人都可以帮忙吗?

谢谢!

回答

1

我会建议使用net sftp,因为它允许更优雅的globing目录。在这里:

require 'net/sftp' 
Net::SFTP.start(scp_hostname, scp_username, :keys => scp_keys, :timeout => 360) do |sftp| 
    sftp.dir.glob("/remote/path", "*.log") do |file| 
     sftp.download!("/remote/path/#{file.name}", "./files1/#{file.name}") 
    end 
end 

或SSH可以使用下面的技巧:

Net::SSH.start(scp_hostname, scp_username, :keys => scp_keys) do |ssh| 
    logfiles = ssh.exec!('ls /remote/path/*.log').split 
    logfiles.each { |file| 
    ssh.scp.download!(file, file) 
    } 
end 
+0

的感谢!我感谢你的回答!我喜欢你的诀窍:) – Berlin

0

你也可以使用没有任何红宝石宝石。使用scp命令。

SCP

scp source_file_name [email protected]_host:destination_folder 

或者

scp [email protected]:/file/to/send /where/to/put 

编辑更新的基本语法

只是删除timeout选项会帮助你!并使用:recursive => true选项。

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

Net::SSH.start(scp_hostname, scp_username, :keys => scp_keys) do |ssh| 
    ssh.scp.download!('/root/files/*.log', './files1/', :recursive => true) 
    ssh.exec!(..) 
    ssh.exec!(..) 
end 

希望这对你有所帮助!