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_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を使用して、シェルを完全に回避できます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エラー チェックを行います。最初の 2 つの方法を使用するには、少なくとも次のものが必要です。

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