2010-09-08 5 views
6

Quelle fonction dois-je utiliser pour échapper des chaînes pour l'argument de commande shell dans C?C fonction pour échapper la chaîne pour l'argument de commande shell?

  1. J'ai une chaîne:

    This is a string with() characters

  2. Ce sera une erreur:

    echo This is a string with() characters

  3. Ce sont OK:

    echo "This is a string with() characters"

    echo This is a string with \(\) characters

Y at-il une fonction convert prédéfinie # 2 à # 3 en C?

Répondre

6

Le remplacement de toutes les instances de ' par '\'' puis par l'insertion de la chaîne entière entre guillemets simples (') est un moyen sûr. Cela fonctionne même avec les nouvelles lignes intégrées. Une autre méthode consiste à insérer \ avant chaque caractère, sauf que vous devez alors faire un traitement spécial pour les retours à la ligne depuis \ suivi d'un retour à la ligne ignoré par le shell, non traité comme un retour chariot littéral. Vous devez entourer les nouvelles lignes avec ' (guillemets simples).

+1

essayez ceci avec une chaîne: a'b. pour moi, echo 'a \' b '.... ne fonctionne pas dans bash, mais echo' a '' '' 'b' fait .... –

+1

@ErikAronesty: J'ai dit de remplacer '' 'par' '\' '', pas avec' \' '. –

+0

Notez que le fait de citer '' 'aboutit' ''\' ''', qui est en fait une suite de trois chaînes qui sont ajoutées en évaluation. Donc ce n'est pas une vraie citation. – ManuelSchneid3r

1

Rien de prédéfini, et quels caractères doivent s'échapper dépend de votre shell. Regardez les documents pour votre shell, et remplacez chaque X par \ X. L'utilisation de guillemets "nécessitera le même traitement si la chaîne que vous entourez contient un".

Notez également que cela va se compliquer si vous avez l'intention d'encapsuler des expressions plus complexes (tout mélangé avec un « ; », par exemple)

0

Votre deuxième version de 3. est facile, non?

printf("\"%s\"", your string); 
+3

Ce casse si la chaîne contient des guillemets ('" '). –

2

Il n'existe aucune fonction prédéfinie.

Cependant, je crois qu'il suffit de placer tout argument shell entre guillemets simples, et de s'assurer que les guillemets simples sont échappés.

C'est la logique de la fonction escapeshellarg en PHP et je crois que cela fonctionne raisonnablement bien.

+0

Dans le contexte de coquilles noter qu'il ya un differece entre qouting avec des guillemets simples ou doubles. Avec des guillemets doubles [vous devez échapper $ et 'aussi bien] (https://www.gnu.org/software/bash/manual/html_node/Double-Quotes.html#Double-Quotes). – ManuelSchneid3r

+0

Notez par ailleurs que les shells n'autorisent pas les guillemets simples dans les guillemets simples. – ManuelSchneid3r

1

C n'est pas ma langue de choix, mais voici ce que j'ai trouvé (devoir répondre à la même question, moi-même).

#include <stdio.h>  // sprintf 
#include <stdlib.h> // malloc 
#include <string.h> // strlen 

char* escapeshellarg(char* str) { 
    char *escStr; 
    int i, 
     count = strlen(str), 
      ptr_size = count+3; 

    escStr = (char *) calloc(ptr_size, sizeof(char)); 
    if (escStr == NULL) { 
     return NULL; 
    } 
    sprintf(escStr, "'"); 

    for(i=0; i<count; i++) { 
     if (str[i] == '\'') { 
        ptr_size += 3; 
      escStr = (char *) realloc(escStr,ptr_size * sizeof(char))); 
      if (escStr == NULL) { 
       return NULL; 
      } 
      sprintf(escStr, "%s'\\''", escStr); 
     } else { 
      sprintf(escStr, "%s%c", escStr, str[i]); 
     } 
    } 

    sprintf(escStr, "%s%c", escStr, '\''); 
    return escStr; 
} 

Compte tenu escape'this', il sortira 'escape'\''this'\''', qui peut ensuite être passé à echo.

$ echo 'escape'\''this'\''' 
escape'this' 
+0

n'est pas realloc opération escpensive? Je me souviens qu'il est possible que toute la chaîne soit copiée dans un nouvel endroit. Il vaudrait mieux allouer 2 * str_size au début. Vous n'utilisez pas souvent des arguments avec beaucoup de "" mais quand même ... – NickSoft