Ошибка системного вызова "Неверное имя раздела -e" C ++ - PullRequest
1 голос
/ 13 мая 2019

Я пытаюсь обновить DNS, используя код C ++.Мой метод заключается в использовании строки с каналом с 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);

Отладка трассировки показывает сообщение MSG, и когда я вставляю сообщение MSG в мой терминал, это работает ... но отладчик Jenkins показывает это: "неверное имя раздела: -e ошибка синтаксиса"

Буду признателен за любую помощь

1 Ответ

1 голос
/ 13 мая 2019

Это потому, что system вызывает /bin/sh вместо $SHELL, как ваш терминал.Некоторые реализации /bin/sh будут просто отображать символы -e, как и любой другой текст, который встроенный echo будет печатать на стандартный вывод.Это -e передается nsupdate как есть и смущает его.Эта путаница вызывает ошибку.

Правильное решение состоит в том, чтобы вообще не использовать system и особенно избегать создания строки, которую вы передаете echo.Конечно, вы можете использовать /bin/echo, если хотите избежать встроенного echo, но использование echo таким образом не рекомендуется, чтобы избежать внедрения команды .

Лучшим решением было бы одно из:

  1. поместить текст в файл и использовать /bin/cat, или просто использовать <some_temp_file для перенаправления ввода.Безопасно использовать файл сложно.Кто-то может прочитать конфиденциальные данные или манипулировать файлом, если вы не сделаете это правильно.
  2. Используйте popen вместо системы, вызывая только /usr/bin/nsupdate -l -v
  3. Используйте fork и один из execve вариантов, только вызов /usr/bin/nsupdate -l -v.

Обратите внимание, используйте полный путь /usr/bin/nsupdate и не полагайтесь на PATH, так как PATH может манипулировать злонамеренная третья сторона.

...