2008-10-29 20 views
7

Dans un laboratoire de sécurité des informations sur lequel je travaille, j'ai été chargé d'exécuter plusieurs commandes avec un seul appel à "system()" (écrit en C , fonctionnant sur Fedora). Quelle est la syntaxe qui me permettra d'exécuter plus de commande via system()? (L'idée étant que vous pouvez exécuter des commandes arbitraires via un programme en cours sur un ordinateur distant, si le programme interagit avec le système d'exploitation à travers le système() appel.)Utilisation d'un seul système() Appel pour exécuter plusieurs commandes dans C

Ie:

char command[] = "????? \r\n"; 
system(command); 
+0

Sauf si vous utilisez Windows, le retour chariot (\ r) est susceptible de causer des problèmes plutôt que de donner un avantage. Vous devriez être capable de séparer les commandes par des retours à la ligne - ou des points-virgules comme d'autres l'ont suggéré. –

+1

En termes de sécurité, permettre aux programmes distants d'exécuter des commandes arbitraires est un processus complexe, en général. C'est moins grave si le programme s'exécute localement avec les privilèges de l'utilisateur distant; s'il fonctionne avec n'importe quel privilège élevé, c'est désastreux. –

Répondre

13

Cela dépend de la shell invoqué pour exécuter les commandes, mais en général la plupart des shells utilisent ; pour séparer les commandes donc quelque chose comme cela devrait fonctionner:

command1; command2; command3 

[EDIT]

Comme @dicroce mentionné, vous pouvez utiliser && au lieu de ; qui arrêtera l'exécution à la première commande qui renvoie une valeur non nulle. Cela peut être désiré ou non (et certaines commandes peuvent retourner non nulles en cas de succès) mais si vous essayez de gérer des commandes qui peuvent échouer, vous ne devriez probablement pas enchaîner plusieurs commandes dans un appel system() car vous n'avez pas n'importe quel moyen de déterminer où la panne s'est produite. Dans ce cas, la meilleure solution serait soit d'exécuter une commande à la fois, soit de créer un script shell qui effectue le traitement d'erreur approprié et de l'appeler à la place.

1

Une possibilité vient immédiatement à l'esprit. Vous pouvez écrire toutes les commandes à un script puis exécutez avec:

system ("cmd.exe /c \"x.cmd\""); 

ou, maintenant que je l'ai remarqué que vous utilisez sur Fedora:

system ("x.sh"); 
8

Utilisez & & entre vos commandes. Il a l'avantage de ne continuer à exécuter des commandes que si elles renvoient des codes d'erreur réussis. Exemple:

"cd/proc & & cat cpuinfo"