【发布时间】:2014-08-28 07:33:54
【问题描述】:
我正在使用 Net::SSH::Perl 连接到远程服务器并执行命令。问题是即使远程服务器很长时间没有响应,它也不会超时。我在 Net::SSH::Perl 中没有找到任何超时选项。
感谢任何帮助实现超时。
注意:我无权修改 Net/SSH/Perl.pm
【问题讨论】:
我正在使用 Net::SSH::Perl 连接到远程服务器并执行命令。问题是即使远程服务器很长时间没有响应,它也不会超时。我在 Net::SSH::Perl 中没有找到任何超时选项。
感谢任何帮助实现超时。
注意:我无权修改 Net/SSH/Perl.pm
【问题讨论】:
使用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'
);
【讨论】:
我从您的%params 中看到,您使用 DSA 密钥在远程服务器上进行身份验证。您真的需要使用Net::SSH::Perl 提供的本机 Perl SSH 实现吗?它在某些情况下很有用,你不能只包装常规的ssh 调用(例如,如果你需要提供一个明文密码来连接到服务器),但它缺少很多有用的 SSH 选项——你刚刚发现其中之一。
我建议您尝试改用Net::SSH(它是系统的ssh 二进制文件的一个非常简单的包装器)并给它一个ConnectTimeout 和ServerAliveInterval 选项以及-o 或Net::OpenSSH它由上面的@ChankeyPathak 引用并使用其check_master 方法(我从描述中了解到,它看起来像您需要的那样)。
ssh_config(1) 手册对ConnectTimeout(在建立连接时检测超时)和TCPKeepAlive 和ServerAliveInterval(在建立连接时检测超时)有很好的描述。
供您参考:这里是在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
【讨论】:
我遇到了类似的问题。我正在执行一个由于某种原因没有终止的命令。因此,我将 $ssh->cmd 的调用包装在一个带有警报的 eval 中,如perldoc -f alarm 中所述。不是最好的解决方案,而是唯一的选择,因为我无法修改我正在调用的命令。
【讨论】: