Das längste Thema

  • Ich hab aber mal ne ganz andere Frage, ich denke hier ist's am besten aufgehoben:


    Ich bin bei weitem niemand, der problemlos Skripte schreiben kann, ohne sich das ganze nebenbei an fertige Beispielen im Netz anzuschauen, um es dann für mich selbst passend zu machen bzw. den groben Aufbau einer Lösung zu kapieren. (Was jetzt "neues" angeht.)

    Aktuell komme ich bei einer Sache nicht ganz weiter und wollte fragen, ob jemand das ganze schon in etwa kennt, da ich selber nicht wirklich 'ne Idee zur Umsetzung habe:


    Mein Befehl soll eine Textdatei auf einen String durchsuchen und mir dessen (vorher unbekannten!) Wert zurückgeben.

    (Der zurückgegebene Wert ist in meinem Fall eine URL, enthält also keine * oder ", was hierbei sicherlich Probleme bereiten könnte.)

  • My 2 ¢: Es geht (mir) nicht um den automatischen Neustart, den überleben (meine) Systeme schon. Es geht mir rein darum, dass man bei manuellen "Wartungsarbeiten" am System nicht von einem extern ausgelösten Neustart überrascht werden möchte. Ein Absturz ist eine Sache, aber ein geplanter Neustart sollte dem Sysadmin schon bekannt sein, um während dieser Zeit nichts einzuplanen.


    Oh, jetzt hätte ich meinen 6000. Beitrag fast übersehen… 8|

    Das sollte jetzt auch keinesfalls auf deinen Beitrag davor bezogen sein oder dich damit meinen. Es ist nur so ein allgemeinen Phänomen, das ich bei solchen Situationen immer beobachte ;-).

  • Mein Befehl soll eine Textdatei auf einen String durchsuchen und mir dessen (vorher unbekannten!) Wert zurückgeben.

    (Der zurückgegebene Wert ist in meinem Fall eine URL, enthält also keine * oder ", was hierbei sicherlich Probleme bereiten könnte.)

    Was du suchst, sind vermutlich reguläre Ausdrücke (Regex).


    Damit kannst du auf Strings prüfen, die einem bestimmten Muster entsprechen. Hier ist z.B. ein Regex, der auf URLs prüft: https://stackoverflow.com/ques…/check-for-valid-link-url


    Für eine genauere Hilfestellung wären mehr Infos sinnvoll: Welche Programmiersprache setzt du ein? Wie genau sieht der String aus, auf den du matchen willst?

  • Okay den Artikel lese ich gleich, erstmal mehr Infos für euch mwwn   killerbees19


    Aktuell ist es nur ein einfaches Bashsript. Der gefragte Befehl ist nur EIN Teil des Ablaufs.

    Beispielhaft versuche ich mich gerade daran, ein nicht-statisches Bild einer Website herunterzuladen. Daher wird erst die html-Seite als X.temp gespeichert, diese Datei wird danach auf den String durchsucht, der wiefolgt aussieht.
    <meta property="og:image" content="https://example.org/bild_id_0000000000000001.jpg" />

    Ich befürchte, die Anführungszeichen könnten noch Probleme verursachen. Die URL mit diesem Schema taucht übrigens mehrmals im Quellcode auf, nur die "ID" variiert.



    (Was noch eingebaut werden soll: Die ID zwischenspeichern, dass das weitere Prozedere nur ausgeführt wird, wenn die ID(Das Bild) sich verändert hat + das entsprechende Bild inkl. Timestamp zu sichern)

  • Okay ich habe nun doch durch rumprobieren etwas gefunden, was das ganze einigermaßen löst, jedoch nicht komplett. (Ich bin gestern bereits darauf gestoßen, hab jedoch nicht genug mit dem Syntax herumprobiert, um festzustellen, dass dort mein Fehler lag.)

    sed -n -e 's/.*og:image\(.*\)>.*/\1/p' testfile1

    Jedoch liefert dies nur das folgende Ergebnis:

    " content="https://example.org/bild_id_0000000000000001.jpg" /

    Anführungszeichen und den letzten Slash kann ich nicht verwenden, da sonst eine Fehlermeldung zurückgegeben wird. Ich würde nun das ganze in eine .txt exportieren und dort das Weitere entfernen. Gibt es eine vernünftige Lösung, am Ende " / und am Anfang " content=" abzuschneiden wegen der "?

    Ansonsten würde ich versuchen, von vorne https (inkl alles davor) rauszuschneiden und am Ende das .jpg und was danach kommt, dann müsste ich halt wieder das https und das .jpg dranflicken.

  • quick &dirty in der bash:

    grep "<meta property=\"og:image\"" X.temp| sed "s|<meta property=\"og:image\" content=\"||g" |sed "s|\" \/>||g"| sed "s|https://example.org/bild_id_||g"| sed "s|.jpg||g"

    0000000000000001 zurück.

    Setzt natürlich voraus, dass sich ausser der ID nichts ändert. Die Kette von "sed" kann man natuerlich vereinfachen, ist dann aber schlechter lesbar ;-)

    Die "" sind kein Problem, die kannst du, wie in dem Codeschnipsel siehst, mit \ escapen. Wenn das jpg dranbleiben soll, dann das letzte sed weglassen ..

    Gruss

  • Angenommen, die Variable $str enthält deine Datei, dann kannst du mit folgendem Regex die ID extrahieren:

    Code
    1. regex='<meta property="og:image" content="https://example.org/bild_id_([0-9]*).jpg" />'
    2. [[ $str =~ $regex ]] && echo ${BASH_REMATCH[1]}

    Der reguläre Ausdruck ist dabei der Übersicht halber in die erste Zeile ausgelagert. Zur Erklärung:

    • Einfache Anführungszeichen um den Ausdruck umgehen dein Problem mit Qoutes
    • Der einzig variable Teil ist [0-9]*, was auf eine beliebige Anzahl beliebiger Ziffern matcht
    • Die runden Klammern darum "extrahieren" genau diesen Teil - wird in der zweiten Zeile wichtig.
    • Der erste Teil der zweiten Zeile ([[ $str =~ $regex ]]) wendet den regulären Ausdruck auf deinen String an.
    • Bei Erfolg wird der zweite Teil der Zeile (hinter dem &&) ausgeführt. Das "Extrakt" aus dem Regex liegt in BASH_REMATCH, der echo-Befehl gibt einfach den ersten Match aus. Dort würdest du entsprechend deine Checks ausführen.

    Ich hoffe das hilft dir erstmal weiter. Das matcht leider nur auf das erste Vorkommen der URL. Nach kurzer Recherche scheint das übliche Vorgehen zum Finden aller Matches darin zu bestehen, alles bis zum ersten Match abzuschneiden und nochmal zu matchen, vgl. hier: https://stackoverflow.com/ques…atches-of-a-regex-pattern


    Gruß,

    Marvin

  • Das mit den Klammern und dem quasi Teil, "wo alles egal ist, was am ende halt rauskommt", hab ich einigermaßen verstanden. Jedoch besteht die ID nicht nur aus Zahle, kann ich das ganze so erweitern?

    regex='<meta property="og:image" content="([0-9]abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPRSTUVWXYZ_.-/:*).jpg" />'

    [[ $str =~ $regex ]] && echo ${BASH_REMATCH[1]}


    Und ich muss zugeben, ich habe noch nicht wirklich mit regex und co gearbeitet, bzw habe es schnell wieder gelassen, als es mir zu "schwer" wurde. Wie setzte ich regex im Script genau ein, also ich hätte auf ein -tempfile1 o.Ä. gewartet, wie setzte ich das um?


    ${BASH_REMATCH[1]}kann ich dann das gesamte Script über nutzen, bis es quasi von einem neuen ersetzt wird? (Aktuell suche ich nur einen Wert!)



    Und danke vielmals schonmal für die Hilfe!



    Simon

  • Das mit den Klammern und dem quasi Teil, "wo alles egal ist, was am ende halt rauskommt", hab ich einigermaßen verstanden. Jedoch besteht die ID nicht nur aus Zahle, kann ich das ganze so erweitern?

    regex='<meta property="og:image" content="([0-9]abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPRSTUVWXYZ_.-/:*).jpg" />'

    [[ $str =~ $regex ]] && echo ${BASH_REMATCH[1]}

    Die Erweiterung wäre dann sowas wie


    Code
    1. [0-9a-zA-Z._-/:]*

    Das bedeutet, beliebig viele Zeichen hintereinander (*) vom Typ in den eckigen Klammern. Wenn dir der Typ völlig egal ist, dann kannst du auch .* einsetzen, . steht für ein beliebiges Zeichen.

    Dabei zu beachten: Regexes in dieser Variante sind "greedy", das heißt sie schnappen sich so viel sie können. Könnte (Spekulation!) dann ein Problem werden, wenn doch mal mehrere solcher Blöcke auftauchen, dass das .* dann auf alles zwischen den beiden matcht.


    Zum Einsatz: Du schriebst oben, dass du die Datei herunterlädtst. Dann kannst du sie doch danach einfach als String ins Programm lesen und dann den Regex drauf loslassen? Also als Pseudocode:

    Code
    1. download_some_stuff
    2. str=$(<tempfile.html)
    3. regex=...
    4. (der match-Code von vorhin)


    Wie es mit der Gültigkeit von BASH_REMATCH aussieht, weiß ich leider auch nicht. Du könntest es aber z.B. einer anderen Variable zuweisen, wenn das ein Problem sein sollte. Außerdem sollte sich das ganze (zur besseren Übersicht) in ein if verpacken lassen:

    Code
    1. if [[ $str =~ $regex ]]; then
    2.     # Bearbeiten hier
    3. fi


    Gruß,

    Marvin

  • Okay danke soweit erstmal, ich schreibe gleich dazu, wie ich das ganze löse. Habe jedoch noch eine Frage:


    1) In der URL ist jetzt immer ein /s150x150 vorhanden, was beim Download stört. In welcher Form, kann ich dies wieder löschen bzw /s150x150/ durch / ersetzen? Wieder hätte ich eine mögliche Lösung gefunden, jedoch springt diese wieder nicht auf die "/" an.


    2) Blöde frage, aber wie vergleiche ich den Inhalt zweier Dateien mit einem if. Also wenn der Inhalt nicht gleich ist, dann führe X aus?

    EDIT:

    Shell-Script
    1. #!/bin/bash
    2. # datei1=$(md5sum $1)
    3. datei2=$(md5sum $2)
    4. if [ "$datei1" == "$datei2" ]
    5. then
    6. echo "True"
    7. else
    8. echo "False"
    9. fi

    Müsste gehen, also nach dem anpassen. (oder über cmp dürfte einfacher sein)


    Simon

  • in der URL ist jetzt immer ein /s150x150 vorhanden, was beim Download stört.

    wieso stoert das beim Download ? Das dürfte doch diesem egal sein ..

    Der reine Dateivergleich ist aber ab und an "gefährlich". Das Beispiel von 03simon10 passt - allerdings hab ich schon Dateien gesehn, wo sich eigentlich nur ein Wert im HTML ändern sollte - ABER - weil diese etwas länger wurde, haben sich sich Zeilenumbrüche verschoben (frag mich nicht, wie man dass geschafft hat), da wäre ein Vergleich oder ein diff nicht wirklich glücklich drüber :-)

    Gruss

  • Nochmal Danke an euch alle, hab es jetzt geschafft, dass ganze zusammenzufassen und etwas anzupassen. Wen interessiert, wie das ganze aussieht: Unten inkl. hastiger Anmerkungen meinerseits.



  • Hui, ein sattes Plus :|

    Bei unseren VMs sieht das ein wenig anders aus.

    Wir haben momentan 7 VMs im produktiven Einsatz. Heute Vormittag / Mittag habe ich Kernel gepatcht.


    Auf drei Systemen wurde von Linux 4.9.32 mit GrSecurity und PaX Härtung auf 4.9.65 mit KAISER Patches aber ohne weitere Härtung.

    Die CPU Util. Graphen dieser Systeme zeigen einen Lastrückgang von 2 bis 3 Prozentpunkte auf. (Hostnodes noch nicht geupdatet).


    Auf einem System hatten wir ein Update von einem regulär ungehärtetem Kernel auf die 4.9.65 mit KAISER Patches. (Hostnode bereits geupdatet).

    Auf dem einen System konnten wir einen Lastzugang von bis zu 5 Prozentpunkten feststellen. Die Grafik halte ich für eher interessant und habe sie einmal angehängt.


    So dramatisch zeichnet sich das also nicht ab. Wenn die entsprechenden Kernel mit GrSecurity, PaX und Kaiser gepatcht sind, erwarte ich am Ende einen Zuwachs von evtl. zwei Prozentpunkten. Dazu kommt ja noch, dass die Patches im Laufe der Zeit besser werden (und die nächste[n] Prozessorgenerationen und Iterationen der Netcup VMs stehen auch noch da). Alles in Allem: Don't panic.


    Ich könnte mir gut vorstellen, dass das ganze bei Xen PV noch ein wenig anders aussieht (Xen PV wird bei einigen Cloudanbietern bevorzugt genutzt).

  • da ja im Zuge dieser kritischen Updates (Meltdown, Spectre), die Wirtsysteme rebootet werden müssen, und dies auch einen Einfluß auf die Gastsysteme hat,

    mal die Frage: würde es denn Sinn machen, die Gastsysteme nicht zu rebooten, sondern in den 'Suspend-to-Disk' zu schicken?


    ich denke, wenn das die kleineren Gastsysteme (z.B. VPS100, VPS, RS1000, RS2000) sind,

    und diese auch nur einen Teil vom zugesicherten RAM verwenden, kann dies deutlich schneller gehen als ein Reboot,


    oder ist dies keine gute Idee?


    Probleme, daß Gastsysteme auf den Reboot nicht reagieren und echt hart abgeschaltet werden müssen, wäre damit aus dem Weg gegangen ...

    Grüße / Greetings

    Walter H.


    RS 1000 SAS G8 xRAM; RS 500 SSD G8; S 1000 G7; VPS 200 G8 Akt.; Webhost. 1000 m. 75%