April 7, 20215 yr Hallo, ich möchte mir gerne täglich mithilfe eines Scriptes meine aktuelle öffentliche IP weg schreiben. Dazu soll eine Datei unter /mnt/cache/myip.txt mit dem aktuellen Zeitstempel und der ermittelten IP gespeichert und täglich ergänzt werden. Hat vielleicht jemand eine Idee wie man das umsetzen kann?
April 7, 20215 yr Community Expert Mit einer doppelten eckigen Klammer kann man Text in eine Datei schreiben: https://stackoverflow.com/a/11162510/318765 Und die öffentliche IP bekommt man nur in dem man eine Website herunterlädt, die mit der IP antwortet. Da gibt es verschiedene: https://stackoverflow.com/questions/14594151/methods-to-detect-public-ip-address-in-bash https://www.cyberciti.biz/faq/how-to-find-my-public-ip-address-from-command-line-on-a-linux/#:~:text=Use 3rd party web-sites to get your IP Beispiel: http://checkip.amazonaws.com/ zB könnte man nun die IP einer Variablen zuordnen: server_ip="$(curl checkip.amazonaws.com)" Und dann packt man den Inhalt der Variablen in eine Datei: echo $server_ip >> "/mnt/cache/myip.txt" Teste die beiden Kommandos im Webterminal und wenn sie funktionieren, packst du sie in ein Script und lässt das zB alle 5 Minuten ausführen. Mit dem Befehl kannst du übrigens den Inhalt einer Datei ausgeben lassen: cat "/mnt/cache/myip.txt"
April 8, 20215 yr Author Vielen Dank hat funktioniert. Quote server_ip="$(curl ipecho.net/plank)" echo $server_ip >> "/mnt/cache/myip.txt" Könnte ich vorher auch noch abprüfen, ob der Wert in dem File schon vorhanden ist und dann nur rein schreiben, wenn er noch nicht vorhanden ist? Edited April 8, 20215 yr by Anym001
April 8, 20215 yr 3 hours ago, Anym001 said: Vielen Dank hat funktioniert. Könnte ich vorher auch noch abprüfen, ob der Wert in dem File schon vorhanden ist und dann nur rein schreiben, wenn er noch nicht vorhanden ist? Probier das: #!/bin/bash currenIP="$(wget -qO- ipecho.net/plain)" filepath="/mnt/cache/myip.txt" if [ ! "$(cat $filepath | tail -5 | grep ${currentIP})" ]; then echo "$(date +'%Y-%m-%d')" ${currentIP} >> ${filepath} fi Nur kurz zur Erklärung: if holt sich die letzten 5 Einträge deiner myip.txt Datei mittels tail und prüft dann mittels grep ob diese gefunden wird mittels grep und das ganze wird umgekehrt durch ! am Anfang sprich: Wenn einer der letzten 5 Einträge in deiner Datei myip.txt nicht gleich der aktuellen IP ist dann schreibe die aktuelle IP in die myip.txt hinzu. (die letzten 5 Einträge deswegen weil es durchaus möglich sein kann das du nach einer Woche oder ein paar Tagen wieder die gleiche IP hast die du schon mal gehabt hast und die würde dann nicht geschrieben werden wenn du einfach blind nach der IP suchen würdest, kannst 5 auch mit 3 oder so tauschen wenn du noch weniger prüfen willst oder sich deine IP nur selten ändert) Bei meinem Script füge ich dann noch den Datum hinzu am Anfang damit du siehst wann das war, Uhrzeit finde ich hier ein wenig übertrieben. Hoffe das ergibt Sinn. EDIT: Du kannst es auch zusätzlich ins syslog schreiben nur damit du siehst was er so macht... currenIP="$(wget -qO- ipecho.net/plain)" filepath="/mnt/cache/myip.txt" if [ ! "$(cat $filepath | tail -5 | grep ${currentIP})" ]; then logger "Writing current public IP: ${currentIP} to myip.txt" echo "$(date +'%Y-%m-%d')" ${currentIP} >> ${filepath} else logger "Nothing to do, current public IP: ${currentIP} hasn't changed." fi
April 8, 20215 yr Community Expert PS Falls du nur eine IP drin haben willst, kannst du auch nur eine eckige Klammer nehmen: https://stackoverflow.com/a/4676473/318765
April 8, 20215 yr @Anym001 genau wie @mgutt schon geschrieben hat eine > überschreibt die ganze Datei mit der Ausgabe des Befehls in Linux und zwei >> fügen die Ausgabe des Befehls am Schluss der Datei hinzu. Ich glaube aber dein Usecase ist eben das du wissen willst wie oft und wann sich deine IP geändert hat oder?
April 8, 20215 yr Author 1 hour ago, ich777 said: Ich glaube aber dein Usecase ist eben das du wissen willst wie oft und wann sich deine IP geändert hat oder? Ja genau. Wobei mir gerade noch eingefallen ist, dass man diese Logik für die von @mgutt geschriebene Nextcloud Firewall auch verwenden könnte. Hab mal ein bisschen was zusammen gebastelt: (weg schreiben der 3-stelligen IP-Range der aktuellen public IP > wobei geprüft wird, ob eine entsprechende Datei bereits existiert) Quote current_ip="$(wget -qO- ipecho.net/plain)" ip_range="$(echo $current_ip | grep -o '[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}')" filepath="/mnt/user/appdata/nextcloud/nextcloud/firewall/${ip_range}.ip" if [ ! -f ${filepath} ]; then logger "USER SCRIPTS: Creating the file ${filepath}" /usr/local/emhttp/webGui/scripts/notify -i normal -s "File created." -d "File ${filepath} successfully created." echo -n > ${filepath} else logger "USER SCRIPTS: Nothing to do, the file ${filepath} already exists." fi Somit wäre zumindest der Zugriff von “Zuhause” immer ohne Probleme möglich.
April 8, 20215 yr Community Expert 14 minutes ago, Anym001 said: dass man diese Logik für die von @mgutt geschriebene Nextcloud Firewall auch verwenden könnte. Stimmt.
Archived
This topic is now archived and is closed to further replies.