概要
我从 Perl 执行一个 shell 命令,当从命令行运行时它可以工作,但是在调试器中运行时它不起作用。作为 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"'
即使创建一个只执行此命令的小型测试脚本也只有在从命令行运行时才有效。
系统
- 视窗 x64
- Active Perl v5.16.0,MSWin32-x64-多线程
- 日食朱诺号 20120614-1722
什么有效
我努力打开管理员提示符(脚本执行所必需的)并:
perl script.pl
输出被打印到屏幕上,$?
是0
.
什么不起作用
perl script.pl
启动 Eclipse 并使用相同的调用运行调试会话。添加服务并执行命令(使用 Win32::Daemon 创建)也不起作用。守护进程本身运行良好,并按预期启动 perl 脚本。只有命令不会被执行。$?
is13568
或53
如果用 移位$? >> 8
,则不打印任何输出。退出代码不属于该程序。
更多详细信息
我调用的工具称为sscep,由我扩展。它使用 OpenSSL API 并加载 capi 引擎 (Windows CryptoAPI)。但是命令本身至少会在任何严重的操作开始之前打印输出。我可以很乐意为此提供源代码,但我怀疑它会有所帮助。
我能够进一步缩小范围:问题仅存在于 Perl 程序 (CertNanny) 和二进制文件 (sscep) 的组合中。在CertNannydir
内部调用有效,sscep
在测试 Perl 脚本中调用也有效。那么在 Perl 中可以做些什么来阻止单个二进制文件被调用......?
这个问题可能源于的任何想法或我如何缩小范围?