GNU/Linux >> Linux Esercitazione >  >> Linux

Escape stringhe da inserire tramite curl?

Sto cercando di creare uno script che prenda alcuni feed atomi e li pubblichi per slack tramite l'API Slack tramite curl . Quello che ho ora funziona per testi semplici, ma alcuni di essi hanno virgolette o & caratteri al loro interno e questo sembra infastidire l'API slack poiché ottengo un invalid payload errore. Ecco il mio copione:

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

L'output dell'”eco” è:

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

Non sono avanzato nello scripting bash e ho bisogno di un po' di aiuto. Cosa sbaglio?

Grazie!

Risposta accettata:

Devi codificare l'URL dei dati e il modo più semplice per farlo è ottenere curl per farlo sostituendo -d opzione di --data-urlencode .
Inoltre, devi usare le virgolette doppie o la shell non espanderà la variabile, quindi abbiamo

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

Puoi anche semplificare l'impostazione di payload= avendo parte della stringa tra virgolette singole e parte tra virgolette doppie, a condizione che non vi sia spazio tra
le parti, come in '...'"..."'...' . Quindi, otteniamo

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

Probabilmente devi evitare le virgolette in data , magari con , poiché saranno all'interno di "" in una stringa json.

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

Se hai letto i tuoi dati dall'input nella variabile line , puoi eseguire questa sostituzione con bash:

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

Linux
  1. Passare più parametri tramite Xargs?

  2. Il curl ha un timeout?

  3. Inviare un fax tramite Sip?

  4. Automatizzare le stringhe di digitazione in Xmacro?

  5. Scarica i file tramite la riga di comando in Linux

Bash concatena le stringhe

Come confrontare le stringhe in Bash

Slack per la CLI – Slack

Risoluzione dei problemi:troppi reindirizzamenti

Come eseguire l'SSH sul server tramite Linux

Comando CURL Linux:Imparare con l'esempio