GNU/Linux >> Tutoriales Linux >  >> Linux

¿Se publicarán cadenas de escape a través de Curl?

Estoy tratando de hacer un script que tome algunos feeds atom y los publique en Slack a través de la API de Slack a través de curl . Lo que tengo ahora funciona para textos simples, pero algunos de ellos tienen comillas dobles o & caracteres en ellos y eso parece molestar a la API floja ya que obtengo una invalid payload error. Aquí está mi guión:

#!/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 salida del “eco” es:

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

No estoy avanzado en bash scripting y necesito un poco de ayuda. ¿Qué estoy haciendo mal?

¡Gracias!

Respuesta aceptada:

Necesita codificar los datos en URL, y la forma más fácil de hacerlo es obtener curl para hacerlo reemplazando el -d opción por --data-urlencode .
Además, debe usar comillas dobles o el shell no expandirá la variable, por lo que tenemos

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

También puede simplificar la configuración de payload= al tener parte de la cadena entre comillas simples y parte entre comillas dobles, siempre que no haya espacio entre
las partes, como en '...'"..."'...' . Entonces, obtenemos

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

Probablemente necesite escapar de las comillas dobles en data , quizás con , ya que estarán dentro de "" en una cadena json.

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

Si ha leído sus datos desde la entrada en la variable line , puedes hacer este reemplazo con bash:

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

Linux
  1. ¿Pasar múltiples parámetros a través de Xargs?

  2. ¿Tiene Curl un tiempo de espera?

  3. ¿Eliminar cadenas de varias líneas?

  4. ¿Automatizar cadenas de escritura en Xmacro?

  5. Alternativa al ping

Bash concatenar cadenas

Cómo comparar cadenas en Bash

Slack para la CLI – Slack

Solución de problemas:demasiados redireccionamientos

Cómo SSH al servidor a través de Linux

Comando CURL Linux:Aprendiendo con el ejemplo