系统调用失败“不正确的节名称-e” C ++

时间:2019-05-13 07:20:34

标签: c++ linux dns system

我正在尝试使用C ++代码更新DNS。我的方法是将字符串与nsupdate一起使用。

当我用“ 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);

跟踪调试显示味精,当我将味精粘贴到我的终端上时,它可以工作...但是Jenkins调试器显示此:“不正确的节名称:-e 语法错误”

任何帮助将不胜感激

1 个答案:

答案 0 :(得分:1)

这是因为from collections import Counter a = pd.Series({i: Counter(g) for i, g in toy_df.groupby(by=['A'])['B']}) print (a) ABC {'AX': 2, 'BX': 1} XYZ {'AX': 2} dtype: object 像您的终端一样呼叫system而不是/bin/sh。某些$SHELL实现将简单地回显字符/bin/sh,就像内置-e将打印到标准输出的任何其他文本一样。该echo照原样传递给-e,并造成混淆。这种混乱会导致错误。

正确的解决方案是避免完全使用nsupdate,尤其是避免构造传递给system的字符串。当然,如果要避免内置echo,可以使用/bin/echo,但是建议不要以这种方式使用echo来避免command injection

更好的解决方案是采用以下任一方法:

  1. 将文本放入文件中并使用echo,或简单地使用/bin/cat重定向输入。安全地使用文件非常棘手。除非您正确操作,否则有人可能会读取敏感数据或操纵文件。
  2. 使用<some_temp_file代替系统,仅调用popen
  3. 使用/usr/bin/nsupdate -l -vfork变体之一,仅调用execve

请注意,请使用完整路径/usr/bin/nsupdate -l -v,并且不要依赖PATH,因为PATH可能会被恶意第三方操纵。