GNU/Linux >> Tutoriels Linux >  >> Linux

Chaînes d'échappement à publier via Curl ?

J'essaie de créer un script qui prend des flux d'atomes et les publie pour se détendre via l'API Slack via curl . Ce que j'ai maintenant fonctionne pour des textes simples, mais certains d'entre eux ont des guillemets doubles ou & caractères en eux et cela semble gêner l'API lâche car j'obtiens une invalid payload Erreur. Voici mon script :

#!/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

La sortie de "l'écho" est :

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

Je ne suis pas avancé dans les scripts bash et j'ai besoin d'un peu d'aide. Qu'est-ce que je fais de mal ?

Merci !

Réponse acceptée :

Vous devez coder en URL les données, et le moyen le plus simple de le faire est d'obtenir curl pour le faire en remplaçant le -d option par --data-urlencode .
De plus, vous devez utiliser des guillemets doubles ou le shell ne développera pas la variable, nous avons donc

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

Vous pouvez également simplifier la configuration de payload= en plaçant une partie de la chaîne entre guillemets simples et une partie entre guillemets doubles, à condition qu'il n'y ait pas d'espace entre
les parties, comme dans '...'"..."'...' . Donc, nous obtenons

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

Vous devez probablement échapper les guillemets doubles dans data , peut-être avec , car ils seront à l'intérieur de "" dans une chaîne json.

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

Si vous avez lu vos données depuis l'entrée dans la variable line , vous pouvez effectuer ce remplacement avec bash :

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

Linux
  1. Passage de plusieurs paramètres via Xargs ?

  2. Curl a-t-il un délai d'attente ?

  3. Envoyer un fax via SIP ?

  4. Alternative au ping

  5. Pourquoi Slack renvoie-t-il une erreur de segmentation après la mise à niveau de Fedora 29 ?

Chaînes de concaténation bash

Comment comparer des chaînes dans Bash

Slack pour la CLI – Slack

Dépannage :Trop de redirections

Comment SSH au serveur via Linux

Commande CURL Linux :Apprendre par l'exemple