0

C ++プログラムでは、システム関数を使用してldapsearchコマンドを実行し、ファイル内のデータを取得しています。ただし、シェルがbashの場合に問題が発生し、ldapsearchに渡された文字列がエラーになり、ユーザーのデフォルトのシェルがcshの場合は正常に機能します。以下のコードをデバッグすると、文字列がコマンドとして渡されます

ldapsearch -h <hostname> -p <port> -D <binddn> -w <passwd> -b \"cn=admin root\" \"(filter)\" cn

今私が考えることができる2つの解決策

  1. システム関数を呼び出す前に、シェルをcshに設定します。
  2. または、上記の文字列から「\」を削除して、すべてのシェルがコマンドを理解できるようにします。

この点に関するどんなポインタも素晴らしいでしょう。ここで、std :: stringを使用して以下の最終出力文字列を作成していることに注意してください。これは、同じスニペットです。

std::string ldapSystemCmd;
if(!ldapCosSearchDn.empty()) {
    ldapSystemCmd += ldapInitialString;
    ldapSystemCmd += "-b \"" + ldapCosSearchDn + "\"";
}
ldapSystemCmd += " \"" + ldapCosSearchFilter + "\"";
ldapSystemCmd += " cn >" + ldapSearchFileName;
int systemOutput = system(ldapSystemCmd.c_str());

または、他の方法があれば、私は同じことを達成できます。

4

3 に答える 3

0

コマンド文字列にバックスラッシュが含まれているとは思えません。むしろ、デバッガーの出力を誤解していると思います。問題は、portbinddnまたはpasswdの文字にある可能性があります。句読点が含まれている場合は、それらも引用してみてください。

于 2014-05-06T09:06:06.980 に答える
0

fork+ execlp(またはspawnlWindows では) 関数またはその隣接関数を使用することをお勧めします。この方法では、シェルを使用せずにそのプログラムを直接呼び出すため、引数をエスケープする必要はありません。

于 2012-12-08T00:24:18.090 に答える
0

に置き換え\"てみて'、それが役立つかどうかを確認してください。

于 2012-12-07T21:54:00.613 に答える