我正在使用Net::SSH::P erl连接到远程服务器并执行命令。问题是,即使远程服务器长时间没有响应,它也不会超时。我在Net::SSH::P erl中找不到任何超时选项。
感谢任何实现超时的帮助。
注意:我无权修改 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'
);
另请参阅:Net::SSH::P erl ConnectTimeout (ssh -o 选项(
正如我从您的%params
中看到的,您使用DSA密钥在远程服务器上进行身份验证。你真的需要使用Net::SSH::Perl
提供的原生Perl SSH实现吗?在某些情况下,它很有用,因为您不能只包装常规ssh
调用(例如,如果您需要提供明文密码以连接到服务器(,但它缺少许多有用的SSH选项 - 您刚刚找到了其中之一。
我建议您尝试使用 Net::SSH
代替(这是系统ssh
二进制文件的非常简单的包装器(,并给它一个带有 -o
ConnectTimeout
和ServerAliveInterval
选项,或者上面@ChankeyPathak引用的Net::OpenSSH
并使用其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 的调用包装在一个带有警报的评估中,如 perldoc -f alarm
中所述。不是最好的解决方案,但是唯一的选择,因为我无法修改我正在调用的命令。