2015-11-23 2 views
0

Я пытаюсь запустить несколько команд (или с помощью простого перенаправления вывода) через execve().неожиданный EOF при поиске соответствия `'' при использовании execve()

Когда я кладу это (конечно, прежде чем я передать эту строку, чтобы функционировать я разделить на пробелы и положить каждый каждый отдельный обугливаться * []):

"bash -c ' /usr/bin/cat /root/script.sh > /root/script1.sh ' " 

в execve() функцию, Я получил сообщение об ошибке:

/usr/bin/cat: -c: line 0: unexpected EOF while looking for matching `''

/usr/bin/cat: -c: line 1: syntax error: unexpected end of file

Это мое предложение запустить несколько команд Linux (приложения, расположенные в PATH), используя функцию точно execve() (из соображений безопасности)

Но это решение не работает, как я ожидаю.

Любая идея исправить мое решение? Может быть, я могу использовать execve() иначе, но я не знаю, как ..

EDIT: Добавлено упрощена (извините, я не могу вставить в оригинальной форме, из-за компании ограничения) исходного кода:

int foo(const char *cmdline) 
{ 
    char d[] = "bash -c ' /usr/bin/cat /root/script.sh > /root/script1.sh ' "; 

    args = strtok(d, " "); 
    counter = 0; 
    while (args != NULL) 
    { 
     cmdline_args[counter++] = args; 
     args = strtok(NULL, " "); 
    } 
    cmdline_args[counter] = '\0'; 

    switch (pid = fork()) { 
    case -1: 
     ret = -1; 
    case 0: // for execve 
     status = execve(cmdline_args[0], cmdline_args, env); 
     exit(status); 
    default: // for parent pid 
     if (waitpid(pid, &status, 0) < 0) { 
      // in case when waitpid failed 
     } 
    } 
    return ret; 
} 
+0

Сообщение об ошибке говорит вам, имеют непревзойденную цитату где-то в строках, которые вы передаете 'execve()'. Проверяет строки, а также размещает соответствующий код. –

+0

показать свой код на C, проще помочь, когда его показать – developer

+0

Я добавил код. Я полагаю, что это достаточно хорошо, чтобы понять значение функции. @BlueMoon Я так думаю, но я не знаю, где ошибка. – maslokarol

ответ

0

Работы для меня, если сделать так:

cmdline_args[0] = "bash"; 
cmdline_args[1] = "-c"; 
cmdline_args[2] = "/usr/bin/cat /root/script.sh > /root/script1.sh"; 
cmdline_args[3] = NULL; 

Таким образом, проблема в том, что вы хруст всю строку из командной строки в strtok. Из-за этого bash получает несколько параметров (а не только один, как и предполагалось, - всю командную строку). bash, вероятно, только интерпретации первый параметр команды, так что вы будете в конечном итоге выполнение команды ' ...

Есть, вероятно, более эффективные способы, чтобы сделать это, хотя ...

+0

Вы правы. Проблема была вызвана использованием strtok. Спасибо за помощь. – maslokarol

1

Как ваш код написан только сейчас, это будет, я думаю, что выполнить исполняемый bash с аргументами:

[ "bash", "-c", "'", "/usr/bin/cat", "/root/script.sh", ">", "/root/script1.sh", "'", 0] 

Я предполагаю, что вы вместо этого хотите, чтобы стремиться к чему-то вроде:

[ "/bin/bash", "-c", "/usr/bin/cat /root/script.sh >/root/script1.sh", NULL] 

Бинарный код bash вряд ли хорошо реагирует на аргумент '. Когда bash обрабатывает команду, которую вы вводите, она выполняет довольно сложную работу по обработке содержимого цитируемых строк и вытаскивает из них фактические предполагаемые аргументы. Похоже, вам придется дублировать некоторые из этих работ, если вам действительно нужно обрабатывать почти произвольные команды в cmdline (в этом случае я бы отступил и подумал: «Это действительно правильный способ сделать X?») ,

Кроме того, execve требует полного пути к двоичному в качестве первого аргумента; он не ищет PATH.

Также^2: ваше название упоминает обратный отсчет `, но в вашем примере кода упоминаются отдельные правые кавычки ' - вы знаете, что они очень разные, да?

Смежные вопросы