2012-01-04 18 views
5

Mam jeden serwer, który ma tylko pliki dziennika Xls. Każdy plik ma rozmiar 5-15 Mb i jest dynamiczny w tym sensie, że pliki są dodawane w dowolnym momencie. Teraz potrzebuję sposobu na wykonanie następującego procesu za pomocą Ruby.Jak skopiować plik z jednego serwera na drugi?

  1. Skopiuj plik, wysyłając nazwę pliku z jednego serwera, który nie ma nic oprócz plików dziennika na innym serwerze.
  2. Potrzebuję przekazać hasło serwera jako argument.
  3. Wszystko dzieje się w tle, które jest wywoływane ze skryptu Ruby.

Odpowiedz

4

Jak to działało

użyłem net-ssh & net-scp gem jak sugeruje @theTinMan i udało mi się skopiować moje pliki.

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 

i kopią cały folder

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

Powinieneś po prostu użyć rsync zamiast obracać własne rzeczy. Użyj ssh z dostępem do klucza publicznego/prywatnego, aby uniknąć hasła. Używanie hasła w ogóle jest prawdopodobnie złym pomysłem.

+0

Niektóre firmy nie pozwalają klucza dostępu. To ból, który musi radzić sobie z hasłami, ale jest także częścią ich polityki bezpieczeństwa. –

+1

Niektóre firmy mają również działy IT obsadzone trollami. Hasła można odgadnąć. Klucze muszą zostać skradzione. – tadman

+0

To może być. Faktem jest, że niektóre miejsca wymagają haseł. –

10

Sprawdź klejnoty Net::SCP i Net::SSH. Pierwsza pozwala pobrać plik za pomocą bezpiecznej kopii, a druga pozwala łatwo znaleźć nazwy plików dostępnych do pobrania. W Net :: SSH, ssh.exec! będzie twoim przyjacielem.

Z Net::SCP docs:

Net :: SCP realizuje SCP (Secure Copy) protokół klienta, co pozwala na bezpieczne programy Ruby i programowo przesyłania pojedynczych plików lub całych drzew katalogów z serwerów zdalnych. Zapewnia obsługę wielu jednoczesnych kopii SCP pracujących równolegle przez to samo połączenie, a także synchronicznych kopii seryjnych.

Net :: SCP zapewnia również open-uri tie-in, dzięki czemu można używać jądra # otwartej metody, aby otworzyć i przeczytać plik zdalny:

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

od Net::SSH docs:

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") 

Dodaj end do powyższego kodu, aby zamknąć blok. Wewnątrz bloku output będzie zawierać wyniki wysłanego polecenia.

Alternatywą dla pobierania plików za pośrednictwem Ruby z komputera zawierającego pliki, byłoby zainicjowanie transferu przez Ruby bezpośrednio z komputera obsługującego pliki i przesłanie ich przez numer scp do drugiego komputera.

Zamiast używać Net :: SCP i Net :: SSH, możesz użyć Net::SFTP, aby zarządzać wszystkimi w jednym klejnocie. Podróżuje też bezpiecznym połączeniem, ale SFTP może nie być dla ciebie dostępny. Klasy i dokumenty Net::SFTP::Operations::Dir i Net::SFTP::Operations::Download będą Twoimi przyjaciółmi.

Inne opcje obejmują użycie standardu rsync w prostej powłoce, o której mowa w artykule. Istnieje wiele sposobów na osiągnięcie tego i jest to powszechna potrzeba w środowiskach hostingowych.


każda inna lepsze podejście?

rsync, w wierszu polecenia. Jest bardzo inteligentny i może w razie potrzeby przenosić foldery i delty plików. Ponadto "How to transfer files using ssh and Ruby" i jego link do "Ruby file upload ssh intro".

Melding @ tadman's rsync zalecenie z Ruby, jest "Cheapest rsync replacement (with Ruby)".

+0

Szefie uratowałeś mój dzień. net/ssh pracował. Dziękuję bardzo, dodając kod, o którym mowa. –

+1

Jeśli ci pomógł, powinieneś zaakceptować pytanie (mały znacznik wyboru pod przyciskami głosowania), to jest dobra etykieta SO. –

+0

@tinMan Działa to dla pojedynczego pliku, czy istnieje sposób na skopiowanie całego folderu, próbowałem z powyższym klejnotem, ale SCP nie zakończył się pomyślnie (1) (Net :: SCP :: Error) –

0

wydaje się to możliwe bez 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 
Powiązane problemy