あらすじ
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 スクリプトを開始しています。コマンドだけが実行されません。または$?
でシフトした場合、出力は印刷されません。終了コードはプログラムに属していません。13568
53
$? >> 8
詳細
私が呼び出しているツールはsscepと呼ばれ、私によって拡張されています。OpenSSL API を使用し、capi エンジン (Windows CryptoAPI) をロードします。ただし、コマンド自体は、重大なアクションが開始される前に、少なくとも出力を出力します。このソースコードを喜んで提供できますが、それが役立つとは思えません。
これをさらに絞り込むことができました。問題は、Perl プログラム (CertNanny) とバイナリ (sscep) の組み合わせにのみ存在します。CertNannydir
内の呼び出しは機能sscep
し、テスト Perl スクリプトの呼び出しも機能します。では、単一のバイナリが呼び出されないようにするために、Perl で何ができるでしょうか...?
この問題がどこから発生したか、またはどのように絞り込むことができるかについてのアイデアはありますか?