C - l'Exécution des Commandes Bash avec Execvp
Je veux écrire un programme Shellcode.c qui accepte en entrée un fichier texte qui contient des commandes bash separeted par un saut de ligne, et exécute toutes les commandes dans le fichier texte: par exemple, le fichier texte doit contenir:
echo Hello World
mkdir goofy
ls
J'ai essayé celui-ci (juste pour commencer à pratiquer avec l'une des fonctions exec):
#include <stdio.h>
#include <unistd.h>
void main() {
char *name[3];
name[0] = "echo";
name[1] = "Hello World";
name[2] = NULL;
execvp("/bin/sh", name);
}
- Je obtenir, en retour,
echo: Can't open Hello World
Je suis coincé avec la execvp fonction, où j'ai fait de mal?
Ce qui se passe avec nom[0] = "/bin/sh"; nom[1] = "echo"; nom[2] = "Bonjour le Monde"; nom[3]=NULL?
OriginalL'auteur elmazzun | 2013-01-03
Vous devez vous connecter pour publier un commentaire.
Vous le faites mal.
Le premier index de tableau est le nom du programme, comme expliqué dans les docs:
Aussi, bash n'attend pas de forme libre argument comme ça, vous devez lui dire que vous allez passer des commandes à l'aide de la
-c
option:Donc, vous avez besoin de:
echo 'hello world'
puisls
OriginalL'auteur unwind
Pour passer un script bash sur la ligne de commande, vous devez ajouter l'option "- c " et passer le script entier comme une seule chaîne, c'est à dire
OriginalL'auteur datenwolf
De nombreux problèmes: La
exec()
famille de fonctions de ne pas exécuter plusieurs programmes de ces fonctions exécuter un programme unique, et remplacer les processus en cours d'exécution dans la mémoire avec le nouveau programme. Le pointeur null-terminated tableau de chaînes que vous passez àexecvp
est censé contenir la ligne de commande arguments pour le programme exécuté parexecvp
.Si vous voulez exécuter plusieurs programmes, vous aurez besoin de faire une boucle sur chaque ligne et d'exécuter les programmes un par un. Mais vous ne pouvez pas utiliser
execvp
parce que remplace immédiatement le processus en cours d'exécution (votre programme C) avec le processus exécuté par le shell, ce qui signifie que le reste de votre programme C ne sera jamais exécutée. Vous avez besoin d'apprendre comment utiliserfork()
combiné avecexecvp
de sorte que vous pouvez exécuter les processus enfants. Vous appelez tout d'abordfork()
pour créer un processus enfant, et puis, dans le processus de l'enfant que vous appelezexecvp
. Fork + Exec est une stratégie commune dans des environnements UNIX pour lancer d'autres processus à partir d'un processus parent.OriginalL'auteur Charles Salvia