2

概要

我从 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 脚本。只有命令不会被执行。$?is1356853如果用 移位$? >> 8,则不打印任何输出。退出代码不属于该程序。

更多详细信息

我调用的工具称为sscep,由我扩展。它使用 OpenSSL API 并加载 capi 引擎 (Windows CryptoAPI)。但是命令本身至少会在任何严重的操作开始之前打印输出。我可以很乐意为此提供源代码,但我怀疑它会有所帮助。

我能够进一步缩小范围:问题仅存在于 Perl 程序 (CertNanny) 和二进制文件 (sscep) 的组合中。在CertNannydir内部调用有效,sscep在测试 Perl 脚本中调用也有效。那么在 Perl 中可以做些什么来阻止单个二进制文件被调用......?

这个问题可能源于的任何想法或我如何缩小范围

4

1 回答 1

0

这就是我认为的问题所在:当您在命令行上运行程序时,system() 命令会通过 shell (cmd.exe);当您在其他地方运行程序时,它不会。不幸的是,这两种方法处理命令行参数的方式不同。 这是一篇似乎可以帮助您解决问题的文章

以我的经验,这种事情在 Windows 中是一团糟。我在 Perl 中也遇到了这个问题。

于 2012-08-10T07:59:53.657 回答