- at least Java Runtime Environment (JRE) 17
- native library: libsignal-client
- The native libs are bundled for x86_64 Linux (with recent enough glibc, see #643), Windows and MacOS. For other systems/architectures
+ The native libs are bundled for x86_64 Linux (with recent enough glibc, see #643), Windows and MacOS. For other
+ systems/architectures
see: [Provide native lib for libsignal](https://github.com/AsamK/signal-cli/wiki/Provide-native-lib-for-libsignal)
### Install system-wide on Linux
* Pipe the message content from another process.
- uname -a | signal-cli -a ACCOUNT send RECIPIENT
+ uname -a | signal-cli -a ACCOUNT send --message-from-stdin RECIPIENT
* Receive messages
Specify the recipient group ID in base64 encoding.
*-m* MESSAGE, *--message* MESSAGE::
-Specify the message, if missing, standard input is used.
+Specify the message.
+Currently, signal-cli reads the message from stdin if `-m` is missing, but this will change in a future version and the explicit flag `--message-from-stdin` should be used instead.
+
+*--message-from-stdin*::
+Read the message from standard input.
*-a* [ATTACHMENT [ATTACHMENT ...]], *--attachment* [ATTACHMENT [ATTACHMENT ...]]::
Add one or more files as attachment.
signal-cli -a ACCOUNT send -m "This is a message" [RECIPIENT [RECIPIENT ...]] [-a [ATTACHMENT [ATTACHMENT ...]]]
Pipe the message content from another process::
-uname -a | signal-cli -a ACCOUNT send [RECIPIENT [RECIPIENT ...]]
+uname -a | signal-cli -a ACCOUNT send --message-from-stdin [RECIPIENT [RECIPIENT ...]]
Create a group::
signal-cli -a ACCOUNT updateGroup -n "Group name" -m [MEMBER [MEMBER ...]]
.help("Send the message to self without notification.")
.action(Arguments.storeTrue());
- subparser.addArgument("-m", "--message").help("Specify the message, if missing standard input is used.");
+ var mut = subparser.addMutuallyExclusiveGroup();
+ mut.addArgument("-m", "--message").help("Specify the message to be sent.");
+ mut.addArgument("--message-from-stdin")
+ .action(Arguments.storeTrue())
+ .help("Read the message from standard input.");
subparser.addArgument("-a", "--attachment").nargs("*").help("Add file as attachment");
subparser.addArgument("-e", "--end-session", "--endsession")
.help("Clear session state and send end session message.")
final var sticker = stickerString == null ? null : parseSticker(stickerString);
var messageText = ns.getString("message");
- if (messageText == null) {
- if (sticker != null) {
- messageText = "";
- } else {
- logger.debug("Reading message from stdin...");
- try {
- messageText = IOUtils.readAll(System.in, Charset.defaultCharset());
- } catch (IOException e) {
- throw new UserErrorException("Failed to read message from stdin: " + e.getMessage());
- }
+ final var readMessageFromStdin = ns.getBoolean("message-from-stdin") == Boolean.TRUE;
+ if (readMessageFromStdin || (messageText == null && sticker == null)) {
+ logger.debug("Reading message from stdin...");
+ try {
+ messageText = IOUtils.readAll(System.in, Charset.defaultCharset());
+ } catch (IOException e) {
+ throw new UserErrorException("Failed to read message from stdin: " + e.getMessage());
}
}
}
try {
- var results = m.sendMessage(new Message(messageText,
+ var results = m.sendMessage(new Message(messageText == null ? "" : messageText,
attachments,
mentions,
Optional.ofNullable(quote),