我正在尝试使用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 语法错误”
任何帮助将不胜感激
答案 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。
更好的解决方案是采用以下任一方法:
echo
,或简单地使用/bin/cat
重定向输入。安全地使用文件非常棘手。除非您正确操作,否则有人可能会读取敏感数据或操纵文件。<some_temp_file
代替系统,仅调用popen
/usr/bin/nsupdate -l -v
和fork
变体之一,仅调用execve
。请注意,请使用完整路径/usr/bin/nsupdate -l -v
,并且不要依赖PATH,因为PATH可能会被恶意第三方操纵。