11 votes

Comment utiliser un programme C pour exécuter une commande sur un terminal ?

Je souhaite créer un programme en langage C qui me permettrait d'exécuter une commande dans le terminal.

J'ai créé un programme dans Shell Shell qui me donnerait l'adresse IP de n'importe quel site web ouvert dans mon navigateur. Ce Shell Shell est exécuté en entrant cette commande dans le terminal :

sudo tcpdump -n dst port 80 -i eth

Mon professeur m'a dit de créer un programme en langage C qui ouvrirait le terminal et entrerait cette commande et alors mon Shell Shell fonctionnerait.

Veuillez m'indiquer comment créer un tel programme.

8voto

Mevin Babu Points 583

Vous pouvez utiliser le système() disponible en stdlib.h pour exécuter des commandes.

DESCRIPTION

system() exécute une commande spécifiée dans la chaîne en appelant /bin/sh -c et revient à la fin de la commande. [ ] l'exécution de la commande, SIGCHLD sera bloqué, et SIGINT et SIGQUIT sont ignorés.

Pour en savoir plus, cliquez ici http://linux.about.com/library/cmd/blcmdl3_system.htm

6voto

NEMKA Points 61

Bonjour, je vais écrire pour vous un exemple de code, vous l'expliquer et j'espère vraiment que cela vous aidera. le prototype de la fonction est quelque chose comme :

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). ouvrir un terminal et compiler le programme

2) Lancer le programme (par exemple sous Ubuntu) ./program_name comman_name -anything - anything

exemple : ./a.out locale -a

cet exemple affiche toutes les locales supportées par mon compilateur qui est gcc.

plus d'info :

p est un pointeur sur un caractère (comme argv) p = &argv[2], pointe sur une chaîne de -quelque chose je cat tous les -anythings dans ma chaîne cmd je quitte la boucle quand *p pointe sur NULL regardez ceci : -> j'utiliserai ce symbole pour dire pointe vers (ne le confondez pas avec l'opérateur de sélection de la flèche droite).

argv[0] -> nom du programme

argv[1] -> command_name (dans cet exemple, le nom de la commande sera locale, mais entrez la commande que vous voulez vérifier à la place)

argv[2] -> -anything (dans cet exemple -a, qui correspond à toutes les locales)

argv[3] -> NULL (dans cet exemple, cela permet de quitter la boucle)

Ok, c'est tout, je pense.

0voto

Martin Points 186

Je vais supposer qu'il s'agit d'utiliser un binaire setuid-root pour remplacer le binaire sudo, plutôt que de l'exécution arbitraire d'une commande, je vais donc inclure les les autres parties de la solution.

Pour des raisons de sécurité, nous évitons la fonction system() car elle peut être détournée.

Après l'avoir compilé, installez le binaire résultant en tant que setuid-root.

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

int main(int argc, char \*\*argv) {
    if (argc > 2) { fputs("too many args\\n", stderr); return EX\_USAGE; }
    if (argc > 1 && argv\[1\]\[0\] == '-') { fputs("no options allowed\\n", stderr); return EX\_USAGE; }
    if (geteuid() != 0) { fputs("not correctly installed as setuid-root\\n",stderr); return EX\_UNAVAILABLE; }
    if (setuid(0)  1) p\[6\] = argv\[1\];

    /\* If all goes well, execv won't return
     \* (because this program will have been replaced by tcpdump) \*/
    execv(p0, p);
    /\* if we reach here then execv must have failed \*/

    perror(p0);
    return EX\_OSFILE;
}

si vous l'avez enregistré en tant que foo.c et souhaite qu'il soit installé en tant que /usr/local/sbin/foo , courir :

make foo && install -o root -m 4511 foo /usr/local/sbin/foo

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X