преобразование bash (например, ssh) в c ++ с использованием std :: system

0

Я пытаюсь преобразовать свой код 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; делать""

  • 0
    Наверное, плохая идея. svn есть библиотека, и есть OpenSSL и т.д ..
  • 0
    Что плохого в использовании bash? И вы могли бы напечатать фактическую строку, которую вы сформулировали?
Показать ещё 11 комментариев
Теги:
ssh

2 ответа

0
Лучший ответ

В дополнение к экранированию кавычек мне также пришлось скрывать косые черты, как это

const std::string bashFunc("bash -c \\\"cd " + k_programPath + "; svn update; rm -rf build; make\\\"");

Это работает сейчас.

1

Не используйте system() в любых, но наиболее простых случаях - он добавляет дополнительный слой анализа синтаксиса, каждый из которых увеличивает количество цитирования и экранирования, участвующих в вашем коде. Вместо этого используйте члена семейства вызовов execv():

char * const command[] = {"bash", "-c", "yourcommand", NULL};
execv("/usr/bin/bash", command);

Перед достижением этого кода убедитесь, что fork() вы не скрываете выход из сценария и wait() в родительском процессе, если хотите, чтобы он прочитал статус выхода своего дочернего элемента.

  • 0
    Спасибо за предложение, я попробую это. Вместо fork () я буду использовать std :: async.
  • 1
    На самом деле это обязательно, что вы используете fork() . Попытка сделать его встроенным с помощью std::async() приведет к завершению вашего процесса при первом вызове exec * -series.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню