In a initializer:

1
2
3
4
5
    $ssh_session = Hash.new
    $ssh_session = {
      "host1" => {:ssh => nil, :sftp => nil},
      "host2" => {:ssh => nil, :sftp => nil}
    }

and the class in extras

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34

    class MySsh
      attr_reader :session, :sftp
      def initialize(master)
        @master = master
    
        @session = $ssh_session[@master][:ssh]
        @sftp    = $ssh_session[@master][:sftp]

        if @session.nil? || @session.closed? then self.ssh_connect end
        if @sftp.nil? || @sftp.closed? then self.sftp_connect end
      end
  
      def ssh_connect
        begin
          $ssh_session[@master][:ssh] = Net::SSH.start(@master, "foobar", :passphrase => "barfoo") 
        rescue
          return false
        ensure
          @session = $ssh_session[@master][:ssh]
        end
      end
  
      def sftp_connect
        begin
          $ssh_session[@master][:sftp] = @session.sftp.connect
        rescue
          return false
        ensure
          @sftp = $ssh_session[@master][:sftp]
        end  
      end
    end