How to maintain a single network connection? (newbie)

Hi, I am a beginner to Ruby, having come over from the Java side of
things. I am writing a simple script to familiarize myself with the
Net-SSH and Net-SFTP libraries. I want to split my script into several
different functions to improve readability and organization.

However, I'm having difficulty doing this. When I create an SSH
connection, the connection automatically dies after I exit the function.
How can I keep this connection alive? I tried storing the connection as
a global variable but it did not work - the connection still closed.

Here is a portion of my script. When I run it, I call "testAll". It
fails on the first line of sftpTest1A:

···

----------------------------------------

$session = nil

def sftpTest1
    puts "Testing sftp..."
    $session= Net::SSH.start( '127.0.0.1', :username=>'user',
:password=>'password' )
     sftp = $session.sftp.connect
        handle = sftp.opendir( "." )
        items = sftp.readdir(handle)
        puts items
        sftp.close_handle( handle )
      sftp.close
   #At this point, session should still be open, correct?
end

def sftpTest1A
  shell = $session.shell.open #FAILS at this line!

  shell.pwd

  print shell.stdout while shell.stdout?
  $stderr.puts "-- stderr: --"
  $stderr.print shell.stderr while shell.stderr?

  $session.close

end

def testAll
  sftpTest1
  sftpTest1A
end
--
Posted via http://www.ruby-forum.com/.

Hi Fenster,

I suspect it is the sftp.close stanza that is causing the problem. Try removing that, what happens?

Also, I would recommend using the block form of Net::SSH.start if you can. That is

Net::SSH.start(...) do |session|
   #do all your work here, pass the session to your methods
end

Johnny P

Fenster Blick wrote:

···

Hi, I am a beginner to Ruby, having come over from the Java side of
things. I am writing a simple script to familiarize myself with the
Net-SSH and Net-SFTP libraries. I want to split my script into several
different functions to improve readability and organization.

However, I'm having difficulty doing this. When I create an SSH
connection, the connection automatically dies after I exit the function.
How can I keep this connection alive? I tried storing the connection as
a global variable but it did not work - the connection still closed.

Here is a portion of my script. When I run it, I call "testAll". It
fails on the first line of sftpTest1A:
----------------------------------------

$session = nil

def sftpTest1
    puts "Testing sftp..."
    $session= Net::SSH.start( '127.0.0.1', :username=>'user',
:password=>'password' )
     sftp = $session.sftp.connect
        handle = sftp.opendir( "." )
        items = sftp.readdir(handle)
        puts items
        sftp.close_handle( handle )
      sftp.close
   #At this point, session should still be open, correct?
end

def sftpTest1A
  shell = $session.shell.open #FAILS at this line!

  shell.pwd

  print shell.stdout while shell.stdout?
  $stderr.puts "-- stderr: --"
  $stderr.print shell.stderr while shell.stderr?

  $session.close

end

def testAll
  sftpTest1
  sftpTest1A
end

Thanks for the reply. Unfortunately, that didn't work.

However, I did end up solving the issue - after taking a break and
thinking about it away from the computer. The proper way to approach the
issue was to utilize a class.

I should have created an instance variable for the connection in a
separate Server class. In this way, I can keep a connection alive as
long as a Server object is alive.

I ran into difficulties when I approached the problem like a Visual
Basic script... all's better now!

John Pywtorak wrote:

···

Hi Fenster,

I suspect it is the sftp.close stanza that is causing the problem. Try
removing that, what happens?

Also, I would recommend using the block form of Net::SSH.start if you
can. That is

Net::SSH.start(...) do |session|
   #do all your work here, pass the session to your methods
end

Johnny P

--
Posted via http://www.ruby-forum.com/\.