Re: [Ssh-sftp-perl-users] Detecting connection closed by server.
Brought to you by:
dbrobins
From: Enrique de A. S. <enr...@pc...> - 2005-11-15 10:22:12
|
I will try the different options you have given me. Thanks, Enrique. Mark A. Fuller wrote: >>I have next problems, sometimes it's possible that ssh server close SSH >>connection. Then, requests sent by the client has not response, but it >>is unable to detect it. > > > What happens in that case? Does net::ssh die? Or, does it never timeout? > > I found a few cases where net::ssh dies. I had to surround my net:ssh activity with an "eval" so I could interrogate $@ to see if it died. I also had to collect Perl warnings because net::ssh may issue one or two prior to dieing and those first one or two would be more meaningful than the message when it dies. I did something like this: > > ========== > @warnings = (); # empty array > > $SIG{'__WARN__'} = sub { $warnings[$#warnings + 1] = $_[0]; }; > > eval { > # The net::ssh action which may die > }; > > $SIG{'__WARN__'} = 'DEFAULT'; > > > #------------------------------------------------------------------------------- > # Write failure response. > #------------------------------------------------------------------------------- > if (($#warnings > -1) or (!defined($sftp) or !$sftp) ) { > > for (@warnings) { > print STDERR $_; > } > > exit 99; > > } > ======================== > > I posted an exact example a few months ago, but I can't get to the mailing list's archive at the moment. You can search for "eval" and look at the few things I posted. > > If the problem is that your connection never times out, you can do something like this: > > ================== > eval { > local $SIG{ALRM} = sub { die "alarm\n" }; # NB: \n required > alarm 10; > #net::ssh action that may hang > alarm 0; > }; > if ($@) { > die unless $@ eq "alarm\n"; # propagate unexpected errors > # timed out > } > else { > # didn't timeout > } > =================== > > You can nest the two evals to protect against either case. But, you want to make sure you don't have a race condition if the command dies and you haven't turned off the alarm yet. > > FWIW, I began using expect.pm to drive my native ssh/sftp/scp binaries. To me it's faster and simpler. The big positive is that if something doesn't work right, I can run the binary and see exactly what my script (using expect.pm) sees. There's no differences between my command line use and what happens in my scripts. I posted an example of how to do this a few months ago too. > > Mark > > > ------------------------------------------------------- > SF.Net email is sponsored by: > Tame your development challenges with Apache's Geronimo App Server. Download > it for free - -and be entered to win a 42" plasma tv or your very own > Sony(tm)PSP. Click here to play: http://sourceforge.net/geronimo.php > _______________________________________________ > Ssh-sftp-perl-users mailing list > Ssh...@li... > https://lists.sourceforge.net/lists/listinfo/ssh-sftp-perl-users > > > |