Отправить несколько аргументов в 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
и начать думать о безопасности. Даже не компилируй это!