コードの古いバージョンでは、次のように 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」引数を使用することに戻ろうとしましたが、シェルのメタ文字をエスケープしました。私はエスケープコードを書き始めました:
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 の質問 (こことここ) を見ました。
コードは次のとおりです。
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)で私が抱えている2つの問題は次のとおりです。
a) 引数の配列を指定して open または system を呼び出す> $lworkfile 2>&1
と、コマンドに渡すことができないため、ldapsearch の出力が画面に送信されるのを止めることができず、出力が見苦しくなります。
Processing...ldap_bind: Success (0) additional info: Success
b) に渡されたファイル ハンドルの場所 (つまり、パスとファイル名) を選択する方法がopen
わかりません。つまり、場所がわかりません$lldap_output
。移動/名前変更、または検査してどこにあるか (または実際にディスクに保存されていないか) を調べることはできますか?
(2)の問題に基づいて、これは(1)のアプローチに戻るべきだと思いますが、どうすればよいかわかりません