Як використовувати програму C для запуску команди на терміналі?


11

Я хочу створити програму мовою C, яка дозволила б мені запустити команду в терміналі.

Я створив програму в оболонковому скрипті, яка дала б мені ip будь-якого веб-сайту, відкритого в моєму браузері. Цей скрипт оболонки виконується введенням цієї команди в термінал:

sudo tcpdump -n dst port 80 -i eth

Мій професор сказав мені створити програму мовою С, яка відкрила б термінал і введе цю команду, і тоді мій сценарій оболонки запрацює.

Скажіть, будь ласка, як створити таку програму.

Відповіді:


8

ви можете використовувати функцію system (), доступну в stdlib.h, для запуску команд.

ОПИС

system () виконує команду, вказану в рядку, викликаючи рядок / bin / sh -c, і повертається після завершення команди. Під час виконання команди SIGCHLD буде заблоковано, а SIGINT та SIGQUIT будуть ігноровані.

Більше про це можна прочитати тут http://linux.about.com/library/cmd/blcmdl3_system.htm


Це, безумовно, один із способів, але ви, мабуть, не хочете запускати команди з програми змінного струму, натомість у більшості програм Linux є вкладка, яка може просто просто кодувати програми. Наприклад, ssh може використовувати libssh . Зазвичай ДУЖЕ обмежена причина для запуску системних команд з коду. Якщо ви збираєтеся це робити багато, ви майже напевно робите щось не так.
coteyr

Я зробив програму на C таким чином
Tehseen Malik

4

Привіт, я напишу для вас приклад коду, поясню вам його і дуже сподіваюся, що це вам допоможе. прототип функції - це щось на зразок:

система int (const char * cmd);

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

#define MAX_CMN_LEN 100

int main(int argc, char *argv[])
{
    char cmd[MAX_CMN_LEN] = "", **p;

    if (argc < 2) /*no command specified*/
    {
        fprintf(stderr, "Usage: ./program_name terminal_command ...");
        exit(EXIT_FAILURE);
    }
    else
    {
        strcat(cmd, argv[1]);
        for (p = &argv[2]; *p; p++)
        {
            strcat(cmd, " ");
            strcat(cmd, *p);
        }
        system(cmd);
    }

    return 0;
}

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] -> command_name (у цьому прикладі ім'я команди буде локальним, але введіть команду, яку ви хочете перевірити)

argv [2] -> -що (у цьому прикладі -a, що є всіма локалями)

argv [3] -> NULL (у цьому прикладі це завершення циклу)

гаразд це, я думаю.


Переконайтеся, що ви не використовуєте це як виконаний із встановленням програм, оскільки він має очевидний подвиг переповнення буфера.
Мартін

0

Я припускаю, що мова йде про використання двійкового файла setuid-root для заміни sudo, а не просто довільного виконання команд, тому я збираюся включити інші частини рішення.

З питань безпеки ми уникаємо системи (), оскільки вона може бути викрадена.

Після компіляції встановіть отриманий бінарний файл як setuid-root.

#include <unistd.h>
#include <stdio.h>
#include <sysexits.h>

int main (int argc, char ** argv) {
    if (argc> 2) {fputs ("занадто багато аргументів \ n", stderr); повернути EX_USAGE; }
    if (argc> 1 && argv [1] [0] == '-') {fputs ("параметри не дозволені \ n", stderr); повернути EX_USAGE; }
    if (geteuid ()! = 0) {fputs ("неправильно встановлено як setuid-root \ n", stderr); повернути EX_UNAVAILABLE; }
    if (setuid (0) 1) p [6] = argv [1];

    / * Якщо все піде добре, execv не повернеться
     * (тому що цю програму буде замінено tcpdump) * /
    execv (p0, p);
    .

    переслідування (р0);
    повернути EX_OSFILE;
}

якщо ви зберегли це як foo.cі хочете встановити як /usr/local/sbin/foo, запустіть:

зробити foo && install -o root -m 4511 foo / usr / local / sbin / foo
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.