Bash Script erstellen

Warum Debian und/oder eine seiner Spielarten? Was muss ich vorher wissen? Wo geht es nach der Installation weiter?
Benutzeravatar
Meillo
Moderator
Beiträge: 8813
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Bash Script erstellen

Beitrag von Meillo » 25.12.2019 22:25:54

rodeoric hat geschrieben: ↑ zum Beitrag ↑
25.12.2019 21:20:47
Crontab sieht wie folgt aus und sollte nun aller 12 Stunden starten:

Code: Alles auswählen

* 12 * * * bash /etc/fail2ban/fail2ban-ip-whitelisting.sh
So laeuft der Job von 12:00 bis 12:59 jede Minute und sonst nicht.

Du willst wohl eher sowas:

Code: Alles auswählen

0 12,24 * * * ...
D.h. um 12:00 und um 24:00.



Btw: Da dein Script ein Shebang hat ist das `bash' im Cronjob-Aufruf nicht noetig ... und sorgt bei zukuenftigen Umbauten des Scripts moeglicherweise fuer Fehler oder Irritationen.
Use ed once in a while!

Benutzeravatar
Meillo
Moderator
Beiträge: 8813
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Bash Script erstellen

Beitrag von Meillo » 25.12.2019 22:50:10

Hier eine Ueberarbeitung des Scripts in Richtung der Art, wie ich es schreiben wuerde:

Code: Alles auswählen

#!/bin/bash

new=/etc/fail2ban/home_ip.txt
old=/etc/fail2ban/home_ip_old.txt

config_file=/etc/fail2ban/jail.local
IPfix="127.0.0.1\ 127.0.0.0\/8\ 10.0.0.0\/8\ 172.16.0.0\/12\ 192.168.0.0\/16\  "

wget -O "$new" https://eine-domain.de/homeIP.txt

if cmp -s "$new" "$old"; then
	exit
fi

mv "$new" "$old"

sed -i "s/\(ignoreip *= *\).*/\1$IPfix`cat $new`/" "$config_file"
/etc/init.d/fail2ban restart
echo "Neue IP gewhitelisted: `cat $new` Fail2ban neu gestartet"
Den sed-Befehl habe ich nicht umgebaut, weil ich die genaue Syntax von $config_file nicht kenne. (Ich wuerde versuchen IPfix drin zu lassen und nur den Rest der Zeile zu aendern ... oder mal schauen, ob die Config sowas wie `+=' unterstuetzt, damit ich es in zwei Zeilen aufteilen kann ... oder eine separate Datei unter /etc/fail2ban anlegen, mit dem Ziel, dass manuelle Werte und automatisch geaenderte Werte klar voneinander getrennt sind.)

Die Dateien wuerde ich persoenlich anders nennen, weil Dateiendungen auf Unix egal sind. Old waere bei mir eher "$new.backup", oder ich wuerde gleich ein Logfile anlegen:

Code: Alles auswählen

echo `date` `cat "$new"` >>/var/log/home_ip.log
Die Ausgabe am Ende wuerde ich nur drin lassen, wenn ich die bei jeder Aenderung per Mail bekommen will. Das kann Sinn machen, wenn es selten ist oder ich die Info brauche, sonst wuerde ich sie her rausnehmen.


Soviel von mir an dieser Stelle mal an Input.
Use ed once in a while!

rodeoric
Beiträge: 30
Registriert: 23.12.2019 15:02:54

Re: Bash Script erstellen

Beitrag von rodeoric » 25.12.2019 23:11:10

Meillo hat geschrieben: ↑ zum Beitrag ↑
25.12.2019 22:50:10
Hier eine Ueberarbeitung des Scripts in Richtung der Art, wie ich es schreiben wuerde:

Code: Alles auswählen

#!/bin/bash

new=/etc/fail2ban/home_ip.txt
old=/etc/fail2ban/home_ip_old.txt

config_file=/etc/fail2ban/jail.local
IPfix="127.0.0.1\ 127.0.0.0\/8\ 10.0.0.0\/8\ 172.16.0.0\/12\ 192.168.0.0\/16\  "

wget -O "$new" https://eine-domain.de/homeIP.txt

if cmp -s "$new" "$old"; then
	exit
fi

mv "$new" "$old"

sed -i "s/\(ignoreip *= *\).*/\1$IPfix`cat $new`/" "$config_file"
/etc/init.d/fail2ban restart
echo "Neue IP gewhitelisted: `cat $new` Fail2ban neu gestartet"
Den sed-Befehl habe ich nicht umgebaut, weil ich die genaue Syntax von $config_file nicht kenne. (Ich wuerde versuchen IPfix drin zu lassen und nur den Rest der Zeile zu aendern ... oder mal schauen, ob die Config sowas wie `+=' unterstuetzt, damit ich es in zwei Zeilen aufteilen kann ... oder eine separate Datei unter /etc/fail2ban anlegen, mit dem Ziel, dass manuelle Werte und automatisch geaenderte Werte klar voneinander getrennt sind.)

Die Dateien wuerde ich persoenlich anders nennen, weil Dateiendungen auf Unix egal sind. Old waere bei mir eher "$new.backup", oder ich wuerde gleich ein Logfile anlegen:

Code: Alles auswählen

echo `date` `cat "$new"` >>/var/log/home_ip.log
Die Ausgabe am Ende wuerde ich nur drin lassen, wenn ich die bei jeder Aenderung per Mail bekommen will. Das kann Sinn machen, wenn es selten ist oder ich die Info brauche, sonst wuerde ich sie her rausnehmen.


Soviel von mir an dieser Stelle mal an Input.
Hallo,

vielen lieben Dank für die Überarbeitung, das muss ich aber in Ruhe machen, ich bin schon froh das es jetzt überhaupt läuft :D
Ein explizites `cd' in ein definiertes Verzeichnis am Anfang waere gut. (Auf den ersten Blick scheint `cd /root' korrekt zu sein.) Derzeit gehst du naemlich nur davon aus, dass sowohl deine manuellen Aufrufe als auch Cron das Script schon aus dem richtigen Verzeichnis aufrufen werden. Besser du stellst das sicher.
Was meinst Du damit genau ?
Sollte der Command dann wie folgt aussehen oder hab ich da etwas falsch verstanden ? Kann man das dann überall so machen wo ein Verzeichnis angegeben wird oder gibt es commands die das dann falsch interpretieren könnten ?

Code: Alles auswählen

mv cd /root/homeIP.txt /etc/fail2ban/home_ip.txt 
D.h. um 12:00 und um 24:00.
Ich wollte eigentlich das mein Script nur um 12:00 Uhr Mittags ausgeführt wird, das reicht voll und ganz. Wie müsste der Command dann aussehen ?
Denn wenn ich

Code: Alles auswählen

* 12,24 * * * bash /etc/fail2ban/fail2ban-ip-whitelisting.sh
schreibe dann sagt er mit "Bad Hour, Errors in Crontab".
Btw: Da dein Script ein Shebang hat ist das `bash' im Cronjob-Aufruf nicht noetig ... und sorgt bei zukuenftigen Umbauten des Scripts moeglicherweise fuer Fehler oder Irritationen.
Hab ich mal rausgenommen, das ist wohl durch das etliche mal hin und herprobieren stehen geblieben :D
echo `date` `cat "$new"` >>/var/log/home_ip.log
Die finde ich aktuell nicht in meinem Script. Vielleicht wieder der Wald und die Bäume :D

Lg
rodeoric

Benutzeravatar
Meillo
Moderator
Beiträge: 8813
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Bash Script erstellen

Beitrag von Meillo » 26.12.2019 09:54:48

rodeoric hat geschrieben: ↑ zum Beitrag ↑
25.12.2019 23:11:10
ich bin schon froh das es jetzt überhaupt läuft :D
Kann ich mir vorstellen. ;-)

Ein explizites `cd' in ein definiertes Verzeichnis am Anfang waere gut. (Auf den ersten Blick scheint `cd /root' korrekt zu sein.) Derzeit gehst du naemlich nur davon aus, dass sowohl deine manuellen Aufrufe als auch Cron das Script schon aus dem richtigen Verzeichnis aufrufen werden. Besser du stellst das sicher.
Was meinst Du damit genau ?
Ich meine, dass manche deiner Dateioperationen im aktuellen Verzeichnis arbeiten, z.B. legt wget die heruntergeladene Datei dorthin. Spaeter machst du dann den mv von /root ... was bedeutet, dass sich wget in /root befunden haben muss. Diese Information ist aber nirgends explizit abgelegt oder gesichert. Es ist mehr zufaellig so, dass alles zusammen passt. Was ich mir vorstelle ist diese Zeile irgendwo am Anfang des Scripts:

Code: Alles auswählen

cd /root
Damit ist explizit festgelegt in welchem Arbeitsverzeichnis das Script laeuft ... egal aus welchem es ausgerufen wird oder wie die konkrete Cron-Implementierung sich diesbezueglich verhaelt.

Code: Alles auswählen

mv cd /root/homeIP.txt /etc/fail2ban/home_ip.txt 
Das geht so nicht. (Dieser Befehl wuerde die Datei `cd' im aktuellen Verzeichnis und die Datei `/root/homeIP.txt' beide in das Zielverzeichnis `/etc/fail2ban/home_ip.txt' verschieben. Da das Zielverzeichnis aber kein Verzeichnis ist, sondern eine Datei, wird der Befehl fehlschlagen. Zudem kaeme eine Fehlermeldung, dass im aktuellen Arbeitsverzeichnis keine Datei `cd' zu finden ist.) Du brauchst zwei Befehle, einmal `cd' und einmal `mv' ... wobei das cd fuer diesen mv-Befehl nicht noetig ist, weil er ja nur absolute Pfade enthaelt. Der wget-Befehl ist derjenige, der die heruntergeladene Datei ins aktuelle Verzeichnis legt.

D.h. um 12:00 und um 24:00.
Ich wollte eigentlich das mein Script nur um 12:00 Uhr Mittags ausgeführt wird, das reicht voll und ganz. Wie müsste der Command dann aussehen ?

Code: Alles auswählen

0 12 * * * ...
Denn wenn ich

Code: Alles auswählen

* 12,24 * * * bash /etc/fail2ban/fail2ban-ip-whitelisting.sh
schreibe dann sagt er mit "Bad Hour, Errors in Crontab".
Oh, es muss ``12,0'' heissen. ;-)

echo `date` `cat "$new"` >>/var/log/home_ip.log
Die finde ich aktuell nicht in meinem Script. Vielleicht wieder der Wald und die Bäume :D
Du kannst es nicht finden. Wenn du meinen Post (bei Tageslicht) nochmal in Ruhe liest, wirst du sehen, dass das eine Idee ist, wie *ich* ein Logging fuer die vorherigen IP-Adressen einrichten wuerde ... statt der Old-Datei und mit Historie.
Use ed once in a while!

Benutzeravatar
Meillo
Moderator
Beiträge: 8813
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Bash Script erstellen

Beitrag von Meillo » 26.12.2019 10:06:45

Hier nochmal eine Ueberarbeitung:

Code: Alles auswählen

#!/bin/bash

myip=/etc/fail2ban/home_ip.txt
log=/var/log/home_ip.log
config_file=/etc/fail2ban/jail.local
IPfix="127.0.0.1\ 127.0.0.0\/8\ 10.0.0.0\/8\ 172.16.0.0\/12\ 192.168.0.0\/16\  "

ip=`wget -O - https://eine-domain.de/homeIP.txt`

if [ "$ip" = `cat "$myip"` ]; then
	exit
fi

echo "$ip" >"$myip"
echo "`date +%F\ %H:%M:%S` $ip" >>"$log"
sed -i "s/\(ignoreip *= *\).*/\1$IPfix$ip/" "$config_file"
/etc/init.d/fail2ban restart

echo "Neue IP gewhitelisted: $ip; Fail2ban neu gestartet"
Ich habe die Old-Datei entfernt. Die aktuelle, neue IP-Adresse halte ich fuer die Verarbeitung in der Variable, statt sie gleich in die Datei zu schreiben.

Zudem gibt es jetzt das Log.

Das Script wird zunehmend uebersichtlicher, wie ich finde. (Das ist ein gutes Zeichen.)


Jetzt koennte man noch das Config-Update verbessern ... vermutlich am besten mit einer separaten, generierten Config-Datei, die man in die Hauptconfig included. Ich kenne mich aber mit fail2ban nicht aus, um zu wissen, wie das dort laeuft. Vielleicht kann da jemand anderes weiterhelfen?
Use ed once in a while!

rodeoric
Beiträge: 30
Registriert: 23.12.2019 15:02:54

Re: Bash Script erstellen

Beitrag von rodeoric » 26.12.2019 17:25:11

Hallo,

auch hier nochmal vielen Dank. Nur dazu brauch ich Ruhe und das wird jetzt knapp zwischen den Jahren.

Vielleicht schaust nochmal kurz über den Crontab drüber, den hätte ich gern um 12 Uhr Mittags einmal gestartet, dann wäre es erstmal so das es läuft und alles weitere nach und nach wenn Zeit ist.

Lg
rodeoric

Benutzeravatar
Meillo
Moderator
Beiträge: 8813
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Bash Script erstellen

Beitrag von Meillo » 26.12.2019 17:31:39

rodeoric hat geschrieben: ↑ zum Beitrag ↑
26.12.2019 17:25:11
auch hier nochmal vielen Dank. Nur dazu brauch ich Ruhe und das wird jetzt knapp zwischen den Jahren.
Klar, kein Problem.
Vielleicht schaust nochmal kurz über den Crontab drüber, den hätte ich gern um 12 Uhr Mittags einmal gestartet,
Habe ich oben schon getan. ;-)

Hier nochmal:

Code: Alles auswählen

0 12 * * * ...
(Lies: Minute 0, Stunde 12, jeden Tag, jeden Monat, jeden Wochentag.)

dann wäre es erstmal so das es läuft und alles weitere nach und nach wenn Zeit ist.
Nur kein Stress! :-)
Use ed once in a while!

rodeoric
Beiträge: 30
Registriert: 23.12.2019 15:02:54

Re: Bash Script erstellen

Beitrag von rodeoric » 26.12.2019 20:30:42

Nun bin ich aber verwirrt :D
* 12 * * * bash /etc/fail2ban/fail2ban-ip-whitelisting.sh
So laeuft der Job von 12:00 bis 12:59 jede Minute und sonst nicht.
Ich möchte ja nicht das er minütlich ausgeführt wird sondern eigentlich nur einmal um 12 Uhr Mittag :D

Das war ja mein bisheriger aus einem älteren Kommentar, ich sehe da keinen Unterschied.
* 12 * * * bash /etc/fail2ban/fail2ban-ip-whitelisting.sh
Vielleicht reden wir da gerade aneinander vorbei, aber ich verstehe von 12:00 Uhr - 12:59 Uhr das er dann wirklich um die 59 mal ausgeführt wird, ist das so korrekt ? :mrgreen:

Ich wünsche dennoch allen hier einen guten Rutsch ins neue Jahr.

Lg
rodeoric

Benutzeravatar
Meillo
Moderator
Beiträge: 8813
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Bash Script erstellen

Beitrag von Meillo » 26.12.2019 20:34:06

Das erste Zeichen muss eine Null und kein Stern sein.
Use ed once in a while!

rodeoric
Beiträge: 30
Registriert: 23.12.2019 15:02:54

Re: Bash Script erstellen

Beitrag von rodeoric » 26.12.2019 20:56:37

Meillo hat geschrieben: ↑ zum Beitrag ↑
26.12.2019 20:34:06
Das erste Zeichen muss eine Null und kein Stern sein.
Danke,

das ging aus dem Beitrag irgendwie nicht hervor. Nun ist es aber klar und angepasst.

Dankeschön.

Lg

Antworten