Я хочу создать программу на языке Си, которая позволила бы мне запустить команду в терминале.
Я сделал программу в сценарии оболочки, которая даст мне IP-адрес любого веб-сайта, который открывается в моем браузере. Этот сценарий оболочки выполняется путем ввода этой команды в терминал:
sudo tcpdump -n dst port 80 -i eth
Мой профессор сказал мне создать программу на языке C, которая открывала бы терминал и вводила эту команду, и тогда мой сценарий оболочки работал бы.
Подскажите пожалуйста, как создать такую программу.
источник
Здравствуйте, я напишу для вас пример кода, объясню его вам и очень надеюсь, что это поможет вам. прототип функции выглядит примерно так:
int system (const char * cmd);
1). откройте терминал и скомпилируйте программу
2). запустите его (например, в Ubuntu) ./program_name comman_name -anything - что угодно
пример: ./a.out locale -a
этот пример печатает все локали, поддерживаемые моим компилятором gcc.
больше информации:
p - это указатель на указатель на char (как и argv) p = & argv [2], указывает на что-либо строку, я перебираю все что угодно в моей строке cmd, я выхожу из цикла, когда * p указывает на NULL, посмотрите на это: -> я буду использовать этот символ для обозначения точек (не путайте его с оператором выбора стрелки вправо).
argv [0] -> имя_программы
argv [1] -> имя_команды (в этом примере имя команды будет локаль, но введите команду, которую вы хотите проверить вместо)
argv [2] -> -anything (в этом примере -a, все локали)
argv [3] -> NULL (в этом примере это выходит из цикла)
хорошо, вот и все, я думаю.
источник
Я собираюсь предположить, что речь идет об использовании двоичного файла setuid-root для замены sudo, а не просто произвольного выполнения команд, поэтому я собираюсь включить другие части решения.
В целях безопасности мы избегаем system (), потому что он может быть взломан.
После компиляции установите полученный бинарный файл как setuid-root.
если вы сохранили это как
foo.c
и хотите установить как/usr/local/sbin/foo
, запустите:источник