0

在一个 c++ 程序中,我使用系统函数来执行 ldapsearch 命令来获取文件中的数据。但是当 shell 是 bash 传递给 ldapsearch 的字符串导致错误并且如果用户的默认 shell 是 csh 时它工作正常,就会出现问题。当我调试下面观察到的代码时,字符串作为命令传递

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

现在我能想到两个解决方案

  1. 在调用系统函数之前将 shell 设置为 csh。
  2. 或者从上面的字符串中删除“\”,以便任何 shell 都可以理解该命令。

在这方面的任何指针都会很棒。这里需要注意的一点是,我使用 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

我建议您使用fork+ execlp(或spawnl在 Windows 上)功能或其邻居。这样您就不需要转义您的参数,因为您将直接调用该程序而不使用 shell。

于 2012-12-08T00:24:18.090 回答
0

尝试替换\"'看看是否有帮助。

于 2012-12-07T21:54:00.613 回答
0

我怀疑命令字符串包含反斜杠,而是我认为您误解了调试器输出。问题可能出在portbinddnpasswd的字符上;如果它们包含标点符号,请尝试引用它们。

于 2014-05-06T09:06:06.980 回答