2010-09-08 14 views
6

¿Qué función debo usar para escapar cadenas para el argumento del comando de shell en C?Función C para escapar de la cadena para el argumento del comando de shell?

  1. que tienen una cadena:

    This is a string with() characters

  2. Esto será de error:

    echo This is a string with() characters

  3. Estos son OK:

    echo "This is a string with() characters"

    echo This is a string with \(\) characters

¿Hay un convertido función predefinida # 2 a # 3 en do?

Respuesta

6

Reemplazar todas las instancias de ' con '\'' y luego encerrar toda la cadena entre comillas simples (') es una forma segura. Esto funciona incluso con nuevas líneas incorporadas. Otro método sería insertar \ antes de cada carácter, excepto que luego debe hacer un tratamiento especial para líneas nuevas ya que \ seguido de una nueva línea es ignorado por el shell, no se trata como una nueva línea literal. Tendría que rodear las líneas nuevas con ' (comillas simples).

+1

intente esto con la secuencia: a'b. para mí, echo 'a' 'b' ... no funciona en bash, pero echo 'a' "'"' b 'hace .... –

+1

@ErikAronesty: dije que reemplazara '' 'con' '\' '', no con' \' '. –

+0

Tenga en cuenta que citar ''' da como resultado '' '\' ''', que en realidad es una secuencia de tres cadenas que se anexan en la evaluación. Por lo tanto, esta no es una cita real. – ManuelSchneid3r

1

Nada predefinido, y qué caracteres necesitan escaparse depende de su caparazón. Mira los documentos de tu caparazón y reemplaza cada X con \ X. El uso de comillas dobles "requerirá el mismo tratamiento si la cadena que encierra contiene un".

También tenga en cuenta que esto va a llegar más complicado si va a encapsular expresiones más complicadas (nada compuestas con un ';', por ejemplo)

0

Su segunda versión del 3. es fácil, no?

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

Esto rompe en caso de que la cadena contiene comillas (' "'). –

2

No hay una función predefinida.

Sin embargo, creo que es suficiente simplemente incluir cualquier argumento de shell entre comillas simples, y asegurándose de que las comillas simples se escapen.

Esa es la lógica de la función escapeshellarg en PHP y creo que funciona razonablemente bien.

+0

En el contexto de las conchas en cuenta que hay un differece entre qouting con comillas simples o dobles. Con comillas dobles [tienes que escapar $ y 'también] (https://www.gnu.org/software/bash/manual/html_node/Double-Quotes.html#Double-Quotes). – ManuelSchneid3r

+0

Además, tenga en cuenta que las shells no permiten comillas simples en cadenas entre comillas simples. – ManuelSchneid3r

1

C no es mi lenguaje de elección, pero esto es lo que se me ocurrió (tener que responder la misma pregunta, yo mismo).

#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; 
} 

Dada escape'this', se dará salida a 'escape'\''this'\''', que puede entonces ser pasado a echo.

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

¿no es una operación costosa de RealLoC? Recuerdo que es posible que toda la cadena se haya copiado en un lugar nuevo. Sería mejor asignar 2 * str_size al comienzo. A menudo no usas argumentos con mucho '' 'pero aún así ... – NickSoft

Cuestiones relacionadas