выполнение переменной в system () на C ++

Я хочу выполнить переменную внутри system(""). Например как

system("iptables -i input -s VARIABLE -j drop")

VARIABLE - это IP-адрес, но он будет каждый раз меняться.

как я могу сделать это на C ++? если нет, то какое решение?


c++
person IFL    schedule 22.05.2016    source источник
comment
Не system("iptables -i input -s $VARIABLE -j drop") сработало? Какая у вас операционная система?   -  person πάντα ῥεῖ    schedule 22.05.2016
comment
попробуйте std :: execl. Пример использования: execl (/ bin / ls, ls, -l, (char *) 0);   -  person Zohar81    schedule 22.05.2016


Ответы (4)


Используйте std::string для команды:

std::string cmd = "iptables -i input -s ";
std::string ipaddr = "192.168.11.22";
cmd += ipaddr;
cmd += "  -j drop";
system(cmd.c_str());

Или немного проще, используя std::ostringstream:

std::string ipaddr = "192.168.11.22";
std::ostringstream oss;
oss << "iptables -i input -s " << ipaddr << " -j drop";
system(oss.str().c_str());
person πάντα ῥεῖ    schedule 22.05.2016
comment
Я не уверен, что это намного проще - 6 из полторы дюжины других - person Ed Heal; 22.05.2016
comment
Большое спасибо, это работает ... и я пробую это со строкой массива, и это тоже работает. большое спасибо.. - person IFL; 23.05.2016

Попробуй это

string cmd = "iptables -i input -s ";
cmd += VARIABLE;
cmd += " -j drop";
system(cmd.c_str());

Здесь команда построена для включения переменной.

person Ed Heal    schedule 22.05.2016

Вы генерируете строку во время выполнения. Например:

std::string varip = somefunctiongivingastring();
std::string cmdstr= "iptables -i input -s " + varip + " -j drop";

Затем вы передаете его system, преобразовывая его в необработанный const char* с помощью

system (cmdstring.c_str());

Вы можете сделать то же самое на C, например

char cmdbuf[256];
char* varip = somfunctiongivingacstring();
snprintf (cmdbuf, sizeof(cmdbuf), "iptables -i input -s %s -j drop", varip);

Однако остерегайтесь внедрения кода; представьте, что может случиться, если somefunctiongivingacstring() вернет "127.0.0.1; rm -rf $HOME; echo "string

person Basile Starynkevitch    schedule 22.05.2016

Вы можете сгенерировать строку во время выполнения, используя следующий код (IP-адрес можно заменить строковой переменной):

std::string ipAddress = "127.0.0.1";
std::stringstream ss;
ss << "iptables -i input -s " + ipAddress + " -j drop";
system(ss.str());

Чтобы правильно скомпилировать этот код, вам необходимо включить следующий заголовочный файл:

#include <sstream>
person Francesco Argese    schedule 22.05.2016