2012-01-04 13 views
5

Tengo un servidor que no tiene más que archivos de registro xls. Cada archivo es de 5-15Mb y es dinámico en el sentido de que los archivos se agregan en cualquier momento. Ahora necesito una forma de hacer el siguiente proceso usando Ruby.¿Cómo copio un archivo de un servidor a otro?

  1. Copie un archivo enviando el nombre de archivo de un servidor que no tenga más que archivos de registro a otro servidor.
  2. Necesito pasar la contraseña del servidor como argumento.
  3. Todo sucede en el fondo, que se desencadena desde un script de Ruby.

Respuesta

4

Esta es la forma en que trabajó

que utiliza la red de ssh-& net-SCP joya como lo sugiere @theTinMan y yo era capaz de copiar mis archivos.

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 

y una copia de una carpeta entera

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

Probablemente deberías usar rsync en lugar de rodar tu propio dispositivo. Use ssh con acceso a clave pública/privada y evitará una contraseña. Usar una contraseña es probablemente una mala idea.

+0

Algunas compañías no permiten el acceso clave. Es un dolor tener que lidiar con contraseñas, pero también es parte de su política de seguridad. –

+1

Algunas empresas tienen departamentos de TI dotados de trolls también. Las contraseñas pueden adivinarse. Las llaves tienen que ser robadas. – tadman

+0

Eso puede ser. El hecho es que algunos lugares requieren contraseñas. –

10

Echa un vistazo a las gemas Net::SCP y Net::SSH. El primero le permite recuperar un archivo utilizando una copia segura, y el segundo le permitirá encontrar fácilmente los nombres de los archivos disponibles para su recuperación. En Net :: SSH, ssh.exec! será tu amigo.

De los documentos Net::SCP:

Net :: SCP implementa el protocolo cliente de SCP (Secure CoPy), permitiendo que los programas Ruby de transferir de forma segura y mediante programación archivos individuales o árboles de directorios completos desde y hacia los servidores remotos. Proporciona soporte para múltiples copias SCP simultáneas que trabajan en paralelo a través de la misma conexión, así como para copias seriales sincrónicas.

Net :: SCP también proporciona un URI abierta tie-in, por lo que puede utilizar el método abierto # Kernel para abrir y leer un archivo remoto:

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

De los documentos 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") 

Agregue end al código anterior para cerrar el bloque. Dentro del bloque, output contendrá los resultados del comando que envió.

Una alternativa a la recuperación de archivos a través de Ruby desde la máquina que contiene los archivos, sería hacer que Ruby inicie la transferencia directamente desde la máquina que aloja los archivos y los envíe a través de scp a la otra máquina.

En lugar de usar Net :: SCP y Net :: SSH, puede usar Net::SFTP, para administrarlo todo en una gema. También depende de una conexión segura, pero es posible que SFTP no esté disponible para usted. Las clases y los documentos Net::SFTP::Operations::Dir y Net::SFTP::Operations::Download serán su amigo.

Otras opciones incluyen el uso del estándar rsync en un shell simple como @tadman mencionado. Hay una multitud de formas de lograr esto, y es una necesidad común en entornos de alojamiento.


cualquier otro mejor enfoque?

rsync, en la línea de comandos. Es muy inteligente y puede mover carpetas y deltas de archivos si es necesario. Además, "How to transfer files using ssh and Ruby" y su enlace a "Ruby file upload ssh intro".

recomendación de Melding @ tadman rsync con Ruby, hay "Cheapest rsync replacement (with Ruby)".

+0

Jefe, salvó mi día. net/ssh funcionó. Muchas gracias, agregando el código en cuestión. –

+1

Si él lo ayudó, debe aceptar la pregunta (la pequeña marca debajo de los botones de votación), eso es una buena etiqueta SO. –

+0

@theTinMan Esto funciona para un solo archivo, ¿hay alguna manera de copiar toda la carpeta, lo intenté con la gema anterior, pero conseguí que SCP no terminara con éxito (1) (Net :: SCP :: Error) –

0

parece que es posible sin 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 
Cuestiones relacionadas