title: How to properly implement Net::SSH port forwards
body: <p>I have been trying to get port forwarding to work correctly with Net::SSH. From what I understand I need to fork out the Net::SSH session if I want to be able to use it from the same Ruby program so that the event handling loop can actually process packets being sent through the connection. However, this results in the ugliness you can see in the following:</p>
  
  <pre><code>#!/usr/bin/env ruby -w
  require 'net/ssh'
  require 'httparty'
  require 'socket'
  include Process
  
  log = Logger.new(STDOUT)
  log.level = Logger::DEBUG
  
  local_port = 2006
  child_socket, parent_socket = Socket.pair(:UNIX, :DGRAM, 0)
  maxlen = 1000
  hostname = "www.example.com"
  
  pid = fork do
    parent_socket.close
    Net::SSH.start("hostname", "username") do |session|
      session.logger = log
      session.logger.sev_threshold=Logger::Severity::DEBUG
      session.forward.local(local_port, hostname, 80)
      child_socket.send("ready", 0)
      pidi = fork do
        msg = child_socket.recv(maxlen)
        puts "Message from parent was: #{msg}"
        exit
      end
      session.loop do
        status = waitpid(pidi, Process::WNOHANG)
        puts "Status: #{status.inspect}"
        status.nil?
      end
    end
  end
  
  child_socket.close
  
  puts "Message from child: #{parent_socket.recv(maxlen)}"
  resp = HTTParty.post("http://localhost:#{local_port}/", :headers =&gt; { "Host" =&gt; hostname } )
  # the write cannot be the last statement, otherwise the child pid could end up
  # not receiving it
  parent_socket.write("done")
  puts resp.inspect
  </code></pre>
  
  <p>Can anybody show me a more elegant/better working solution to this?</p>