如何从系统功能设置shell?

时间:2012-12-07 21:17:24

标签: c++ string shell

在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都能理解该命令。
  3. 这方面的任何指针都会很棒。这里有一点需要注意,我使用std :: string来创建下面的最终输出字符串是相同的片段。

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

    或者如果有其他方法我可以达到同样的目的。

3 个答案:

答案 0 :(得分:0)

尝试将\"替换为'并查看是否有帮助。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

我怀疑命令字符串是否包含反斜杠,而我认为你误解了调试器输出。问题可能出在 port binddn passwd 的字符中;如果它们包含标点符号,也可以引用它们。