Beefy Boxes and Bandwidth Generously Provided by pair Networks
Keep It Simple, Stupid

Net::SFTP::Foreign timeout value is inaccurate

by wanderedinn (Sexton)
on Mar 14, 2014 at 15:54 UTC ( #1078354=perlquestion: print w/replies, xml ) Need Help??
wanderedinn has asked for the wisdom of the Perl Monks concerning the following question:

So, we have been using Net::SFTP::Foreign for some time now. It appeared to me that the timeout value was not accurate and I recently discovered an interesting issue. When I set a timeout value (which the docs indicate is seconds) my actual timeout is 4X the value I set. Thus, a timeout => 5 translates to 20 seconds. I've even tested timeout => 2.5 and sure enough, it times out in 10 seconds. Is this by design? I have googled and searched for references to this, but I don't see anyone with the same issue.

my time testing method is pretty straight forward

printf "before sftp: %s\n", scalar localtime();

my $ftp = Net::SFTP::Foreign->new(host=>"localhost", timeout => 2.5, port => 10022, user => "test", password => "test");

printf "after sftp: %s\n", scalar localtime();

  • Comment on Net::SFTP::Foreign timeout value is inaccurate

Replies are listed 'Best First'.
Re: Net::SFTP::Foreign timeout value is inaccurate
by salva (Abbot) on Mar 15, 2014 at 07:33 UTC
    The connection is aborted after $timeout seconds.

    The issue is that aborting the connection sometimes takes time. In your case $timeout * 3 seconds.

    Enable debugging in order to see what's going on under the hood:

    $Net::SFTP::Foreign::debug = -1;
Re: Net::SFTP::Foreign timeout value is inaccurate
by jfroebe (Parson) on Mar 14, 2014 at 20:21 UTC

    timeout in Net::SFTP::Foreign corresponds to "ServerAliveInterval" in ssh_config.


    Sets the number of server alive messages (see below) which may be sent without ssh(1) receiving any messages back from the server. If this threshold is reached while server alive messages are being sent, ssh will disconnect from the server, terminating the session. It is important to note that the use of server alive messages is very different from TCPKeepAlive (below). The server alive messages are sent through the encrypted channel and therefore will not be spoofable. The TCP keepalive option enabled by TCPKeepAlive is spoofable. The server alive mechanism is valuable when the client or server depend on knowing when a connection has become inactive.

    The default value is 3. If, for example, ServerAliveInterval (see below) is set to 15 and ServerAliveCountMax is left at the default, if the server becomes unresponsive, ssh will disconnect after approximately 45 seconds. This option applies to protocol version 2 only.


    Sets a timeout interval in seconds after which if no data has been received from the server, ssh(1) will send a message through the encrypted channel to request a response from the server. The default is 0, indicating that these messages will not be sent to the server. This option applies to protocol version 2 only. -- from ssh_config man page

    I believe this is what you're seeing. The emphasis is mine :)

    salva is correct. sorry!

    Jason L. Froebe

    Blog, Tech Blog

      That's false. Net::SFTP::Foreign does not set ServerAliveInterval.

Log In?

What's my password?
Create A New User
Node Status?
node history
Node Type: perlquestion [id://1078354]
Front-paged by Arunbear
and all is quiet...

How do I use this? | Other CB clients
Other Users?
Others drinking their drinks and smoking their pipes about the Monastery: (9)
As of 2018-06-18 16:15 GMT
Find Nodes?
    Voting Booth?
    Should cpanminus be part of the standard Perl release?

    Results (110 votes). Check out past polls.