require 'rubygems' require 'net/scp' puts "Fetching file" # Establish the SSH session ssh = Net::SSH.start("IP Address", "username on server", :password => "user's password on server", :port => 12345) # Use that session to generate an SCP object scp = ssh.scp # Download the file and run the code block each time a new chuck of data is received scp.download!("path/to/file/on/server/fileName", "/Users/me/Desktop/") do |ch, name, received, total| # Calculate percentage complete and format as a two-digit percentage percentage = format('%.2f', received.to_f / total.to_f * 100) + '%' # Print on top of (replace) the same line in the terminal # - Pad with spaces to make sure nothing remains from the previous output # - Add a carriage return without a line feed so the line doesn't move down print "Saving to #{name}: Received #{received} of #{total} bytes" + " (#{percentage}) \r" # Print the output immediately - don't wait until the buffer fills up STDOUT.flush end puts "Fetch complete!"
Friday, March 4, 2011
Using Ruby for SCP file transfers
Today I needed to write a Ruby script to fetch a file using SCP. I thought it would be nice if it also displayed a "percent complete" counter as it went. This is what I came up with.