2

以下摘录来自免费软件mon监控程序的 https.monitor。

$result = `$perl -e'use Net::SSLeay ; Net::SSLeay::SSLeay_add_ssl_algorithms() ; print join("$field_delim",Net::SSLeay::get_https("$site", "$port", "$path"))'`;

一些被监控的 HTTPS 服务器与具有自动检测和/或 TLS 的 OpenSSL (Net::SSLeay) 不兼容,因此需要将 Net::SSLeay::ssl_version 变量显式更改为 v3。

以下从命令行按预期工作,并将 ssl_version 显式更改为 3:

perl -e 'use Net::SSLeay; Net::SSLeay::SSLeay_add_ssl_algorithms() ; $Net::SSLeay::ssl_version = 3 ; print join("<>",Net::SSLeay::get_https("server.domain.internal", "443", "/"))'

我无法让它在 https.monitor perl 文件的原始行中工作。如上所述,perl 将提示以下错误:

Can't modify constant item in scalar assignment at -e line 1, near "3 ;"

我已经尝试了各种语法来编译这一行并采用 ssl_version 设置,但我似乎无法同时实现这两者。对 Net::SSLeay::ssl_version 变量赋值使用“=>”语法我可以编译它,但设置似乎没有“接受”。我使用了 $Net::SSLeay::ssl_version 和“$Net::SSLeay::ssl_version”、变量周围的花括号等,但我无法让它正常工作。

perl 脚本中“perl -e”行中“Net::SSLeay::ssl_version = 3”的语法应该是什么?

4

1 回答 1

1
my $result = `perl -e'... \$Net::SSLeay::ssl_version = 3; ...'`;

不过这太容易出错了。您可以使用String::ShellQuote正确引用 unix shell 。shell_quote

use String::ShellQuote qw( shell_quote );

my $cmd = shell_quote(
    $perl,
    -e => <<'__EOI__',
        use Net::SSLeay;
        my ($field_delim, $site, $port, $path) = @ARGV;
        Net::SSLeay::SSLeay_add_ssl_algorithms();
        $Net::SSLeay::ssl_version = 3;
        print join($field_delim, Net::SSLeay::get_https($site, $port, $path));
__EOI__
    '--',
    $field_delim, $site, $port, $path,
);

my $result = `$cmd`;

您可以完全避免使用IPC::System::Simple的shell capturex

use IPC::System::Simple qw( capturex );

my @cmd = (
    $perl,
    -e => <<'__EOI__',
        use Net::SSLeay;
        my ($field_delim, $site, $port, $path) = @ARGV;
        Net::SSLeay::SSLeay_add_ssl_algorithms();
        $Net::SSLeay::ssl_version = 3;
        print join($field_delim, Net::SSLeay::get_https($site, $port, $path));
__EOI__
    '--',
    $field_delim, $site, $port, $path,
);

my $result = capturex(@cmd);

奖励:capturex为您检查错误!使用前两种方法,您至少需要以下内容:

die $! if $? == -1;
die "Killed by signal ".($? & 127) if $? & 127;
die "Exited with error ".($? >> 8) if $? >> 8;
于 2012-10-29T21:31:36.977 回答