【问题标题】:SSH connection timeout in Net::SSH::PerlNet::SSH::Perl 中的 SSH 连接超时
【发布时间】:2014-08-28 07:33:54
【问题描述】:

我正在使用 Net::SSH::Perl 连接到远程服务器并执行命令。问题是即使远程服务器很长时间没有响应,它也不会超时。我在 Net::SSH::Perl 中没有找到任何超时选项。

感谢任何帮助实现超时。

注意:我无权修改 Net/SSH/Perl.pm

【问题讨论】:

    标签: perl ssh timeout


    【解决方案1】:

    使用ConnectTimeout 选项。

    示例:

    use Net::SSH::Perl;
    
    my %params = ( protocol => "2,1",
                    identity_files => ["/home/user/.ssh/test_id_dsa"],
                    options => [    "BatchMode yes",
                                    "ConnectTimeout 3",
                                    "StrictHostKeyChecking no"],
                    debug => 'true'
    );
    

    另见:Net::SSH::Perl ConnectTimeout (ssh -o option)

    【讨论】:

    • 根据给出的链接,用户正在尝试 Net::SSH::Perl 中的 ConnectTimeout 选项,但它不起作用。所以,临时的解决方案是在 Perl.pm 中添加 setsockopt。由于我没有修改 Perl.pm 的权限,我无法实现它。无论如何,ConnectTimeout 选项是否适合您?
    • 我没有测试它,所以我不知道这是否适用于我的机器。我使用 Net::OpenSSH,你可以尝试使用它。另请参阅:*.com/a/2851593/257635
    • 即使这个选项已经在 Net::SSH::Perl 中实现了,它也对作者没有帮助。它定义了一个 ConnectTimeout,例如建立连接的超时时间,作者想要的其实是ServerAliveInterval,Net::SSH::Perl中也没有实现。
    • 或者我错了,作者确实需要检测连接超时,而不是保持活动超时。在这种情况下,ConnectTimeout 当然会有所帮助(如果 Net::SSH::Perl 支持它,但它不支持)。
    【解决方案2】:

    我从您的%params 中看到,您使用 DSA 密钥在远程服务器上进行身份验证。您真的需要使用Net::SSH::Perl 提供的本机 Perl SSH 实现吗?它在某些情况下很有用,你不能只包装常规的ssh 调用(例如,如果你需要提供一个明文密码来连接到服务器),但它缺少很多有用的 SSH 选项——你刚刚发现其中之一。

    我建议您尝试改用Net::SSH(它是系统的ssh 二进制文件的一个非常简单的包装器)并给它一个ConnectTimeoutServerAliveInterval 选项以及-oNet::OpenSSH它由上面的@ChankeyPathak 引用并使用其check_master 方法(我从描述中了解到,它看起来像您需要的那样)。

    ssh_config(1) 手册对ConnectTimeout(在建立连接时检测超时)和TCPKeepAliveServerAliveInterval(在建立连接时检测超时)有很好的描述。

    供您参考:这里是在Net::SSH::Perl 中实现的选项的完整列表,取自Config.pm。如果您确实需要使用此处未列出的任何其他选项,请使用其他一些 SSH 模块。

    BindAddress
    Host
    BatchMode
    ChallengeResponseAuthentication
    Cipher
    Ciphers
    Compression
    CompressionLevel
    DSAAuthentication
    GlobalKnownHostsFile
    HostKeyAlgorithms
    HostName
    IdentityFile
    NumberOfPasswordPrompts
    PasswordAuthentication
    PasswordPromptHost
    PasswordPromptLogin
    Port
    Protocol
    RhostsAuthentication
    RhostsRSAAuthentication
    RSAAuthentication
    StrictHostKeyChecking
    UsePrivilegedPort
    User
    UserKnownHostsFile
    

    【讨论】:

      【解决方案3】:

      我遇到了类似的问题。我正在执行一个由于某种原因没有终止的命令。因此,我将 $ssh->cmd 的调用包装在一个带有警报的 eval 中,如perldoc -f alarm 中所述。不是最好的解决方案,而是唯一的选择,因为我无法修改我正在调用的命令。

      【讨论】: