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'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.
Veuillez me dire comment créer un tel programme.
la source
Bonjour, je vais vous écrire 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:
système int (const char * cmd);
1). ouvrir un terminal et compiler le programme
2). exécutez-le (par exemple dans Ubuntu) ./program_name nom_comman -anything - n'importe quoi
exemple: ./a.out locale -a
cet exemple affiche tous les paramètres régionaux pris en charge par mon compilateur qui est gcc.
Plus d'informations:
p est un poniter pour pointer vers char (comme argv est) p = & argv [2], pointe sur -toute chaîne i cat all -anythings sur ma chaîne cmd je quitte la boucle lorsque * p pointe sur NULL regardez ceci: -> j'utiliserai ce symbole pour dire des points (ne le confondez pas avec l'opérateur de sélection de la flèche droite).
argv [0] -> nom_programme
argv [1] -> nom_commande (dans cet exemple, le nom de la commande sera locale, mais entrez la commande que vous souhaitez vérifier à la place)
argv [2] -> -anything (dans cet exemple -a, qui est tous les locales)
argv [3] -> NULL (dans cet exemple, cela quitte la boucle)
ok c'est tout, je pense.
la source
Je vais supposer qu'il s'agit d'utiliser un binaire setuid-root pour remplacer sudo, plutôt que d'exécuter simplement des commandes arbitraires, donc je vais 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.
si vous l'avez enregistré sous
foo.c
et souhaitez qu'il soit installé sous/usr/local/sbin/foo
, exécutez:la source