因为想使用Net:OpenSSH的时候能forward_agent,就测试了一下最新版本的Net::OpenSSH.结果比较杯具的是发现forward_agent参数指定后不顶用。仔细看了一下模块的代码,作者貌似是犯了一个比较低级的错误。有2处是if ($self->{_forward_agent}) {my $forward_agent = delete $opts{forward_agent};push @ssh_opts, ($forward_agent ? ‘-A’ : ‘-a’) if defined $forward_agent;}这里实际是如果输入的时候定义了forward_agent就给ssh_opts加一个-A,表示开启转发。但是作者却还是从$opts{forward_agent}里面取。实际上第一次这样取值后,这个就被delete掉了。我直接改了一下代码,patch如下pm@debian:~$ cat OpenSSH.diff1160,1162c1160,1161< if ($self->{_forward_agent}) {< my $forward_agent = delete $opts{forward_agent};

<         push @ssh_opts, ($forward_agent ? '-A' : '-a') if defined $forward_agent;
---
>     if (defined $self->{_forward_agent}) {>         push @ssh_opts, ($self->{_forward_agent} ? ‘-A’ : ‘-a’);
1294,1296c1293,1294<     if ($self->{_forward_agent}) {<         my $forward_agent = delete $opts{forward_agent};
<         push @ssh_opts, ($forward_agent ? '-A' : '-a') if defined $forward_agent;
---
>     if (defined $self->{_forward_agent}) {>         push @ssh_opts, ($self->{_forward_agent} ? ‘-A’ : ‘-a’);

修改后终于OK了。

================UPDATE:和模块的作者联系过,模块没有bug,只是使用的时候需要直接传入参数

my $out=$ssh->capture({“forward_agent” => 1},$cmd);