设置ControlPersist选项时,Net :: OpenSSH :: Gateway-> find_gateway失败

时间:2014-06-27 06:45:53

标签: perl ssh openssh

我正在尝试使用Net :: OpenSSH :: Gateway创建持久网关连接。下面是我正在使用的代码片段。

my %proxy_opts = (
 host => $host,
 port=>$port,
 password=>$password,
 user=>$user ,
 scheme=>"ssh",
 ssh_cmd => '/usr/bin/ssh',
 master_opts =>
               [ -o=>"StrictHostKeyChecking=no",
                 -o=>"TCPKeepAlive=no",
                 -o=>"ServerAliveInterval=30",
                 -o=>"ServerAliveCountMax=90",
                 -o=>"ControlPath=/tmp/ssh-master-%h_%p_%r",
                 -o=>"ControlPersist=yes"
                ]
);

my %gateway_settings = ( proxies=>[ {%proxy_opts} ]);
my $gateway = Net::OpenSSH::Gateway->find_gateway(%gateway_settings, errors=>$errors);

我收到以下错误。但是,如果我删除ControlPath和ControlPersist选项,整个过程都可以正常工作。

  

[ERROR]无法建立主SSH连接:错误的ssh master at   /root/.libnet-openssh-perl/spangeni-j1.zscaler.-31930-744378,socket   由pid 31933(预期的pid 31931)拥有

2 个答案:

答案 0 :(得分:2)

我认为这是模块中的一个错误。模块Net::OpenSSH::Gateway在CPAN上不存在,作者已经说过:

  

我还没有在CPAN上发布它,因为即使它已经存在了   功能,我发现它的内部架构存在一些问题   我想先解决。 - Source

如果你看到Net::OpenSSH的文档,你会发现该网关是一个实验性功能。

enter image description here


BTW您使用的OpenSSH版本是什么? ControlPersist需要 OpenSSH 5.6 或更新。

答案 1 :(得分:0)

如果您在网关机器上启用了隧道,则根本不需要使用Net :: OpenSSH :: Gateway。

my $ssh_g=Net::OpenSSH->new($gateway);
my $proxy_command=$ssh_g->make_remote_command({tunnel => 1}, $host, 22);
my $ssh=Net::OpenSSH->new($host,
                          master_opts => [-o => "ProxyCommand=$proxy_command"]);