Richtige Escape-Funktion von Zeichen für die Shell-Ausführung aus ASP / VBScript

542
Mumpitz

Ich führe einen Curl-Aufruf von ASP mit dem WScript.Shell-Objekt aus.

Set objCmd = objWShell.Exec("cmd.exe /c echo "&dataString&" | /path/to/curl --cacert '/path/to/cert/cacert.pem' -X POST"&options&" -A """&useragent&""""&referer&" -F "&fileParamName&"=@-;type="&fileMIME&";filename=^"""&filename&"^"" --url """&url&"""") 

Dieser Befehl sendet eine Curl-Anforderung mit angehängter Datei. Der Inhalt der Datei stammt von stdin(den echo), da keine eigentliche Datei auf die Festplatte geschrieben werden muss.

Mein Problem ist, dass es so aussieht, als würden einige Anrufe aufgrund von Zeichen dataString, die den Befehl unterbrechen, nicht richtig funktionieren . Das dataStringenthält JSON mit Benutzereingaben aus der Datenbank.
Die JSON - Inhalte bereits erhalten codiert, so dass Zeichen umgewandelt bekommen \b, \t, \n, \f, \r, \", \/, \\oder als codierte \uXXXXZeichen, die verlassen dataString, die wie folgt aus :

{"field":"User-String with \"encoded\" characters!\r\nSome other characters look like \u00FC or \u00E4.\r\nQuestion Marks?, Exclamation Marks!, 'SingleQuotes' and who knows what!"} 

Also ... echo {"field":"..."} | ...wäre der String auszuführen.

Ich habe bisher versucht, doppelte Anführungszeichen und einfache Anführungszeichen zu verwenden oder zu entkommen, ^aber es funktioniert nicht richtig. Zumindest wenn ich versuche, es echo String | cat > testfile.txtin meinem Terminalfenster zu simulieren .

Welchen Charakteren muss ich entkommen und wie?

Edit:
Da ich die Lösung von devplayer für den Anruf mit Dateitransfer gewählt habe, denken Sie vielleicht, dass ich fertig bin. Aber jetzt bekam ich eine andere Art von Anruf ohne Dateiübertragung und ohne die Notwendigkeit einer Pipe, aber mit dem gleichen Problem der Benutzereingaben, das ordnungsgemäß umgangen werden muss.

Es ist wie:

curl ... -d "<properly escaped string>" --url ... 
0
Das hört sich vielleicht ein bisschen dumm an, aber haben Sie sogar Curl auf Ihrem Windows-Betriebssystem installiert? dmb vor 6 Jahren 0
Ja, ich mache bereits erfolgreiche Anfragen mit dieser Art von Befehl Mumpitz vor 6 Jahren 0
Mmm, versuche, Leerzeichen um das "&" zu schreiben, und für "" verwende einfach doppelte Anführungszeichen wie "" dmb vor 6 Jahren 0

1 Antwort auf die Frage

0
devplayer

Wie wäre es, wenn Sie Ihren langen String-Inhalt als Datei an Ihren Befehl übergeben? Dh speichern Sie Ihren Datastring in einer Datei.txt und füttern Sie den Inhalt der Datei wie folgt an den Befehl:

/path/to/curl --cacert '/path/to/cert/cacert.pem' -X POST"&options&" -A """&useragent&""""&referer&" -F "&fileParamName&"=@-;type="&fileMIME&";filename=^"""&filename&"^"" --url """&url&""" < file.txt 

?

Dann müsste ich nur noch den Dateipfad anstelle des Striches "-" angeben. Keine Notwendigkeit für "<file.txt". Es gibt aber eine Menge "Dateien", die die Festplatte sehr schnell füllen würden. Ich bin in Bezug auf Speicherplatz begrenzt, deshalb versuche ich es ohne eine tatsächliche Datei. Mumpitz vor 6 Jahren 0
Sie können immer dieselbe Datei wiederverwenden, sie müssen nicht gestapelt werden. Es ist wahr, dass es keine Lösung für die eigentliche Frage ist, aber ist es eine Lösung für das Problem? devplayer vor 6 Jahren 0
Dies ist die Lösung, die ich gewählt habe, aber nur, weil dadurch auch ein Größenproblem gelöst wurde. Da dies nicht die Antwort auf die Frage ist, werde ich sie nicht als akzeptierte Antwort markieren. Es sei denn, die Community glaubt es. ;) Mumpitz vor 6 Jahren 0