gpt4 book ai didi

perl - 从 Perl 调用系统命令

转载 作者:行者123 更新时间:2023-12-05 00:39:40 24 4
gpt4 key购买 nike

在旧版本的代码中,我们从 Perl 中调用以执行 LDAP 搜索,如下所示:

# Pass the base DN in via the ldapsearch-specific environment variable 
# (rather than as the "-b" paramater) to avoid problems of shell
# interpretation of special characters in the DN.
$ENV{LDAP_BASEDN} = $ldn;

$lcmd = "ldapsearch -x -T -1 -h $gLdapServer" .
<snip>
" > $lworkfile 2>&1";
system($lcmd);

if (($? != 0) || (! -e "$lworkfile"))
{
# Handle the error
}

上面的代码将导致成功的 LDAP 搜索,该搜索的输出将在文件 $lworkfile 中。 .

不幸的是,我们最近在此服务器上重新配置了 openldap,以便在/etc/openldap/ldap.conf 和/etc/ldap.conf 中指定“BASE DC=”。这种变化似乎意味着 ldapsearch 忽略了 LDAP_BASEDN 环境变量,所以我的 ldapsearch 失败了。

我已经尝试了几个不同的修复,但到目前为止没有成功:

(1) 我尝试回到对 ldapsearch 使用“-b”参数,但转义 shell 元字符。我开始编写转义代码:
my $ldn_escaped = $ldn;
$ldn_escaped =~ s/\/\\/g;
$ldn_escaped =~ s/`/\`/g;
$ldn_escaped =~ s/$/\$/g;
$ldn_escaped =~ s/"/\"/g;

这引发了一些 Perl 错误,因为我没有在 Perl 中正确地转义这些正则表达式(行号与带有反引号的正则表达式匹配)。

Backticks found where operator expected at /tmp/mycommand line 404, at end of line


同时我开始怀疑这种方法并寻找更好的方法。

(2) 然后我看到了一些 Stackoverflow 问题( herehere ),它们提出了更好的解决方案。

这是代码:
print("Processing...");

# Pass the arguments to ldapsearch by invoking open() with an array.
# This ensures the shell does NOT interpret shell metacharacters.
my(@cmd_args) = ("-x", "-T", "-1", "-h", "$gLdapPool",
"-b", "$ldn",
<snip>
);

$lcmd = "ldapsearch";

open my $lldap_output, "-|", $lcmd, @cmd_args;

while (my $lline = <$lldap_output>)
{
# I can parse the contents of my file fine
}

$lldap_output->close;

我在方法 (2) 中遇到的两个问题是:

a) 使用参数数组调用 open 或 system 不允许我通过 > $lworkfile 2>&1到命令,所以我无法停止发送到屏幕的 ldapsearch 输出,这使我的输出看起来很难看:

Processing...ldap_bind: Success (0)
additional info: Success


b) 我不知道如何选择传递给 open 的文件句柄的位置(即路径和文件名) ,即我不知道在哪里 $lldap_output是。我可以移动/重命名它,或检查它以找出它的位置(或者它实际上没有保存到磁盘)?

基于(2)的问题,这让我觉得我应该回到方法(1),但我不太确定如何

最佳答案

一种方法是使用 IPC::Open3 使您的 Perl 代码能够处理外部程序的 stdout 和 stderr 流。

关于perl - 从 Perl 调用系统命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4413344/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com