GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Escape-Strings sollen über Curl gepostet werden?

Ich versuche, ein Skript zu erstellen, das einige Atom-Feeds aufnimmt und sie über curl über die Slack-API an Slack sendet . Was ich jetzt habe, funktioniert für einfache Texte, aber einige von ihnen haben doppelte Anführungszeichen oder & Zeichen in ihnen und das scheint die Slack-API zu stören, da ich eine invalid payload erhalte Error. Hier ist mein Skript:

#!/bin/bash
rsstail -i 3 -u "http://MY_FEED_URL" -n 0 | while read line;
do
    # This is just a sample text, it should be ${line}
    data='Something "&" and something do " "';
    payload="payload={"channel": "#my_channel", "username": "Bot", "text": "${data}", "icon_emoji": ":ghost:"}";
    echo ${payload};
    curl 
        -H "Accept: application/json" 
        -X POST 
        -d '${payload}' 
        https://hooks.slack.com/services/xxxx

Die Ausgabe des „Echos“ ist:

payload={"channel": "#my_channel", "username": "Bot", "text": "Something "&" and something do " "", "icon_emoji": ":ghost:"}

Ich bin nicht fortgeschritten im Bash-Scripting und brauche ein wenig Hilfe. Was mache ich falsch?

Danke!

Akzeptierte Antwort:

Sie müssen die Daten per URL codieren, und der einfachste Weg, dies zu tun, ist, curl abzurufen um dies zu tun, indem Sie das -d ersetzen Option durch --data-urlencode .
Außerdem müssen Sie doppelte Anführungszeichen verwenden oder die Shell wird die Variable nicht erweitern, also haben wir

curl 
    -H "Accept: application/json" 
    -X POST 
    --data-urlencode "${payload}" 
    https://hooks.slack.com/services/xxxx

Sie können auch das Setzen von payload= vereinfachen indem ein Teil der Zeichenfolge in einfache Anführungszeichen und ein Teil in doppelte Anführungszeichen gesetzt wird, vorausgesetzt, es gibt kein Leerzeichen zwischen
den Teilen, wie in '...'"..."'...' . Also bekommen wir

payload='payload={"channel": "#my_channel", "username": "Bot", "text": "'"${data}"'", "icon_emoji": ":ghost:"}'

Wahrscheinlich müssen Sie die doppelten Anführungszeichen in data maskieren , vielleicht mit , da sie sich in "" befinden in einer json-Zeichenfolge.

data='Something "&" and something do " "'

Wenn Sie Ihre Daten aus der Eingabe in die Variable line gelesen haben , können Sie diese Ersetzung mit bash vornehmen:

line=${line//"/\"}

Linux
  1. Mehrere Parameter über Xargs übergeben?

  2. Hat Curl eine Zeitüberschreitung?

  3. Fax per Sip versenden?

  4. So verketten Sie Strings in Bash

  5. Alternative zu Ping

Bash Strings verketten

So vergleichen Sie Zeichenfolgen in Bash

Slack für die CLI – Slack

Fehlerbehebung:Zu viele Weiterleitungen

So führen Sie SSH zum Server über Linux

CURL-Linux-Befehl:Lernen am Beispiel