c't 14/2021
S. 162
Praxis
Signal per Kommandozeile steuern
Bild: Andreas Martini

Signal aus dem Terminal

Signal-Nachrichten per Kommandozeile und Skript verschicken

Mit dem Kommandozeilen-Tool signal-cli umgehen Sie den App-Zwang von Signal und verschicken Nachrichten über die Kommandozeile. Das ist praktisch, um mit eigenen Skripten vom Server oder Raspi Statusnachrichten aufs Mobiltelefon zu senden.

Von Barbara Eder

Der Messenger Signal ist quelloffen und verschlüsselt Nachrichten Ende-zu-­Ende. Dadurch eignet er sich sehr gut für die vertrauliche Kommunikation. Es gibt außerdem eine Desktop-App für Linux, macOS und Windows, die nach der Kopplung mit dem Smartphone eigenständig lauffähig ist.

Mit dem unabhängig von der Signal Foundation entwickelten Kommandozeilen-Client signal-cli lässt sich der Messenger-Dienst auch flexibel per Shell nutzen und in eigene Skripte integrieren. So kann Ihnen Ihr Server oder Raspi Statusmeldungen per Signal senden. Auch ein Chat-Bot lässt sich mit dem Tool umsetzen.

Mit signal-cli kann man außerdem den Zwang zur Smartphone-App umgehen, die die Signal Foundation zur Registrierung eines neuen Kontos voraussetzt. Sie benötigen lediglich eine Handy- oder Festnetz-Rufnummer, über die Sie den per SMS oder Anrufansage zugesendeten Bestätigungscode entgegennehmen können.

Dieser Artikel beschreibt die Einrichtung von signal-cli unter Linux. Da das Tool ein Java-Programm ist, arbeitet es auch unter Windows und macOS. Die Befehle für Kontoregistrierung und Nachrichtenversand sind identisch. Beispielhaft unter Ubuntu zeigen wir zu­dem, wie Sie unter Linux einen systemweiten Hintergrunddienst einrichten, über den mehrere Nutzer komfortabel und schnell Nachrichten verschicken.

Installation

Als Systemvoraussetzung verlangt signal-cli eine Java-Laufzeitumgebung (JRE) Version 11 oder neuer. Überprüfen Sie mit java -version, ob und welche JRE bei Ihnen eingerichtet ist. In Ubuntu installieren Sie mit sudo apt install default-jre die JRE.

sudo apt install default-jre

Dort und unter den meisten anderen Betriebssystemen laden Sie das Tool als gepacktes Archiv von GitHub herunter. Es beinhaltet alle benötigten Dateien in den dazugehörigen Verzeichnissen. Die aktuelle URL finden Sie über ct.de/ywjz. In Arch Linux erhalten Sie signal-cli über ein Arch_User_Repository (AUR); für FreeBSD gibt es einen eigenen Port.

In Ubuntu entpacken Sie das Archiv am besten mit Root-Rechten nach /opt und legen einen symbolischen Link nach /usr/local/bin an:

tar xf signal-cli-0.8.3.tar.gz -C /opt
ln -sf /opt/signal-cli-0.8.3/
bin/signal-cli /usr/local/bin/

Passen Sie gegebenenfalls den Dateinamen des Archivs an die von Ihnen heruntergeladene Version an. Nun können Sie das Programm aus jedem beliebigen Verzeichnis ohne Pfadangabe ausführen.

Der Aufruf des Tools folgt meist dem Schema signal-cli -u Nummer Kommando, wo­bei es sich bei der Rufnummer hinter -u um Ihre Absendernummer samt Landesvorwahl handelt. Im Unterschied zu den offiziellen Apps ist signal-cli in der Lage, für mehrere Rufnummern die Signal-Konten zu verwalten. Nach der Absendernummer folgt der eigentliche Befehl, etwa zur Registrierung oder zum Versenden einer Nachricht.

Neues Konto registrieren

Signal unterscheidet zwischen einem Hauptgerät, normalerweise die Smartphone-App, und damit gekoppelten Zusatzgeräten, den Desktop-Clients. Das Tool signal-cli können Sie entweder als eigenständiges Hauptgerät registrieren und dann zum Beispiel Nachrichten vom Signal-Account Ihres Raspis an Ihren Signal-Account auf dem Handy schicken. In diesem Fall benötigen Sie für die Registrierung von signal-cli für beide Accounts unterschiedliche Rufnummern, weil signal-cli ansonsten das Konto übernimmt und die Signal-App danach keinen Zugriff mehr darauf hat. Dafür können Sie auch eine Festnetznummer einsetzen. Oder Sie verknüpfen signal-cli wie einen Desktop-­Client mit dem Konto einer bereits auf dem Smartphone genutzten Nummer. Das Hinzufügen von signal-cli zu einem bestehenden Konto erklären wir weiter unten.

Ein neues Konto registrieren Sie mit signal-cli über den Befehl register.

signal-cli -u +491713920000 register 

An die mit -u angegebene Nummer schickt der Signal-Server einen Bestätigungscode per SMS. Wollen Sie den Code per Anrufansage empfangen (praktisch beim Einsatz einer Festnetznummer), hängen Sie am Ende noch die Option --voice an.

Captcha-Prüfung

Oft greift bei der Registrierung ein Sicherheitsmechanismus und der Befehl bricht mit einer Fehlermeldung ab. Der Signal-­Server verlangt ein zusätzliches Sicherheitstoken, um zu verhindern, dass fremde Rufnummern mit Bestätigungscode-­Anfragen belästigt werden. Das Token erhalten Sie nur, wenn Sie auf signalcaptchas.org/registration/generate.html ein Captcha-Rätsel lösen und sich so als Mensch ausweisen.

Rufen Sie die Adresse im Browser auf. Haben Sie wie verlangt alle Hydranten, Taxis oder Ampeln ausgewählt, drücken Sie noch nicht auf „Bestätigen“. Öffnen Sie vorher mit der Taste F12 in Firefox die Webentwickler-­Ansicht. Wählen Sie den Reiter „Konsole“ aus und prüfen Sie über das Menü hinter dem Zahnrad, ob die Option „Log nicht leeren“ aktiviert ist. Bestätigen Sie nun das Captcha-Rätsel. In der Konsole erscheint eine Meldung wie „Gewechselt zu signalcaptcha://…“ gefolgt von einer sehr langen, kryptischen Zeichenkette. Dieser Buchstaben-Wust ohne das vorgestellte signalcaptcha:// ist das benötigte Token. Kopieren Sie die Zeichenkette.

Nach dem Captcha-­Test fischt man den ­Be­­stä­­ti­­gungs­­code per Web­­ent­wick­ler-Tools aus dem Browser heraus.

Rufen Sie nochmals signal-cli mit register auf und übergeben Sie mit der Option --captcha das kopierte Token.

signal-cli -u +491713920000 register 
   --captcha [TOKEN]

Rufnummer verifizieren

Notieren Sie sich den per SMS oder Ansage mitgeteilten, sechsstelligen Bestätigungscode und bestätigen Sie anschließend Ihre Rufnummer, indem Sie mit verify den Code (hier „123456“) zurück an Signal schicken:

signal-cli -u +491713920000 
  verify 123456

Wenn Sie mit Signal diese Nummer bereits auf einem anderen Gerät benutzt und dort mit einer PIN gesperrt haben, müssen Sie die PIN ebenfalls angeben. Ergänzen Sie dazu --pin PIN hinter dem Bestätigungscode. Von nun an können Sie via signal-cli auf der Kommandozeile Nachrichten senden und empfangen. Die Daten wie Kontakte, Nachrichten und empfangene Anhänge speichert das Tool im Verzeichnis ~/.local/share/signal-cli.

Zur Verifizierung der Rufnummer schickt Signal per SMS oder Anruf einen Bestätigungscode.

Nachrichten senden und empfangen

Schicken Sie nun mit dem Kommando send eine erste Testnachricht. Der Nachrichteninhalt steht nach der Option -m in Anführungszeichen; am Ende folgen die Telefonnummern der Empfänger. Der gesamte Befehl sieht so aus:

signal-cli send -m "Hallo, Welt" 
  +496990009000 +4917604069000

Wenn Ihre Nachricht angekommen ist, erscheint eine dreizehnstellige Nummer in der Kommandozeile. Es ist der Zeitstempel (Timestamp) Ihrer Nachricht. Den Zeitstempel benötigt man für andere Befehle, etwa um eine gesendete Nachricht zu löschen.

Mit signal-cli schickt man bequem Statusmeldungen des eigenen Computers aufs Handy, wie hier die Ausgabe von „inxi“.

Haben Sie mehrere Signal-Konten in signal-cli eingerichtet, müssen Sie mit der Option -u angeben, von welcher Nummer aus die Nachricht gesendet werden soll.

signal-cli -u +491713920000 
  send -m "Hallo, Welt" +496990009000

Anhänge versenden Sie mit der Option -a gefolgt vom Pfad der zu versendenden Datei:

signal-cli send -m "Eine Datei" 
   +496990009000 -a ~/Bilder/ct.png

Nach dem gleichen Schema gehen Sie vor, um Nachrichten zu empfangen.

signal-cli -u +491713920000 receive

Daraufhin lädt das Kommandozeilen-Tool alle Nachrichten herunter – gelesene wie ungelesene – und speichert diese unter „~/.local/share/signal-cli/“ ab. Beim nächsten Aufruf holt receive nur die noch nicht synchronisierten Nachrichten ab.

Auf Wunsch gibt signal-cli die empfangenen Nachrichten im JSON-Format aus. Dazu fügen Sie die Option -o json vor receive ein.

Vorhandenes Signal-Konto verbinden

Hat man auf dem Smartphone bereits ein Signal-Konto eingerichtet, kann man diesem Konto signal-cli als weiteren Client hinzufügen, etwa um Nachrichten per Kommandozeile zu schreiben und lesen. Dabei sollte man bedenken, dass bei einer solchen Verknüpfung alle Nachrichten, die über das Konto laufen, unverschlüsselt in den Log-Dateien landen können.

Zum Koppeln nutzt man den Mechanismus, mit dem man auch den Desktop-­Client von Signal mit einem Signal-Konto verbindet. Die Desktop-App erzeugt einen QR-Code, den man mit der Smartphone-App von Signal einscannt. Dieser QR-Code enthält einen speziellen Uniform Resource Identifier (URI) mit der UUID des neuen Clients und den öffentlichen Teil seines kryptografischen Schlüssels. Mit diesen Daten erkennt die Smartphone-App den neuen Client und handelt mit ihm verschlüsselt die Freigabe aus.

Auch signal-cli erzeugt diese Daten, aber nur als Zeichenkette. Diese muss man an ein anderes Tool weiterreichen, um daraus einen QR-Code zu erzeugen. Installieren Sie dazu das Programm qrencode, etwa über apt install qrencode.

Der Unterbefehl zum Koppeln eines vorhandenen Kontos heißt in signal-cli link. Mit -n legen Sie optional einen Namen für den neuen Client fest, beispielsweise „Mein Raspi“. Den Vorgang initiieren Sie dann so:

signal-cli link -n "Gerätename"

Als Antwort gibt signal-cli den Kopplungs-URI aus und wartet knapp zwei Minuten auf die Anfrage des anderen Clients. Kopieren Sie in der Zeit den ausgegebenen Kopplungs-URI, der mit tsdevice:/?uuid= anfängt, in ein neues Terminalfenster mit qrencode, um den QR-Code zu erzeugen:

qrencode -t utf8 "tsdevice:/?uuid=…&…"

Mit der Option -t utf8 wird der generierte QR-Code direkt im Terminal angezeigt, was den Umweg über eine Bilddatei erspart. Scannen Sie den QR-Code wie gewohnt mit der mobilen Signal-App über „Einstellungen/Gekoppelte Geräte“.

Aus der Ausgabe von signal-cli erzeugt qrencode den QR-Code, den die Signal-App zum Koppeln benötigt.

Mit signal-cli listDevices überprüfen Sie, ob Ihr Konto verknüpft ist. Dieses Subkommando listet Ihnen auch alle weiteren verlinkten Geräte auf.

Zusätzliche Clients und Desktop-App verbinden

Wollen Sie das mit signal-cli registrierte Konto auf einem anderen Computer mit einer weiteren Instanz von signal-cli verknüpfen, benötigen Sie den QR-Code nicht. Erzeugen Sie mit der neuen Instanz lediglich den Kopplungs-URI und kopieren Sie dann die Zeichenkette. Rufen Sie nun auf dem ersten Rechner signal-cli mit dem Unterbefehl addDevice auf und übergeben Sie mit der Option --uri die kopierte Zeichenkette, umschlossen von Anführungszeichen:

signal-cli -u +49171392000 addDevice 
--uri "tsdevice:/?uuid=…&pub_key=…"

Um den Signal-Desktop-Client mit einem über signal-cli registrierten Konto zu verbinden, müssen Sie zunächst aus dem QR-Code, den die Desktop-App anzeigt, den Kopplungs-URI extrahieren. Speichern sie den QR-Code als Bildschirmfoto ab und lesen Sie das Bild mit einem QR-Code-­Reader wie zbarimg aus dem Paket „zbar-tools“ aus:

zbarimg qrcode.png

Die so gewonnene Zeichenkette (tsdevice:/?uuid=…) hängen Sie dann wieder hinter --uri an.

Hintergrunddienst einrichten

Mit signal-cli daemon startet man das Programm als Dienst, der dauerhaft auf eingehende Nachrichten vom Signal-Server wartet und Befehle entgegennimmt. Dafür stellt signal-cli in diesem Modus über D-Bus eine Schnittstelle bereit, über die man Nachrichten senden und empfangen kann. Die D-Bus-Anbindung ist experimentell und unterstützt zahlreiche Befehle wie verify, register oder link noch nicht.

Läuft der Dienst, muss man die Aufrufe von signal-cli um die Option --dbus ergänzen, die vor dem Subkommando stehen muss. Der folgende Befehl wartet nach der Synchronisierung des angegebenen Signal-Kontos auf neue Nachrichten:

signal-cli --dbus -u +491713920000 receive

Hat man den Dienst mit signal-cli -u +49… daemon gestartet, wird die D-Bus-Schnittstelle nur für dieses Konto bereitgestellt („/org/asamk/Signal“). Dafür entfällt die Option -u bei den Einzelbefehlen. Startet man den Dienst hingegen ohne die Angabe von -u, exportiert signal-cli für jedes lokal eingerichtete Signal-Konto ein eigenes D-Bus-Objekt, zum Beispiel „/org/asamk/Signal/_491713920000“. In diesem Fall muss man das Absenderkonto zwingend angeben.

Läuft signal-cli als Dienst, stellt es eine Schnittstelle über D-Bus bereit. Sie erleichtert die Programmierung eigener Skripte.

Die D-Bus-Schnittstelle eignet sich hervorragend für eigene Skripte und Bots, da D-Bus in der Linux-Welt weit verbreitet ist und es für alle verbreiteten Programmiersprachen Implementierungen gibt. Weil für den Hintergrunddienst nur ein einziges Mal die Java-VM initialisiert werden muss, führt signal-cli per D-Bus erhaltene Befehle schneller aus und beansprucht weniger Systemressourcen. Folgender Befehl schickt über das Tool dbus-send von der Rufnummer „+491713920000“ eine Nachricht mit dem Text „Hallo, D-Bus“ an „+496990009000“:

dbus-send --session --type=method_call --print-reply --dest="org.asamk.Signal" /org/asamk/Signal/_491713920000 org.asamk.Signal.sendMessage string:"Hallo, D-Bus" array:string: string:+496990009000 

Geteilter Dämon als Systemd-Dienst

Um mit Cronjobs oder einem Skript Statusmeldungen aufs Handy zu senden, ist es praktischer, signal-cli als einen systemweiten Systemd-Service anzulegen. Damit läuft der Hintergrunddienst gleich nach dem Systemstart, und alle Unix-Nutzer des Systems haben Zugriff darauf. Dieses Setup ist aber in erster Linie für ein nur von einem Computer oder Bot genutztes Konto sinnvoll und eignet sich weniger für die persönliche Kommunikation.

Als systemweiter Systemd-Dienst lässt sich signal-cli von allen Benutzern des Systems verwenden.

Legen Sie für den Hintergrunddienst zunächst einen neuen Linux-Benutzer für signal-cli an:

sudo adduser --system --home /var/lib/signal-cli signal-cli

Unter dem angegeben Home-Verzeichnis speichert signal-cli die Kontodaten. Die Vorlagen zur Konfiguration des Systemd-­Service finden Sie auf ct.de/ywjz. Kopieren Sie die Dateien mit root-Rechten in die folgenden Verzeichnisse:

sudo cp org.asamk.Signal.conf /etc/dbus-1/system.d/
sudo cp org.asamk.Signal.service /usr/share/dbus-1/system-services/
sudo cp signal-cli.service /etc/systemd/system/

Entscheidend ist in der Datei „signal-cli.service“ die Zeile, die mit ExecStart= beginnt. Hier muss der Pfad zu signal-cli passen. Soll der Dienst nur mit einer Nummer verbunden sein, ergänzen Sie in dieser Zeile die Option -u samt der entsprechenden Rufnummer. Die Syntax ist bis auf daemon --system die gleiche wie bei der Eingabe in der Kommandozeile.

Kopieren Sie zuletzt noch die Kontodaten von signal-cli aus ihrem persönlichen Verzeichnis nach „/var/lib/signal-cli“ und passen dann deren Eigentümer an:

sudo -s
cp -r ~/.local/share/signal-cli/* /var/lib/signal-cli/
chown -R signal-cli /var/lib/signal-cli/

Wenn alles vorbereitet ist, aktivieren und starten Sie mit systemctl den Dienst:

sudo systemctl --now enable signal-cli
sudo systemctl start signal-cli

Kontrollieren Sie mit systemctl status signal-cli.service, ob Systemd den Dienst erfolgreich gestartet hat. Der Befehl journalctl -f -u signal-cli zeigt Ihnen Status- und Fehlermeldungen an. Um eine Nachricht zu senden, ergänzen Sie den Befehl um --dbus-system:

signal-cli --dbus-system -u +491713920000 send -m "Hallo, System" +496990009000 

Damit dbus-send den systemweiten Bus verwendet, müssen Sie im weiter oben beschriebenen Befehl die Option --session durch --system ersetzen und den Pfad des D-Bus-Objektes anpassen.

Fazit

Vom Chatbot bis zum Multi-User-Client – signal-cli erweitert die Einsatzszenarien des sicheren Messengers Signal. Die D-Bus-Schnittstelle und die Ausgabe in JSON erleichtern es, eigene Programme mit signal-cli zu verbinden. Interessante Beispiel-Skripte sowie die knappe, aber hilfreiche Dokumentation des Entwicklers finden Sie unter ct.de/ywjz. (ktn@ct.de)

Konfigurationsdateien, Beispielskripte und Dokumentation: ct.de/ywjz

Kommentare lesen (19 Beiträge)