“系统调用失败”;章节名称不正确-e";C++; 我试图用C++代码更新DNS。我的方法是使用带有nsupdate的管道的字符串

“系统调用失败”;章节名称不正确-e";C++; 我试图用C++代码更新DNS。我的方法是使用带有nsupdate的管道的字符串,c++,linux,dns,system,C++,Linux,Dns,System,当我用“echo-e”调用我的系统时,跟踪文件显示“不正确的节名-e,我不明白是什么问题,因为如果我将字符串粘贴到linux终端,它会正确添加DNS记录 std::ostringstream oss; oss << "echo -e \"update add " << enumName << "."; oss << m_configuration.m_zone << ". "; oss << m_configuration.

当我用“echo-e”调用我的系统时,跟踪文件显示“不正确的节名-e,我不明白是什么问题,因为如果我将字符串粘贴到linux终端,它会正确添加DNS记录

std::ostringstream oss;
oss << "echo -e \"update add " << enumName << ".";
oss << m_configuration.m_zone << ". ";
oss << m_configuration.m_ttl << " NAPTR ";
oss << m_configuration.m_priority << " ";
oss << m_configuration.m_weight << " ";
oss << "\\\"S\\\" ";
oss << "\\\"" << boost::to_upper_copy<std::string>(service) <<m_configuration.m_serviceSuffix << "\\\" ";
oss << "\\\"" << m_configuration.m_regex << "\\\" ";
oss << "_" << service << "._" << m_configuration.m_srvRecord << "." << m_configuration.m_zone << ".\\n";
oss << "send\\nquit\" | nsupdate -l -v";
std::string msg = oss.str();
TRACE_DEBUG("msg: '%s'", msg.c_str());
 res = (system((msg).c_str()) == 0);
std::ostringstream oss;

oss这是因为
system
调用
/bin/sh
,而不是像您的终端那样调用
$SHELL
。一些
/bin/sh
实现将简单地回显字符
-e
,就像内置
回显将打印到stdout的任何其他文本一样。此
-e
按原样传递给
nsupdate
,并将其混淆。这种混乱导致了错误

正确的解决方案是避免同时使用
system
,尤其是避免构造传递给
echo
的字符串。当然,如果要避免内置的
echo
,可以使用
/bin/echo
,但为了避免这种情况,不建议以这种方式使用
echo

更好的解决方案是:


  • 将文本放入文件中,然后使用
    /bin/cat
    ,或者简单地使用
    您的终端中可能有一个不同的shell,而
    系统调用的shell则不同。这可能会导致shell调用不同的
    echo
    。在大多数外壳上,
    echo
    是内置的。此外,在您的终端上,echo可能是别名或函数。而且,以这种方式使用shell是非常危险的。请阅读关于@MichaelVeksler的文章,我知道命令注入,但这是我唯一能做到这一点的方法。关于回音,在我的外壳上,它工作得非常完美,所以我不明白系统调用的回音是如何不同的?我甚至不明白这个错误…谢谢。我使用echo的完整路径尝试了您的解决方案,它成功了(通过了escape keys问题tho)我很惊讶地知道系统调用在常规shell上是不一样的,谢谢您告诉我这一点。