in reply to Net::SSH2 exec timeout

the fwupdate command may reset the remote machine without doing a proper shutdown, leaving TCP connections unclosed.

Instead of closing the channel, try closing the socket and then disconnecting the full session:

my $socket = $ssh->socket; my $chan = $ssh->channel(); $chan->exec("/sbin/fwupdate -m\n"); close $socket; $ssh->disconnect;

Though, even then there is a race condition: fwupdate may be faster taking control of the machine than the SSH server responding to the SSH_MSG_CHANNEL_REQUEST request.

Setting blocking to 0 could help there, but them, the exec method may fail and you will never know if the command was delivered or not:

my $chan = $ssh->channel(); $ssh->blocking(0); $chan->exec("/sbin/fwupdate -m\n");

Alternatively, if you are running your script in a Unix/Linux box, instead of Net::SSH2, you could use Net::OpenSSH (the OpenSSH client used by the module under the hood is able to detect staled connections):

use Net::OpenSSH; my $ssh = Net::OpenSSH->new($host, timeout => 30); $ssh->scp_put($firmware[$antenna_type],'/tmp/fwupdate.bin'); $ssh->system("/sbin/fwupdate -m\n");

Replies are listed 'Best First'.
Re^2: Net::SSH2 exec timeout
by £okì (Scribe) on Sep 08, 2011 at 22:20 UTC
    I tried the disconnect. Unfortunately the code does not continue past the channel exec. If you throw in the $ssh->disconnect, it never even gets there.

    blocking(0) seems to have no effect. I had actually tried that, forgot to mention it.

    OpenSSH: Yeah, thought of that as well but the code has to be usable from multiple different systems.
      would your busydos shell accept the following command?
      (sleep 5 && /sbin/fwupdate -m) >/dev/null 2>&1 </dev/null &
      That would execute the command after 5 seconds, time enough for the SSH session to be closed.