GNU/Linux >> Belajar Linux >  >> Linux

Escape Strings Untuk Diposting Melalui Curl?

Saya mencoba membuat skrip yang mengambil beberapa umpan atom dan mempostingnya ke slack melalui Slack API melalui curl . Apa yang saya miliki sekarang berfungsi untuk teks sederhana, tetapi beberapa di antaranya memiliki tanda kutip ganda atau & karakter di dalamnya dan itu tampaknya mengganggu slack API karena saya mendapatkan invalid payload kesalahan. Ini skrip saya:

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

Output dari "echo" adalah:

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

Saya tidak mahir dalam skrip bash dan saya butuh sedikit bantuan. Apa yang saya lakukan salah?

Terima kasih!

Jawaban yang Diterima:

Anda perlu url-encode data, dan cara termudah untuk melakukannya adalah dengan mendapatkan curl untuk melakukannya dengan mengganti -d pilihan dengan --data-urlencode .
Juga, Anda perlu menggunakan tanda kutip ganda atau shell tidak akan memperluas variabel, jadi kami memiliki

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

Anda juga dapat menyederhanakan pengaturan payload= dengan memiliki bagian dari string di dalam tanda kutip tunggal, dan bagian dalam tanda kutip ganda, asalkan tidak ada spasi di antara
bagian, seperti dalam '...'"..."'...' . Jadi, kita mendapatkan

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

Anda mungkin perlu menghindari tanda kutip ganda di data , mungkin dengan , karena mereka akan berada di dalam "" dalam string json.

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

Jika Anda telah membaca data Anda dari input ke variabel line , Anda dapat melakukan penggantian ini dengan bash:

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

Linux
  1. Melewati Beberapa Parameter Melalui Xargs?

  2. Apakah Curl Memiliki Timeout?

  3. Unduh file melalui baris perintah di Linux

  1. Kirim Fax Via Sip?

  2. Hapus String Multi-baris?

  3. Alternatif untuk ping

  1. Mengotomatiskan Mengetik String Di Xmacro?

  2. Cara Menggabungkan String di Bash

  3. Mengapa Slack mengembalikan kesalahan Segmentasi setelah pemutakhiran Fedora 29?