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

Heute ist Stammtischzeit:
Jeden Donnerstag 20:30 Uhr hier im Chat.
Wer Lust hat, kann sich gerne beteiligen. ;)
  • 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

    Einmal editiert, zuletzt von Micky (14. Dezember 2018 um 22:02)

  • Bash-Skript: Hilfe beim Zusammensetzen von Strings benötigt? Schau mal ob du hier fündig wirst!

  • 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"
    }

    Einmal editiert, zuletzt von Micky (14. Dezember 2018 um 19:59)

  • 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
  • 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>
  • Und wenn variable Teile im JSON sein sollen:

  • 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.

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!