внедрение команд в C-программировании - PullRequest
1 голос
/ 18 марта 2011

Я выполнял команду echo, используя функцию system().Аргумент для команды echo происходит из аргумента командной строки.Но когда используется ';'в аргументе он показывает список каталогов.Что я должен сделать, чтобы избежать этого?Это из-за внедрения команд в моей программе?


обновление: код добавлен из комментария

#include<string.h> 
#include<stdio.h> 
#include<stdlib.h>

int main(int argc, char **argv) { 
    char cmd[50] = "echo "; 
    strcat(cmd,argv[1]); 
    system(cmd); 
} 

Я мог бы скомпилировать код, но во время выполнения, если я дам аргумент командной строки, например: '. / A.out привет; ls ', тогда происходит листинг каталога.

Ответы [ 4 ]

3 голосов
/ 18 марта 2011

Почему вы пытаетесь использовать доступ к оболочке (что именно и делает System ()), а затем пытаетесь ограничить его?

Если вам по какой-то причине нужно использовать 'echo', пожалуйста, соберитеваши собственные параметры execve () и прямой запуск / bin / echo .. таким образом, вы можете ограничить ущерб только задачами, которые может выполнить echo.

2 голосов
/ 18 марта 2011

При попытке запустить вашу программу с помощью команды ./a.out hello;ls вы фактически предоставляете оболочке две отдельные команды, которые она выполняет последовательно. Сначала оболочка запускает a.out с параметром командной строки "hello" in argv[1], который выводит его с помощью echo. Затем ваша программа завершается, и оболочка запускает следующую команду ls и отображает список каталогов.

Если вы хотите передать эту строку в программу в качестве параметра командной строки, вам нужно экранировать специальный символ оболочки ;, чтобы оболочка не анализировала его перед передачей вашей программе. Чтобы убежать от персонажа, поставьте перед ним \.

Попробуйте выполнить команду с ./a.out hello\;ls, а затем использовать printf вместо echo.

0 голосов
/ 18 марта 2011

system() очень сложно использовать безопасным способом.Гораздо проще просто использовать одну из функций exec*.

0 голосов
/ 18 марта 2011

[пока не могу ответить на другие ответы, поэтому отвечаю на вопрос] «Возможно ли получить аргумент с помощью«; », не используя« \ »в аргументе командной строки. Возможно ли мне включить« \ »из моей программы после получения argv?»

Нет, это невозможно. Интерпретация ";" выполняется оболочкой перед тем, как попасть в вашу программу, поэтому, если вы не уйдете при вызове, ваша программа никогда не узнает о «;» то есть PROG1 parms; PROG2

заставит оболочку (которая интерпретирует то, что вы печатаете) сделать следующее:

запустите PROG1 и передайте ему parms.

как только PROG1 будет завершен, запустите PROG2

Существует ряд специальных символов, которые оболочка примет по умолчанию, и ваша программа никогда не увидит: * для подстановочных знаков, | для каналов, для параллельного выполнения и т. д. Ничто из этого не будет видно при запуске программы, они просто сообщают оболочке делать специальные действия. В качестве альтернативы использованию «\», вы можете заключить свой параметр в одинарные или двойные кавычки (которые различаются, но для вашего примера оба будут работать). т.е .: ./a.out "привет; ls" ./a.out 'привет; ls'

Обратите внимание, что они будут работать для опции printf, если вы вызываете "system", вы фактически говорите C, чтобы запустить оболочку для запуска того, что вы передаете, так что ввод снова будет подвергнут интерпретации оболочки.

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