Script tut nicht was es soll

Legolas

Lieutenant
Registriert
Sep. 2018
Beiträge
629
Hallo zusammen,

ich versuche gerade das einzurichten: https://basic-tutorials.de/ratgeber...erheit-mit-fail2ban-und-blocklist-auf-debian/

Ich habe unter /opt dieses Script erstellt und ausführbar gemacht:

Code:
#!/bin/sh

iplist=’mktemp‘
service=$1
blocklist=$2
time=$3
url=“http://api.blocklist.de/getlast.php?time=$time&service=$service“

wget $url -O $iplist
while read ip
do
fail2ban-client set $blocklist banip $ip
done < $iplist
rm $iplist

touch /var/log/null.log

Das rufe ich so auf: ./ban_ssh.sh ssh ssh-blacklist 3600

und hab das Problem das ich diese Fehlermeldungen bekomme

wget: missing URL
Usage: wget [OPTION]... ... Try `wget --help' for more options. ./ban_ssh.sh: 10: cannot open ’mktemp‘: No such file rm: cannot remove '’mktemp‘': No such file or directory

Verstehen tu ich schon was da steht nur das warum ist mir rätselhaft

Danke für jeden Tipp
Btw. OS ist Debian 11
Danke SW
 
Irgendwie find ich das Script unnötig aufgeplustert. Vor allem wenn das Ding nach Anleitung per Cron ohnehin immer mit denselben Werten ausgeführt wird...

Versuch mal statt http auf https zu setzen.
 
Legolas schrieb:
iplist=’mktemp‘
Scheint hier das Problem zu sein, die Temp-Datei wird nicht erstellt/gefunden. Mein Bash ist rudimentär aber da stimmt was nicht. Das Tutorial geht mit keinem Wort darauf ein.
 
Die Anführungszeichen in Zeile 7 sehen nicht "normal" aus. Bei Zeile 3 evtl. ebenfalls.
Einmal löschen und über neu eingeben. Hatte ich schon häufiger gesehen, wenn man Scriptschnipsel aus dem Browser übernimmt.

Ansonsten sehe ich es ähnlich wie @kachiri , wofür überhaupt die Variable für die URL?
 
  • Gefällt mir
Reaktionen: Falc410 und mae1cum77
kartoffelpü schrieb:
Die Anführungszeichen in Zeile 7 sehen nicht "normal" aus. Bei Zeile 3 evtl. ebenfalls.
Genau, er beschwert sich ja , dass er keinen Parameter für URL übergeben bekommt. Kann bei Copy & Paste auftauchen. Lösch die Anführungszeichen und gib sie neu ein.
 
  • Gefällt mir
Reaktionen: mae1cum77
mae1cum77 schrieb:
Scheint hier das Problem zu sein, die Temp-Datei wird nicht erstellt/gefunden. Mein Bash ist rudimentär aber da stimmt was nicht. Das Tutorial geht mit keinem Wort darauf ein.
Die mktemp-Datei soll mit dem wget ja quasi erzeugt werden. Nur, wenn wget keine URL erkennt, wird nichts heruntergeladen und entsprechend findet er im Folgenden halt auch die Datei nicht.

Stimmt. Die Anführungszeichen sehen falsch aus:
Code:
#!/bin/sh

iplist='mktemp'
service=$1
blocklist=$2
time=$3
url="https://api.blocklist.de/getlast.php?time=$time&service=$service"

wget $url -O $iplist
while read ip
do
fail2ban-client set $blocklist banip $ip
done < $iplist
rm $iplist

touch /var/log/null.log

Spot the difference ;)
 
  • Gefällt mir
Reaktionen: Kuristina, BoeserBrot und mae1cum77
Der Ort für das Skript ist auch nicht ganz unroblematisch. "/opt" ist für Programme gedacht, welche ihre eigenen Bibliotheken verwenden, aber nicht für Skripte von Benutzern.

Besser wäre es das Skript in einem Benutzerverzeichnis abzulegen. So wären fehlende Zugriffsrechte auch unwahrscheinlicher.
 
  • Gefällt mir
Reaktionen: Kuristina und mae1cum77
Ok,

ich bin weiter. Download der Liste klappt nachdem ich das Script so abgeändert habe:
Code:
#!/bin/sh

wget "https://api.blocklist.de/getlast.php?time=3600&service=ssh" -O mktemp
while read ip
do
fail2ban-client set ssh-blacklist banip $ip
done < mktemp
rm mktemp

touch /var/log/null.log

was aber nicht funktioniert ist das einfügen der IPs in den Jail

Fehlermeldung
Code:
2022-12-06 09:22:17,327 fail2ban [33908]: ERROR   NOK: ('ssh-blacklist',)
Sorry but the jail 'ssh-blacklist' does not exist

in der jail.local habe ich das eingefügt
Code:
[ssh-blacklist]
enabled = true
port = ssh
filter =sshd
logpath = /var/log/null.log
maxretry = 1
bantime = 86400
action = %(action_)s

Danke bis hierher
SW
 
Moin,

schreib es mal so.

Bash:
#!/bin/bash

iplist=$(mktemp)
service=$1
blocklist=$2
time=$3
url="https://api.blocklist.de/getlast.php?time=$time&service=$service"

wget "$url" -O "$iplist"
while read ip
do
  fail2ban-client set "$blocklist" banip "$ip"
done < "$iplist"

rm "$iplist"

touch /var/log/null.log

mktemp ist ein Programm, dass eine temporäre Datei erstellt.
Mit iplist='mktemp' wird der Variable "iplist" jedoch nur der String/ Text "mktemp" zugewiesen. Nun hat der Text zwar den Wert, wie das Programm heißt, aber das Programm wird nicht ausgeführt.
Schreibt man hingegen:
Code:
iplist=$(mktemp)

dann wird durch $( ) eine Subshell gestartet und alles was da drin steht als Shellkommando ausgeführt. Weil hier nur mktemp drin steht, wird eben das Programm gestartet. Der Rückgabewert von dem Programm, der Name der temporären Datei, wird dann in die Variable iplist geschrieben. Von nun an kannst du also über die Variable iplist auf die temporäre Datei zugreifen.
Ergänzung ()

Legolas schrieb:
Fehlermeldung
Code:
2022-12-06 09:22:17,327 fail2ban [33908]: ERROR NOK: ('ssh-blacklist',)
Du kannst deine Konfiguration von fail2ban mal mit diesem Kommando testen, um sicherzugehen, dass es keine Probleme in deiner Syntax oder Konfiguration gibt:
Code:
fail2ban-client --test

Legolas schrieb:
Bei dem bin ich nicht sicher, ob fail2ban das Leerzeichen nach dem "=" benötigt. Ich kenne es zumindest immer nur mit Leerzeichen vor und nach dem Gleichheitszeichen - so wie die Werte davor und danach in deiner Konfig auch.
Aber wenn dann sollte das Test-Kommando das Problem ja aufzeigen.
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: netzgestaltung und mae1cum77
BoeserBrot schrieb:
Besser wäre es das Skript in einem Benutzerverzeichnis abzulegen. So wären fehlende Zugriffsrechte auch unwahrscheinlicher.
Nutzerscripte können ins Home der Nutzer. Sollen alle Nutzer die Scripte ausführen dürfen, dann gehören die nach /usr/local/bin. Irgendwelche temporären Dateien schreibt man nach /var/tmp oder /tmp.

R00kie schrieb:
mktemp ist ein Programm, dass eine temporäre Datei erstellt.
Mit iplist='mktemp' wird der Variable "iplist" jedoch nur der String/ Text "mktemp" zugewiesen. Nun hat der Text zwar den Wert, wie das Programm heißt, aber das Programm wird nicht ausgeführt.
Schreibt man hingegen:
Code:
iplist=$(mktemp)

dann wird durch $( ) eine Subshell gestartet und alles was da drin steht als Shellkommando ausgeführt. Weil hier nur mktemp drin steht, wird eben das Programm gestartet. Der Rückgabewert von dem Programm, der Name der temporären Datei, wird dann in die Variable iplist geschrieben.
Gefährliche Annahme. Woher willst du wissen, dass mktemp den Namen/Pfad der angelegten Datei zurückgibt? Beispiel:
Code:
echo $(mkdir blah)
gibt Dir eben keinen String zurück.

Zum wget-Problem:
kachiri schrieb:
Code:
url="https://api.blocklist.de/getlast.php?time=$time&service=$service"
&-Zeichen in Variablen, die man dann als Parameter in einen Befehl bastelt, können zu unerwünschten Ergebnissen führen. Mit & startest du ein Programm als Hintergrundprozess. Um das zu vermeiden, schließt man Strings in ' ein. Das hat allerdings wieder den unschönen Effekt, dass dann Variablen ($) eben auch nicht expandiert werden im Gegensatz zu ".

kachiri schrieb:
Fehlermeldung
Code:
2022-12-06 09:22:17,327 fail2ban [33908]: ERROR   NOK: ('ssh-blacklist',)
Sorry but the jail 'ssh-blacklist' does not exist
Wirf mal einen Blick in /var/log/fail2ban.log. Da sollte der Grund drinstehen.
 
Pummeluff schrieb:
Gefährliche Annahme. Woher willst du wissen, dass mktemp den Namen/Pfad der angelegten Datei zurückgibt? Beispiel:
Code:
echo $(mkdir blah)
gibt Dir eben keinen String zurück.
:freak:
Wenn ich sage, ein Dieselmotor hat keine Zündkerzen, dann antwortest du vermutlich auch: "Gefährliche Annahme, ein Benziner hat nämlich Zündkerzen."

Die manpage ist dein Freund:
MKTEMP(1) User Commands MKTEMP(1)

NAME
mktemp - create a temporary file or directory

SYNOPSIS
mktemp [OPTION]... [TEMPLATE]

DESCRIPTION
Create a temporary file or directory, safely, and print its name. TEMPLATE must contain at least 3 consecutive 'X's in last component. If TEMPLATE is not specified, use tmp.XXXXXXXXXX, and --tmpdir is implied. Files are cre‐
ated u+rw, and directories u+rwx, minus umask restrictions.

Dass das Skript in der von mir geschriebenen Form nicht perfekt ist, weiß ich auch. Aber ging es hier darum, dass jemand das perfekte Skript schreibt oder darauf reagiert, warum etwas nicht funktioniert?
Abzufragen, ob mktemp erfolgreich gelaufen ist und das Verzeichnis wirklich erzeugt wurde, wäre sinnvoll und ratsam, aber dann schreibe doch genau das, bzw. liefere ein bessere Skript mit.

Pummeluff schrieb:
&-Zeichen in Variablen, die man dann als Parameter in einen Befehl bastelt, können zu unerwünschten Ergebnissen führen. Mit & startest du ein Programm als Hintergrundprozess. Um das zu vermeiden, schließt man Strings in ' ein. Das hat allerdings wieder den unschönen Effekt, dass dann Variablen ($) eben auch nicht expandiert werden im Gegensatz zu ".
Kannst du dafür Beispiele nennen? Mir fällt auf Anhieb kein Fall ein, bei dem (bei korrekter Nutzung von Variablen) Probleme durch ein "&" verursacht werden.
Wie sollte das Beispiel mit der URL stattdessen geschrieben werden, um das vermeintliche Problem zu lösen?

Hier ein Gegenbeispiel zu deiner These:
Code:
ampersand="&"
echo -e "Wird das Programm 'yes' im Hintergrund laufen?\n(Drücke STRG + C wenn gelangweilt von der Ausgabe.)"
yes "$ampersand"
echo "No"
 
R00kie schrieb:
:freak:
Wenn ich sage, ein Dieselmotor hat keine Zündkerzen, dann antwortest du vermutlich auch: "Gefährliche Annahme, ein Benziner hat nämlich Zündkerzen."

Die manpage ist dein Freund:
Mein Fehler. Ich wusste nicht (mehr), dass es mktemp gibt. Hab das in den ganzen Jahren nie benutzt.

R00kie schrieb:
Kannst du dafür Beispiele nennen?
https://stackoverflow.com/questions/13339469/how-to-include-an-character-in-a-bash-curl-statement

Ja, curl ist nicht wget, wobei wir wieder bei den Zündkerzen wären.

Code:
curl http://api.blocklist.de/getlast.php?time=3600&service=sshd
[1] 124241
Ich hab hier die Gänsefüßchen mal komplett weggelassen. Und da leitet das & den Curl-Aufruf in den Hintergrund.

R00kie schrieb:
bzw. liefere ein bessere Skript mit.
Besser ist's jetzt nicht gerade, da ich keinerlei Fehler abfang. Aber im Grunde genommen sollte das reichen:
Code:
  #!/bin/bash
  while read ip; do                                                             
      fail2ban-client set $2 banip $ip
  done < <(curl "http://api.blocklist.de/getlast.php?time=$3&service=$1")
Die URL konnte ich leider nicht testen. Bei mir bleiben da sowohl Browser als auch curl hängen. Entweder ist die Datei zu groß, oder die URL liefert kein Ergebnis.
 
Zuletzt bearbeitet:
Pummeluff schrieb:
Ja, curl ist nicht wget, wobei wir wieder bei den Zündkerzen wären.

Code:
curl http://api.blocklist.de/getlast.php?time=3600&service=sshd
[1] 124241
Ich hab hier die Gänsefüßchen mal komplett weggelassen. Und da leitet das & den Curl-Aufruf in den Hintergrund.
Ja genau, das Problem sind die fehlenden Anführungszeichen, nicht das Ampersand ("&") ist das Problem. Man sieht das leider sehr oft, dass unsauber gescriptet wird und die Anführungszeichen weg gelassen werden. Damit fängt man sich nicht nur mit dem "&"- Zeichen Probleme ein (siehe "!").
Daher (außer in gut geprüften Ausnahmen) immer Anführungszeichen um Variablen.

Und genau so habe ich es in meinem Skript auch gemacht und daher läuft es in solche Probleme nicht.
(Vor meinem Edit hatte ich an einer Stelle übersehen, dass die Anführungszeichen gefehlt haben, kann sein, dass du da schon mit dem Schreiben angefangen hattest. Grundsätzlich setze ich aber immer Anführungszeichen in meinen Scripten).

Pummeluff schrieb:
Besser ist's jetzt nicht gerade, da ich keinerlei Fehler abfang. Aber im Grunde genommen sollte das reichen:
Code:
#!/bin/bash
while read ip; do
fail2ban-client set $2 banip $ip
done < <(curl "http://api.blocklist.de/getlast.php?time=$3&service=$1")
Hier fehlen auch die Anführungszeichen um die Variablen.
Ist zwar kurz und knapp, aber ich würde diese Variante nicht bevorzugen, weil sie schwerer zu lesen ist und man schon genau hinschauen muss, wo die Argumente verwendet werden.
 
Zurück
Oben