6
votes

Comment inclure une variable de chaîne (Char *) dans la commande "Système" - Linux

char * s = "bonjour"; // suppose qu'il est dynamiquement attribué correctement

Je veux utiliser S dans la déclaration ci-dessous lorsque S serait traité comme une chaîne avec la valeur "Bonjour".

système ("grep s SearchText.txt> résultat.txt");

Comment puis-je faire cela?


1 commentaires

C'est const char * = "bonjour";


3 Réponses :


1
votes

dans la plaine C, vous utilisez traditionnellement snprintf () pour formater votre chaîne de ligne de commande dans un tampon: xxx

bien sûr, pour des raisons de sécurité, vous ne devez jamais faire cela si s provient d'une source externe telle qu'un fichier, une base de données ou l'utilisateur lui-même. Cela pourrait conduire à Injection de code shell .


3 commentaires

Ce code est très mauvais et soumis à une vulnérabilité classique. Considérez ce qui se passe lorsque la chaîne s est "'; rm -rf /'"


@Eternal apprenant, vous voudrez peut-être écouter @r .. bien que sa réponse soit plus compliquée, il a raison dans le cas général :)


Bien que pas aussi sévère que l'injection de code, cela échoue également lorsque S est> ~ 1000 caractères. SNPRINTF () Peut empêcher les débordements de la mémoire tampon, mais peut alors vous laisser des vulnérabilités en fonction de la troncature de chaîne.



8
votes

En général, c'est une très très mauvaise idée d'utiliser système comme ceci. système exécute la commande via la coquille , ce qui signifie que la chaîne que vous passez à système est soumise à la totalité de la totalité de l'expansion de la variable de la coque, l'expansion de la commande, Interprétation spéciale des caractères, etc.

Si vous insistez sur l'utilisation de System , vous devez DO PREMIER SANITIZEZ votre chaîne. Le moyen le plus simple de faire est le suivant: xxx

Ce code célibataire-cite la chaîne totale s et remplace toutes les citations simples intégrées avec '\' '. Notez que j'ai également vérifié la troncature de la ligne de commande au cas où elle pourrait conduire à une exécution de commandes dangereuses.

Une meilleure alternative serait d'abandonner le système entièrement et effectuer votre propre Fourchette et EXEC pour contourner la coque. Ensuite, il n'y a pas de ligne de commande à interpréter; Vous avez le contrôle total sur les arguments ( * argv [] tableau) qui sont transmis au programme externe.


1 commentaires

Plus si la chaîne est un paramètre "Grep" (ou une commande similaire), il vaut la peine d'ajouter "-" comme paramètre avant la chaîne, pour arrêter la chaîne d'être interprétée comme une option Grep s'il arrive de commencer par un " - ".



0
votes

Eh bien il y a une primitive système - Execl, Execp. Donc, vous pouvez faire ce exécutant ("ls", "-la", null) dans MAIN.


1 commentaires

Vous voudrez probablement FORK D'abord, à moins que votre programme ait fini de faire tout ce qu'il veut faire.