Come usare un programma C per eseguire un comando sul terminale?


11

Voglio creare un programma in linguaggio C che mi consenta di eseguire un comando nel terminale.

Ho creato un programma in shell script che mi darebbe l'ip di qualsiasi sito Web aperto nel mio browser. Questo script della shell viene eseguito immettendo questo comando nel terminale:

sudo tcpdump -n dst port 80 -i eth

Il mio professore mi ha detto di creare un programma in linguaggio C che avrebbe aperto il terminale e inserito questo comando e quindi il mio script shell avrebbe funzionato.

Per favore, dimmi come creare un programma del genere.

Risposte:


8

è possibile utilizzare la funzione system () disponibile in stdlib.h per eseguire i comandi.

DESCRIZIONE

system () esegue un comando specificato in stringa chiamando / bin / sh -c stringa e ritorna dopo che il comando è stato completato. Durante l'esecuzione del comando, SIGCHLD verrà bloccato e SIGINT e SIGQUIT verranno ignorati.

Puoi leggere di più al riguardo qui http://linux.about.com/library/cmd/blcmdl3_system.htm


Questo è certamente un modo, ma probabilmente non vuoi eseguire comandi dal programma ac, invece, la maggior parte dei programmi Linux ha una lib che può solo direttamente il codice dei programmi. Ad esempio ssh può usare libssh . Di solito c'è un motivo MOLTO limitato per eseguire comandi di sistema dal codice. Se stai andando molto, quasi sicuramente stai facendo qualcosa di sbagliato.
Coteyr,

Ho fatto un programma in C come questo
Tehseen Malik,

4

Ciao scriverò per te un codice di esempio, te lo spiegherò e spero davvero che questo ti aiuti. il prototipo della funzione è simile a:

int system (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). aprire un terminale e compilare il programma

2). eseguirlo (ad esempio in Ubuntu) ./program_name nome_comando -qualcosa - qualsiasi cosa

esempio: ./a.out locale -a

questo esempio stampa tutte le localizzazioni supportate dal mio compilatore che è gcc.

Ulteriori informazioni:

p è un poniter per puntare a char (come argv is) p = & argv [2], punta a -nulla stringa i cat tutto -tutto sulla mia stringa cmd ho lasciato il ciclo quando * p punta a NULL guarda questo: -> userò questo simbolo per dire i punti (non confonderlo con l'operatore di selezione della freccia a destra).

argv [0] -> nome_programma

argv [1] -> command_name (in questo esempio il nome del comando sarà locale, ma inserisci invece il comando che vuoi controllare)

argv [2] -> -qualcosa (in questo esempio -a, che è tutto locale)

argv [3] -> NULL (in questo esempio, questo chiude il ciclo)

ok questo è tutto, penso.


Assicurati di non usarlo come eseguibile setuid, perché ha un evidente exploit buffer overflow.
Martin,

0

Presumo che si tratti dell'utilizzo di un binario setuid-root per sostituire sudo, piuttosto che solo l'esecuzione di comandi arbitrari, quindi includerò le altre parti della soluzione.

Per motivi di sicurezza, evitiamo system () perché può essere dirottato.

Dopo averlo compilato, installa il file binario risultante come setuid-root.

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

int main (int argc, char ** argv) {
    if (argc> 2) {fputs ("troppi argomenti \ n", stderr); ritorna EX_USAGE; }
    if (argc> 1 && argv [1] [0] == '-') {fputs ("nessuna opzione consentita \ n", stderr); ritorna EX_USAGE; }
    if (geteuid ()! = 0) {fputs ("non installato correttamente come setuid-root \ n", stderr); ritorno EX_UNAVAILABLE; }
    if (setuid (0) 1) p [6] = argv [1];

    / * Se tutto va bene, execv non ritorna
     * (perché questo programma sarà stato sostituito da tcpdump) * /
    execv (p0, p);
    / * se arriviamo qui allora execv deve aver fallito * /

    perror (p0);
    return EX_OSFILE;
}

se lo hai salvato come foo.ce lo vuoi installare come /usr/local/sbin/foo, esegui:

make foo && install -o root -m 4511 foo / usr / local / sbin / foo
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.