Отправить несколько аргументов в system() в C

Предположим, у меня есть один сценарий bash, который выполняет все, что имеет в аргументах

#!/bin/bash
$1

Итак, команда ./one_line_script.sh "ls -lh" работает отлично. Также у меня есть C-код, который принимает аргументы и отправляет их в мой bash-скрипт.

  int main (int argc, char* argv[])
  {
     char command[1000];
     sprintf(command, "/path/to/one_line_script.sh %s", argv[1]);
     system(command);
   return 0;
  }

И здесь у меня проблема, потому что ./c_program "ls -lh" только возвращается ls выход. Он не понимает мало аргументов. Как мне нужно изменить мой код C, чтобы он мог принимать несколько аргументов?

3 ответа

Я бы порекомендовал использовать fork а также exec непосредственно, чтобы избежать цитирования вопросов в целом. Рассмотрим, например, что происходит, если ' содержится в аргументе - при выполнении sprintf Командная строка убивает это приводит к нарушению командной строки.

int pid = fork();

if(pid == 0) {
    execl("/bin/sh", "sh", "-c", arg1, arg2, arg3, 0);
} else {
    int status=0;
    waitpid(pid, &status, 0);
}

Вы должны также указать это в вашем sprintf, иначе bash получит только один аргумент:)

sprintf(command, "/path/to/one_line_script.sh '%s'", argv[1]);

Я добавил цитаты (') вокруг%s.

Вы также можете использовать $@ вместо $1 в вашем bash-скрипте, поэтому он будет принимать все передаваемые ему аргументы.

Пытаться:

int i;

command[0] = '\0';
for (i = 1; i < argc; i++)
  strcat (command, argv[i]);

system (command);

Это должно работать, но имейте в виду, что в нем много угроз безопасности: в первую очередь выполнение любой возможной команды, которую вы получаете в командной строке, может позволить пользователям делать то, что им обычно не разрешено (не устанавливайте вашу программу!). Тогда буфер может легко переполниться и разрешить все виды разрушения стека. Поэтому я бы сказал: используйте эту программу только как инструмент обучения, чтобы научиться манипулировать argc/argv и начать думать о безопасности. Даже не компилируй это!

Другие вопросы по тегам