Bash-Skript: Hilfe beim Zusammensetzen von Strings benötigt

  • Hallo und Guten Abend in die Runde,


    ich frickel mich grad mal wieder durch ein Bash-Skript welches mir ermöglicht mit Hilfe von curl eine Nachricht an meinen synapse-Server (Matrix Protokoll) zu senden. Damit möchte meine eigene Pushover Alternative ohne externen Dienstleister realisieren. Synapse läuft und ich schaffe es auch mit dem folgenden Terminal-Befehl eine Nachricht zu senden:

    Code
    curl 'https://10.10.10.253:8448/_matrix/client/r0/rooms/dbdfkvbfdMaNVHJGZnCXPK:test.test-vm.ltd/send/m.room.message/15447305007616?access_token=iBrZXkKMDAxMGNpZCBnZW4gPSAxCjAwMmJjaWQgdXNlcl9pZCA9IEBkZXNrdG9wOm15Lm1hdHJpeC1waS5tbAowMDE2Y2lkIHR5cGUgPSBhY2Nlc3MKMDAyMWNpZCBub25jZSA9IERnSFAxbjFjLnRMa0w6M00KMDAyZnNpZ25hdHVyZSCsv_MXu9-NeeBF77gcmOzosavbtBr_k' -X PUT --data '{"msgtype":"m.text","body":"Hallo Welt"}' -k


    Nun versuche ich ein Bash-Skript zu erstellen, mit dem ich einfacher arbeiten kann um das Skript in verschiedene Anwendungen zu integrieren. Soweit bin ich gekommen:


    Leider wird der String für das Versenden der Nachricht mit curl irgendwo zerpflückt. Ich habe mit div ' und " versucht die Bereiche zusammenzufügen, finde aber keine funktionierende Lösung. Kann bitte einer der Skriptprofis mal drüber schauen und mir helfen die Variable $command richtig zusammenzusetzen??


    Vielen Dank und Liebe Grüße


    Micky

    Edited once, last by Micky ().

  • Du musst die " im String mit \ escapen, wenn du auch welche als Delimiter verwendest:

    Bash
    command="https://$ip:$port/_matrix/client/r0/rooms/$roomid/m.room.message/$messageid?access_token=$accesstoken -X PUT --data {\"msgtype\":\"m.text\",\"body\":$nachricht}"

    Btw: was Bash angeht bin ich eher Noob als Profi, aber das sind absolute Basics ;)


    Edit: du willst ja vermutlich am Ende folgendes erreichen:

    Code
    {"msgtype": "m.text", "body": "Hallo Welt"}

    Dann fehlen vor und nach $nachricht noch Anführungszeichen:

    Bash
    command="https://$ip:$port/_matrix/client/r0/rooms/$roomid/m.room.message/$messageid?access_token=$accesstoken -X PUT --data {\"msgtype\":\"m.text\",\"body\":\"$nachricht\"}"
  • Hallo Linus,


    vielen Dank für deine schnelle Antwort. Hab´s nach deinem Vorbild angepasst, klappt leider trotzdem noch nicht. Die aktuelle Version würde folgendermaßen aussehen:


  • Hier die gewünschte Ausgabe:

    Code
    + /usr/bin/curl 'https://10.10.10.253:8448/_matrix/client/r0/rooms/dbdfkvbfdMaNVHJGZnCXPK:test.test-vm.ltd/m.room.message/201812141948017315734?access_token=iBrZXkKMDAxMGNpZCBnZW4gPSAxCjAwMmJjaWQgdXNlcl9pZCA9IEBkZXNrdG9wOm15Lm1hdHJpeC1waS5tbAowMDE2Y2lkIHR5cGUgPSBhY2Nlc3MKMDAyMWNpZCBub25jZSA9IERnSFAxbjFjLnRMa0w6M00KMDAyZnNpZ25hdHVyZSCsv_MXu9-NeeBF77gcmOzosavbtBr_k' -X PUT --data '{"msgtype":"m.text","body":"Hallo' 'Welt"}' -k
    {
        "errcode": "M_UNRECOGNIZED",
        "error": "Unrecognized request"
    }
    curl: (3) [globbing] unmatched close brace/bracket in column 6
    + set +x

    Wenn ich das Leerzeichen zwischen "Hallo Welt" rauslasse und "HalloWelt" schicke erhalte ich die folgende Ausgabe:


    Code
    + /usr/bin/curl 'https://10.10.10.253:8448/_matrix/client/r0/rooms/dbdfkvbfdMaNVHJGZnCXPK:test.test-vm.ltd/m.room.message/201812141951594157174?access_token=iBrZXkKMDAxMGNpZCBnZW4gPSAxCjAwMmJjaWQgdXNlcl9pZCA9IEBkZXNrdG9wOm15Lm1hdHJpeC1waS5tbAowMDE2Y2lkIHR5cGUgPSBhY2Nlc3MKMDAyMWNpZCBub25jZSA9IERnSFAxbjFjLnRMa0w6M00KMDAyZnNpZ25hdHVyZSCsv_MXu9-NeeBF77gcmOzosavbtBr_k' -X PUT --data '{"msgtype":"m.text","body":"HalloWelt"}' -k
    {
        "errcode": "M_UNRECOGNIZED",
        "error": "Unrecognized request"
    }
    + set +x


    Noch ein kleiner Nachtrag, so schaut es aus, wenn ich den curl Befehl direkt über das Terminal aufrufe:


    Code
    micky@pi: curl 'https://10.10.10.253:8448/_matrix/client/r0/rooms/dbdfkvbfdMaNVHJGZnCXPK:test.test-vm.ltd/send/m.room.message/201812141951594154174?access_token=iBrZXkKMDAxMGNpZCBnZW4gPSAxCjAwMmJjaWQgdXNlcl9pZCA9IEBkZXNrdG9wOm15Lm1hdHJpeC1waS5tbAowMDE2Y2lkIHR5cGUgPSBhY2Nlc3MKMDAyMWNpZCBub25jZSA9IERnSFAxbjFjLnRMa0w6M00KMDAyZnNpZ25hdHVyZSCsv_MXu9-NeeBF77gcmOzosavbtBr_k' -X PUT --data '{"msgtype":"m.text","body":"Hallo Welt"}' -k
    
    {
        "event_id": "$154481378811UJQTq:test.test-vm.ltd"
    }

    Edited once, last by Micky ().

  • Hier ist das Problem (Zeilenumbruch zur Verdeutlichung):

    Code
    '{"msgtype":"m.text","body":"Hallo'
    'Welt"}'


    Vielleicht, wenn du die ' um die {} selbst setzt?

    Bash
    command="https://$ip:$port/_matrix/client/r0/rooms/$roomid/m.room.message/$messageid?access_token=$accesstoken -X PUT --data '{\"msgtype\":\"m.text\",\"body\":\"$nachricht\"}'"

    Nur als Idee.

  • Hallo Linus,


    klappt leider auch nicht:


    Code
    + /usr/bin/curl 'https://10.10.10.253:8448/_matrix/client/r0/rooms/dbdfkvbfdMaNVHJGZnCXPK:test.test-vm.ltd/send/m.room.message/201812141951594154174?access_token=iBrZXkKMDAxMGNpZCBnZW4gPSAxCjAwMmJjaWQgdXNlcl9pZCA9IEBkZXNrdG9wOm15Lm1hdHJpeC1waS5tbAowMDE2Y2lkIHR5cGUgPSBhY2Nlc3MKMDAyMWNpZCBub25jZSA9IERnSFAxbjFjLnRMa0w6M00KMDAyZnNpZ25hdHVyZSCsv_MXu9-NeeBF77gcmOzosavbtBr_k' -X PUT --data ''\''{"msgtype":"m.text","body":"HalloWelt"}'\''' -k
    {
        "errcode": "M_UNRECOGNIZED",
        "error": "Unrecognized request"
    }
    + set +x
  • Versuch mal das:


    Code
    command="https://$ip:$port/_matrix/client/r0/rooms/$roomid/m.room.message/$messageid?access_token=$accesstoken -X PUT --data '{\"msgtype\":\"m.text\",\"body\":\""$nachricht"\"}'"

    Ansonsten nicht das ganze command zusammenpacken.

    Code
    # Nachricht verschicken:
    curl https://$ip:$port/_matrix/client/r0/rooms/$roomid/m.room.message/$messageid?access_token=$accesstoken -k -X PUT --data '{"msgtype":"m.text","body":"'"$nachricht"'}'
  • Hallo KKoPi,


    klappt leider auch nicht... Hier die Ausgaben:


    Code
    + /usr/bin/curl 'https://10.10.10.253:8448/_matrix/client/r0/rooms/dbdfkvbfdMaNVHJGZnCXPK:test.test-vm.ltd/send/m.room.message/201812141951594154174?access_token=iBrZXkKMDAxMGNpZCBnZW4gPSAxCjAwMmJjaWQgdXNlcl9pZCA9IEBkZXNrdG9wOm15Lm1hdHJpeC1waS5tbAowMDE2Y2lkIHR5cGUgPSBhY2Nlc3MKMDAyMWNpZCBub25jZSA9IERnSFAxbjFjLnRMa0w6M00KMDAyZnNpZ25hdHVyZSCsv_MXu9-NeeBF77gcmOzosavbtBr_k' -X PUT --data ''\''{"msgtype":"m.text","body":"HalloWelt"}'\''' -k
    {
        "errcode": "M_UNRECOGNIZED",
        "error": "Unrecognized request"
    }
    + set +x

    und:


    Code
    + /usr/bin/curl 'https://10.10.10.253:8448/_matrix/client/r0/rooms/dbdfkvbfdMaNVHJGZnCXPK:test.test-vm.ltd/send/m.room.message/201812141951594154174?access_token=iBrZXkKMDAxMGNpZCBnZW4gPSAxCjAwMmJjaWQgdXNlcl9pZCA9IEBkZXNrdG9wOm15Lm1hdHJpeC1waS5tbAowMDE2Y2lkIHR5cGUgPSBhY2Nlc3MKMDAyMWNpZCBub25jZSA9IERnSFAxbjFjLnRMa0w6M00KMDAyZnNpZ25hdHVyZSCsv_MXu9-NeeBF77gcmOzosavbtBr_k' -k -X PUT --data '{"msgtype":"m.text","body":"HalloWelt}'
    {
        "errcode": "M_UNRECOGNIZED",
        "error": "Unrecognized request"
    }
    + set +x
  • Sorry, da fehlte hinten ein "


    Code
    curl https://$ip:$port/_matrix/client/r0/rooms/$roomid/m.room.message/$messageid?access_token=$accesstoken -k -X PUT --data '{"msgtype":"m.text","body":"'"$nachricht"'"}'


    Knut

  • Ansonsten einfach über eine temp. Datei gehen, macht sich mit JSON meist einfacher


    Code
    tmp=$(mktemp)
    trap "rm $tmp" 0
    
    echo '{"msgtype":"m.text","body":"'$nachricht'"}' >$tmp
    
    curl https://$ip:$port/_matrix/client/r0/rooms/$roomid/m.room.message/$messageid?access_token=$accesstoken -k -X PUT --data-binary @$tmp
  • Ich wuerde es bei JSON per here doc machen. Dann muss man sich nicht um diesen ganzen Escapingkram kuemmern der sehr errorprone ist.


    Bash
    #!/bin/bash
    v=$(cat <<EOF
    {
    "msgtype":"m.type",
    "body":"Hallo' 'Welt"
    }
    EOF
    )
    curl -k -X PUT -d "$v" https://<TARGETURL>

    "Really, I'm not out to destroy Microsoft. That will just be a completely unintentional side effect."

    Linus Benedict Torvalds, 28.9.2003


    Hast Du die Woche schon Deine Raspberry gesichert =O Bei mir tut das raspiBackup automatisch ;)

  • Und wenn variable Teile im JSON sein sollen:


    "Really, I'm not out to destroy Microsoft. That will just be a completely unintentional side effect."

    Linus Benedict Torvalds, 28.9.2003


    Hast Du die Woche schon Deine Raspberry gesichert =O Bei mir tut das raspiBackup automatisch ;)

    Edited once, last by framp ().

  • Perfekt, das war es. Hier der fertige Skript für die Nachwelt. Mit diesem Skript ist es möglich Nachrichten an einen lokalen/externen synapse-Server (Matrix-Protokoll) zu schicken. Sozuagen eine selfmade-Alternative zu PushOver oder eMail.... Vielen Dank für eure Unterstützung.


  • Sicher?


    bei <<EOT werden Variablen doch ausgewertet, nicht wie bei <<'EOT'

    Stimmt :thumbup:. Diese Tatsache war mir nicht mehr so praesent. Ich habe den Code oben entsprechend angepasst.Aber man sieht dass es unter Linux 1000 Wege gibt nach Rom zu kommen :lol:

    "Really, I'm not out to destroy Microsoft. That will just be a completely unintentional side effect."

    Linus Benedict Torvalds, 28.9.2003


    Hast Du die Woche schon Deine Raspberry gesichert =O Bei mir tut das raspiBackup automatisch ;)