#!/bin/bash # Agentless-Befehls-Diff per SSH (Schluessel, ohne expect). # Aufruf durch wazuh-agentlessd: [use_sudo] # Fuehrt /var/ossec/etc/sshpull/commands/.sh auf dem Host aus; # wazuh-agentlessd vergleicht die Ausgabe mit dem letzten Lauf und alarmiert bei Aenderungen. [ "$1" = "test" ] && [ "$2" = "test" ] && exit 0 SUDO="" if [ "$1" = "use_sudo" ]; then SUDO="sudo -n"; shift; fi TARGET="$1" CMDS="/var/ossec/etc/sshpull/commands/$2.sh" case "$2" in */*|"") echo "ERROR: ungueltiger Hostname '$2'"; exit 1;; esac [ -r "$CMDS" ] || { echo "ERROR: $CMDS fehlt"; exit 1; } ERR=$(mktemp) OUT=$(mktemp) trap 'rm -f "$ERR" "$OUT"' EXIT echo "INFO: Starting." # LC_ALL=C: stabile Ausgabe, sonst gibt es Diffs nur wegen Locale-Wechseln { echo "export LC_ALL=C; unset HISTFILE"; cat "$CMDS"; } \ | ssh -F /var/ossec/etc/sshpull/ssh_config "$TARGET" $SUDO sh -s >"$OUT" 2>"$ERR" RC=$? # 255 = ssh selbst ist gescheitert; andere Codes kommen vom letzten Befehl if [ "$RC" -eq 255 ] || { [ "$RC" -ne 0 ] && [ ! -s "$OUT" ]; }; then MSG=$(tr '\n"\\' ' ' < "$ERR" | cut -c1-400) echo "LOG: {\"sshpull_status\":{\"host\":\"${TARGET#*@}\",\"check\":\"commands\",\"status\":\"down\",\"message\":\"rc=$RC $MSG\"}}" echo "ERROR: ssh zu $TARGET fehlgeschlagen (rc=$RC): $MSG" exit 1 fi echo "STORE: now" # Zeilen, die wie Steuerzeilen von agentlessd aussehen, entschaerfen sed -e 's/^\(ERROR\|INFO\|FWD\|LOG\|STORE\): /\1 : /' "$OUT" exit 0