1. We have moved from vBulletin to XenForo and you are viewing the site in the middle of the move. Though the functional aspect of everything is working fine, we are still working on other changes including the new design on Xenforo.
    Dismiss Notice

Secure Shell Access & Transfer with Ruby

Discussion in 'Ruby on Rails' started by pradeep, Aug 13, 2013.

  1. pradeep

    pradeep Team Leader

    Joined:
    Apr 4, 2005
    Messages:
    1,646
    Likes Received:
    86
    Trophy Points:
    0
    Occupation:
    Programmer
    Location:
    Kolkata, India
    Home Page:
    SSH (Secure SHell) is a network protocol designed to be secure using various cryptographic technologies. It's very similar to telnet, but it is secure, so network a eavesdropper would be able to decipher your data that being transmitted over the network. In addition to being secure it has many features like data compression, reverse DNS checking, it can authenticate password-less using Private-Public key pairs.

    In this article we'll see how to programatically SSH into servers, and run programs or other tasks. This can be useful in a variety of scenarios, like running an update on an array of servers, copying files to servers, fetching logs from servers at the end of the day and things the like that, use your imagination.

    Installing Net::SSH gem



    Installation of the gem is very easy, for demonstration purpose I'll install another module Net::SCP synonymous to the *nix command scp.

    Issue the following commands on your shell prompt:
    Code:
    # gem install net-ssh
    # gem install net-scp
    

    Using Net::SSH & Net::SCP



    Now that we have understood what SSH is capable of, let us dive into some code examples to get to understand how to implement it, follow the examples below, I have added comments wherever necessary:

    Code:
    ## load modules
    require 'rubygems'
    require 'net/ssh'
    
    ## login with password
    Net::SSH.start('go4expert.com', 'pradeep', :password => 'ACoolPassword' ) do |ssh|
      # get all output from a remote process & print it
      output = ssh.exec!("hostname")
    
      p output
    end
    
    ## login without password, using key
    ## use ssh-keygen command to genearate a pair of keys
    Net::SSH.start('go4expert.com', 'pradeep', :keys => ['/home/pradeep/test_key'] ) do |ssh|
      output = ssh.exec!("who am i")
      p output
    end
    
    Now, let us look at copying files over to remote servers using SSH copy:

    Code:
    require 'rubygems'
    require 'net/scp'
    
    ## uploading to a remote server
    Net::SCP.upload!('go4expert.com',  'pradeep',"/tmp/testFile", "/home/g4e/html/tmp/fileTest", :keys =>  ['/home/pradeep/test_key'])
    
    ## downloading from a remote server
    Net::SCP.download!('go4expert.com', 'pradeep',"/var/log/g4e/access_log","/tmp/g4e_access_log", :password => 'ACoolPassword')
    
    ## use a persistant connection
    Net::SCP.start('go4expert.com', 'pradeep', :keys => ['/home/pradeep/test_key']) do |scp|
        ## You can also run multiple downloads in parallel
        DonwLoad1 = scp.download("/var/log/g4e/access_log", "/tmp/g4e_access_log")
        DonwLoad2 = scp.download("/var/log/g4e/error_log", "/tmp/g4e_error_log")
        ## wait for downloads to complete
        [DonwLoad1, DonwLoad2].each { |d| 
            d.wait 
        }
    end
    
    I hope you have enjoyed the article.
     
    shabbir likes this.

Share This Page