Как включить строковую переменную (char *) в команду "system" - linux - PullRequest
6 голосов
/ 27 ноября 2010

char * S = "привет";// предположим, что он динамически размещен правильно

Я хочу использовать S в приведенном ниже выражении, когда S будет рассматриваться как строка со значением "hello"

system ("grep S searchtext.txt> result.txt");

Как мне это сделать?

Ответы [ 3 ]

8 голосов
/ 27 ноября 2010

В общем, очень * очень плохая идея использовать system вот так.system запускает команду через оболочку , что означает, что строка, передаваемая в system, зависит от всех переменных оболочки, расширения команд, интерпретации специальных символов и т. Д.

Если вы настаиваете на использовании system, вы должны сначала очистить вашу строку.Самый простой способ сделать это:

char *tmp = malloc(4*strlen(S)+3);
tmp[0] = '\'';
for (i=0,j=1; tmp[j]=S[i]; i++, j++)
    if (S[i]=='\'') tmp[++j]='\\', tmp[++j]='\'', tmp[++j]='\'';
tmp[j++] = '\'';
tmp[j++] = 0;
if (snprintf(cmd, sizeof cmd, "foo %s ...", tmp) >= sizeof cmd) goto error;
system(cmd);

Этот код заключает в кавычки всю строку S и заменяет любые встроенные одинарные кавычки на '\''.Обратите внимание, что я также проверил усечение командной строки на случай, если это может привести к выполнению опасных команд.

Лучшая альтернатива - полностью отказаться от system и выполнить свои собственные fork и exec для обходаоболочкаТогда нет командной строки для интерпретации;у вас есть полный контроль над аргументами (*argv[] массив), которые передаются внешней программе.

1 голос
/ 27 ноября 2010

В обычном C вы традиционно используете snprintf () для форматирования строки командной строки в буфер:

char buf[1024];
snprintf(buf, sizeof(buf), "grep '%s' searchtext.txt > result.txt", S);
system(buf);

Конечно, из соображений безопасности вы никогда не должны этого делатьесли S поступает из внешнего источника, такого как файл, база данных или сам пользователь.Это может привести к внедрению шелл-кода .

0 голосов
/ 27 ноября 2010

Ну есть системный примитив - execl, execp.Таким образом, вы можете сделать это execl("ls", "-la", NULL) в основном.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...