2

あらすじ

Perl からシェル コマンドを実行し、コマンド ラインから実行すると機能しますが、デバッガーで実行すると機能しません。Win32::Daemon として実行すると、同じ動作を示します。

ソースコード

バッククォートを使用してコマンドを実行します

print `$cmd`

またはこのように:

open FH, "$cmd |" or die "Couldn't execute $cmd: $!\n"; 
    while(defined(my $line = <FH>)) {
        chomp($line);
        print "$line\n";
    }
close FH;

コマンドは次のようになります。

$cmd = '"C:\path\to\sscep.exe" getca -f "C:\path\to\config\capi_sscep.cnf"'

このコマンドを実行するだけの小さなテスト スクリプトを作成しても、コマンド ラインから実行した場合にのみ機能します。

システム

  • Windows x64
  • アクティブ Perl v5.16.0、MSWin32-x64-マルチスレッド
  • エクリプス ジュノ 20120614-1722

機能するもの

管理者プロンプト(スクリプトの実行に必要)を開き、次のことを行います。

perl script.pl

$?出力は画面に出力されます0

機能しないもの

Eclipse を起動し、同じperl script.pl呼び出しでデバッグ セッションを実行します。また、サービスを追加してコマンドを実行しても機能しません (Win32::Daemon で作成)。デーモン自体は完全に正常に動作しており、期待どおりに perl スクリプトを開始しています。コマンドだけが実行されません。または$?でシフトした場合、出力は印刷されません。終了コードはプログラムに属していません。1356853$? >> 8

詳細

私が呼び出しているツールはsscepと呼ばれ、私によって拡張されています。OpenSSL API を使用し、capi エンジン (Windows CryptoAPI) をロードします。ただし、コマンド自体は、重大なアクションが開始される前に、少なくとも出力を出力します。このソースコードを喜んで提供できますが、それが役立つとは思えません。

これをさらに絞り込むことができました。問題は、Perl プログラム (CertNanny) とバイナリ (sscep) の組み合わせにのみ存在します。CertNannydir内の呼び出しは機能sscepし、テスト Perl スクリプトの呼び出しも機能します。では、単一のバイナリが呼び出されないようにするために、Perl で何ができるでしょうか...?

この問題がどこから発生したか、またはどのように絞り込むことができるかについてのアイデアはありますか?

4

1 に答える 1

0

これが私が考える問題です。コマンド ラインでプログラムを実行すると、system() コマンドがシェル (cmd.exe) を通過します。プログラムを他の場所で実行すると、実行されません。残念ながら、この 2 つの方法では、コマンド ライン引数の扱いが異なります。 問題の解決に役立つと思われる記事を次に示します

私の経験では、この種のことは Windows ではめちゃくちゃです。Perl でもこの問題で問題が発生しました。

于 2012-08-10T07:59:53.657 に答える