Add script 'unban-ip-from-redis-cache.sh'.
This commit is contained in:
127
unban-ip-from-redis-cache.sh
Executable file
127
unban-ip-from-redis-cache.sh
Executable file
@@ -0,0 +1,127 @@
|
||||
#!/usr/bin/env bash
|
||||
# nextcloud-unban.sh
|
||||
# Interaktives Skript zum gezielten Entfernen von Nextcloud-Login-/Ratelimit-Keys aus Redis
|
||||
# Speichert KEINE Zugangsdaten; verwendet redis-cli (muss im PATH liegen).
|
||||
|
||||
set -euo pipefail
|
||||
IFS=$'\n\t'
|
||||
|
||||
# Farben
|
||||
NC="\033[0m"
|
||||
BOLD="\033[1m"
|
||||
GREEN="\033[32m"
|
||||
YELLOW="\033[33m"
|
||||
RED="\033[31m"
|
||||
CYAN="\033[36m"
|
||||
|
||||
function header() {
|
||||
echo -e "${BOLD}${CYAN}================ Nextcloud Redis Unban Helper ================${NC}\n"
|
||||
}
|
||||
|
||||
function footer() {
|
||||
echo -e "\n${BOLD}${CYAN}=============================================================${NC}\n"
|
||||
}
|
||||
|
||||
function check_redis() {
|
||||
if ! command -v redis-cli >/dev/null 2>&1; then
|
||||
echo -e "${RED}redis-cli ist nicht installiert oder nicht im PATH. Bitte installiere redis-tools oder füge redis-cli hinzu.${NC}" >&2
|
||||
exit 2
|
||||
fi
|
||||
# quick ping
|
||||
if ! redis-cli PING >/dev/null 2>&1; then
|
||||
echo -e "${RED}Konnte Redis nicht erreichen. Stelle sicher, dass redis läuft und redis-cli Standardverbindung funktioniert.${NC}" >&2
|
||||
exit 3
|
||||
fi
|
||||
}
|
||||
|
||||
function read_ip() {
|
||||
local prompt="$1"
|
||||
local ip
|
||||
while true; do
|
||||
read -rp "$prompt" ip
|
||||
ip="${ip// /}"
|
||||
if [[ -z "$ip" ]]; then
|
||||
echo -e "${YELLOW}Keine Eingabe erkannt — bitte eine IPv4- oder IPv6-Adresse eingeben.${NC}"
|
||||
continue
|
||||
fi
|
||||
# basic validation: at least contains digits and ':' (for IPv6) or '.' (for IPv4)
|
||||
if [[ "$ip" =~ [0-9] ]] && ( [[ "$ip" == *":"* ]] || [[ "$ip" == *"."* ]] ); then
|
||||
echo "$ip"
|
||||
return 0
|
||||
else
|
||||
echo -e "${YELLOW}Ungültiges Format. Bitte IPv4 (z.B. 1.2.3.4) oder IPv6 (z.B. 2003:ab:...) eingeben.${NC}"
|
||||
fi
|
||||
done
|
||||
}
|
||||
|
||||
function list_keys_for_ip() {
|
||||
local ip="$1"
|
||||
# pattern: any key that contains the IP
|
||||
redis-cli --scan --pattern "*${ip}*" | sed '/^$/d'
|
||||
}
|
||||
|
||||
function confirm() {
|
||||
local prompt="$1"
|
||||
local yn
|
||||
while true; do
|
||||
read -rp "$prompt [j/N]: " yn
|
||||
case "$yn" in
|
||||
[JjYy]*) return 0 ;;
|
||||
[Nn]* | "" ) return 1 ;;
|
||||
*) echo "Bitte mit j/ja oder n/nein antworten." ;;
|
||||
esac
|
||||
done
|
||||
}
|
||||
|
||||
# --- main ---
|
||||
header
|
||||
check_redis
|
||||
|
||||
echo -e "Dieses Skript sucht Redis-Keys, die deine angegebene IP enthalten (z.B. Ratelimit-Keys von Nextcloud)\n"
|
||||
|
||||
IP=$(read_ip "Gib die IP-Adresse ein, die du freigeben möchtest: ")
|
||||
|
||||
echo -e "\n${BOLD}Suche nach passenden Redis-Keys für:${NC} ${GREEN}${IP}${NC}\n"
|
||||
|
||||
mapfile -t KEYS < <(list_keys_for_ip "$IP") || true
|
||||
|
||||
if [ ${#KEYS[@]} -eq 0 ]; then
|
||||
echo -e "${YELLOW}Keine Keys gefunden, die '${IP}' enthalten.${NC}\n"
|
||||
if confirm "Möchtest du stattdessen alle Keys anzeigen, die das Wort 'login' enthalten?"; then
|
||||
redis-cli --scan --pattern "*login*" | sed '/^$/d' || true
|
||||
fi
|
||||
footer
|
||||
exit 0
|
||||
fi
|
||||
|
||||
# schöne Ausgabe
|
||||
echo -e "${BOLD}Gefundene Keys:${NC} (${#KEYS[@]})\n"
|
||||
for k in "${KEYS[@]}"; do
|
||||
echo -e " - ${CYAN}${k}${NC}"
|
||||
done
|
||||
|
||||
# bestimme Länge für Box
|
||||
echo
|
||||
if confirm "Diese ${#KEYS[@]} Keys wirklich löschen?"; then
|
||||
# Löschen
|
||||
deleted=0
|
||||
failed=0
|
||||
for k in "${KEYS[@]}"; do
|
||||
if redis-cli DEL "$k" >/dev/null 2>&1; then
|
||||
((deleted++))
|
||||
echo -e "${GREEN}Gelöscht:${NC} $k"
|
||||
else
|
||||
((failed++))
|
||||
echo -e "${RED}Fehler beim Löschen:${NC} $k"
|
||||
fi
|
||||
done
|
||||
|
||||
echo -e "\n${BOLD}Ergebnis:${NC} ${GREEN}$deleted gelöschte Keys${NC}, ${RED}$failed fehlgeschlagen${NC}."
|
||||
else
|
||||
echo -e "${YELLOW}Abgebrochen — keine Keys wurden gelöscht.${NC}"
|
||||
fi
|
||||
|
||||
footer
|
||||
|
||||
exit 0
|
||||
|
||||
Reference in New Issue
Block a user