Je veux créer un programme en langage C qui me permettrait d'exécuter une commande dans le terminal.
J'ai créé un programme en script Shell qui me donnerait l'adresse IP de n'importe quel site Web ouvert dans mon navigateur. Ce script 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, puis mon script Shell fonctionnerait.
S'il vous plaît dites-moi comment créer un tel programme.
vous pouvez utiliser la fonction system () disponible dans stdlib.h pour exécuter des commandes.
LA DESCRIPTION
system () exécute une commande spécifiée dans chaîne en appelant/bin/sh -c chaîne, et retourne une fois la commande terminée. Pendant l'exécution de la commande, SIGCHLD sera bloqué et SIGINT et SIGQUIT seront ignorés.
Vous pouvez en lire plus à ce sujet ici http://linux.about.com/library/cmd/blcmdl3_system.htm
Bonjour, je vais vous écrire un exemple de code, vous l'expliquer et espérer 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) lancez-le (par exemple sous Ubuntu) ./nom_programme nom_comman -anything - rien
exemple: ./a.out locale -a
cet exemple affiche tous les paramètres régionaux pris en charge par mon compilateur, à savoir gcc.
plus d'informations:
p est un pointeur vers un pointeur sur char (comme argv est) p = & argv [2], pointe vers une chaîne quelconque tout dans la chaîne cmd i quitte la boucle lorsque * p pointe sur NULL: -> Je vais utiliser ce symbole pour dire des points à (ne le confondez pas avec l'opérateur de sélection flèche droite).
argv [0] -> nom_programme
argv [1] -> nom_commande (dans cet exemple, le nom de la commande sera local, mais entrez la commande que vous souhaitez vérifier à la place)
argv [2] -> -anything (dans cet exemple -a, qui correspond à tous les paramètres régionaux)
argv [3] -> NULL (dans cet exemple, la boucle est fermée)
ok c'est tout, je pense.
Je vais supposer qu'il s'agit d'utiliser un binaire setuid-root pour remplacer Sudo, plutôt que l'exécution de commandes arbitraires. Je vais donc inclure les autres parties de la solution.
Pour des raisons de sécurité, nous évitons system () car il peut être détourné.
Après avoir compilé cela, installez le binaire résultant en tant que setuid-root.
# include <unistd.h> # include <stdio.h> # include <sysexits.h> int principal (int argc, char ** argv) { if (argc> 2) {fputs ("trop d'arguments\n", stderr); retourne EX_USAGE; } if (argc> 1 && argv [1] [0] == '-') {fputs ("aucune option autorisée\n", stderr); retourne EX_USAGE; } if (geteuid ()! = 0) {fputs ("n’a pas été correctement installé en tant que setuid-root\n", stderr); renvoyer EX_UNAVAILABLE; } if (setuid (0) 1) p [6] = argv [1]; /* Si tout se passe bien, execv ne renverra pas * * (car ce programme aura été remplacé par tcpdump) */ execv (p0, p); /* si nous atteignons ici, alors execv doit avoir échoué */ perror (p0); retourner EX_OSFILE; }
si vous avez enregistré ceci sous le nom foo.c
et que vous souhaitez l'installer sous le nom /usr/local/sbin/foo
, exécutez:
make foo && install -o root -m 4511 foo /usr/local/sbin/foo