Я пытаюсь преобразовать свой код bash в код c++. У меня есть что-то вроде этого:
ssh ${USER}@${HOSTS[0]} "bash -c \"cd ${PROGRAM_PATH}; svn update; rm -rf build; make\""
Как я могу преобразовать это в c++ с помощью std :: system? Я попробовал это:
const std::string bashFunc("bash -c \"cd " + k_programPath + "; svn update; rm -rf build; make\"");
const std::string func(getSSH(k_user, server) + " \"" + bashFunc + "\"");
std::system(func.c_str());
Когда я печатаю func, все выглядит хорошо. Но когда я запускаю его, он не соединяется с ssh и только пытается выполнить команды bash в моей локальной папке.
EDIT: Это выглядит так:
ssh username @server "bash -c" cd./path/to/folder; обновление svn; rm -rf build; делать""
В дополнение к экранированию кавычек мне также пришлось скрывать косые черты, как это
const std::string bashFunc("bash -c \\\"cd " + k_programPath + "; svn update; rm -rf build; make\\\"");
Это работает сейчас.
Не используйте system()
в любых, но наиболее простых случаях - он добавляет дополнительный слой анализа синтаксиса, каждый из которых увеличивает количество цитирования и экранирования, участвующих в вашем коде. Вместо этого используйте члена семейства вызовов execv()
:
char * const command[] = {"bash", "-c", "yourcommand", NULL};
execv("/usr/bin/bash", command);
Перед достижением этого кода убедитесь, что fork()
вы не скрываете выход из сценария и wait()
в родительском процессе, если хотите, чтобы он прочитал статус выхода своего дочернего элемента.
fork()
. Попытка сделать его встроенным с помощью std::async()
приведет к завершению вашего процесса при первом вызове exec * -series.
svn
есть библиотека, и есть OpenSSL и т.д ..