staging.inyokaproject.org

Variable zerlegen

Status: Gelöst | Ubuntu-Version: Ubuntu 18.10 (Cosmic Cuttlefish)
Antworten |

Nazaled

Avatar von Nazaled

Anmeldungsdatum:
13. September 2018

Beiträge: 33

Servus,

ich bin noch am Anfang der Programmierung und muss eine Url zerlegen. Es muss am Ende immer "nur" zB example.com raus kommen. Wenn der User also www.example.com oder subdomain.example.com eingibt muss der Script es auf example.com kürzen.

Kann mir jemand bitte ein Denkanstoß geben, wir sitzen hier seit 9 uhr und sind am suchen und rum testen ☺

Es soll in eine Bash ausführbar sein.

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13242

Nazaled schrieb:

ich bin noch am Anfang der Programmierung und muss eine Url zerlegen. Es muss am Ende immer "nur" zB example.com raus kommen. Wenn der User also www.example.com oder subdomain.example.com eingibt muss der Script es auf example.com kürzen.

Also, Du willst die Domäne extrahieren.

Kann mir jemand bitte ein Denkanstoß geben, wir sitzen hier seit 9 uhr und sind am suchen und rum testen ☺

Es soll in eine Bash ausführbar sein.

Denkanstoß

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
#!/bin/sh

set -x

for url in http://www.google.de http://www.google.de/ http://www.google.de/foo; do
  echo ">>> $url"
  domain="${url#*://}"
  domain="${domain%%/*}"

  while [ -z "${domain##*.*.*}" ]; do
    domain="${domain#*.}"
  done

  echo "domain $domain"
done

In eine Datei packen und ausführen. Das ist natürlich noch nicht komplett. Spannend sind TLDs mit Punkt, wie z.B. "co.uk".

Nazaled

(Themenstarter)
Avatar von Nazaled

Anmeldungsdatum:
13. September 2018

Beiträge: 33

Genau das habe ich gebraucht. Haben es nun in die Funktion eingebaut und es funktioniert. Wegen den uk.com Geschichten schau ich morgen ☺

seahawk1986

Anmeldungsdatum:
27. Oktober 2006

Beiträge: 11278

Nazaled schrieb:

Wegen den uk.com Geschichten schau ich morgen ☺

Da hilft es eigentlich nur die zulässigen TLDs zu kennen - also könnte man z.B. sowas machen, wenn man das in der Bash ausführen will:

sudo apt install python3-tldextract
url="www.example.com"
python3 << EOF
import tldextract
x = tldextract.extract("$url")
print(x.domain, x.suffix, sep=".")
EOF 

marv85

Avatar von marv85

Anmeldungsdatum:
9. Januar 2019

Beiträge: 43

Guten Morgen Wir habe einmal dein Script verarbeitet.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21

while read variable
for url in $variable; do
#  echo >>> $url"

  domain="${variable#*://}"
  domain="${domain%%/*}"

  while [ -z "${domain##*.*.*}" ]; do
    domain="${domain#*.}"
  done

done
do
mysql=$(mysql --skip-column-names -u user -ppassword -e"use squid; SELECT * FROM blacklist WHERE http = '$domain';")
if [ "$mysql" = "$domain" ];then
echo "OK"
else
echo "ERR"
fi
done

Ich habe das echo herausgenommen weil so übergibt er den Wert doch auch oder? Es funktioniert zumindest. Jetzt setzen wir uns an das Problem uk.com. Gibt es denn nicht die Möglichkeit, z.B. wenn auto.cu.com übrig bleibt, zu sagen eine Domain besteht immer aus dem ersten Punkt und dem was vor dem ersten Punkt steht und dem was nach dem ersten Punkt steht. Ich dachte da an Platzhalter.... Wir werden das von seahawk1986 aber auch einmal testen.

seahawk1986

Anmeldungsdatum:
27. Oktober 2006

Beiträge: 11278

marv85 schrieb:

Gibt es denn nicht die Möglichkeit, z.B. wenn auto.cu.com übrig bleibt, zu sagen eine Domain besteht immer aus dem ersten Punkt und dem was vor dem ersten Punkt steht und dem was nach dem ersten Punkt steht.

Schau dir mal die folgenden Beispiele an - das kannst du schlecht mit Abzählen lösen, da musst du die die von der IANA definierten (g)TLDs und Second Level Domains kennen, also wissen, dass .co.uk anders zu behandeln ist als bl.uk, weil du sonst bei einer Blacklist möglicherweise mehr erwischst als dir lieb ist:

1
2
3
4
5
>>> import tldextract
>>> tldextract.extract("example.co.uk")
ExtractResult(subdomain='', domain='example', suffix='co.uk')
>>> tldextract.extract("explore.bl.uk")
ExtractResult(subdomain='explore', domain='bl', suffix='uk')

seahawk1986

Anmeldungsdatum:
27. Oktober 2006

Beiträge: 11278

Man könnte das komplett in Python3 machen (das Paket python3-pymysql wäre zusätzlich noch nötig):

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
#!/usr/bin/env python3
import fileinput
import pymysql.cursors
import tldextract

connection = pymysql.connect(host='localhost', # or unix_socket='/var/run/mysqld/mysqld.sock'
                             user='user',
                             password='password',
                             db='squid',
                             charset='utf8mb4',
                             cursorclass=pymysql.cursors.DictCursor)

try:
    with connection.cursor() as cursor:
        for line in fileinput.input():
            x = tldextract.extract(line.strip())
            check_entry = "{}.{}".format(x.domain, x.suffix)
            cursor.execute("SELECT * FROM blacklist WHERE http = %s", (check_entry,))
            print(check_entry, " " if cursor.fetchone() else " not ", "in blacklist", sep='')
finally:
    connection.close()

Das Skript liest die zu prüfenden URLs zeilenweise von stdin oder aus als Argument(en) übergebenen Datei(en) und prüft, ob die Kombination aus Domain und Suffix in der Datenbank ist.

marv85

Avatar von marv85

Anmeldungsdatum:
9. Januar 2019

Beiträge: 43

Ok ich verstehe ... Puh Python ist dann doch noch einen Schritt weiter. 😲 Na ja man wächst mit seinen Aufgaben...! Ich verstehe zumindest was das Script macht.

1
2
3
4
5

  File "test.py", line 19
    print(check_entry, " " if cursor.fetchone() else " not ", "in blacklist", sep='')
                                                                                 ^
SyntaxError: invalid syntax

Es hat mir diesen Fehler ausgegeben. Das soll doch etwas separieren oder?

seahawk1986

Anmeldungsdatum:
27. Oktober 2006

Beiträge: 11278

Sicher, dass du das Skript mit python3 und nicht mit python ausführst?

sep='' bestimmt das Trennzeichen, das er zwischen die zu druckenden Elemente setzt (standardmäßig ist das ein Leerzeichen, in dem Fall ist aber kein Trennzeichen gewollt, daher der leere String) - vgl. https://docs.python.org/3/library/functions.html#print

marv85

Avatar von marv85

Anmeldungsdatum:
9. Januar 2019

Beiträge: 43

Asche auf mein Haupt, du hast recht. Das Script funktioniert soweit. Wir testen jetzt mal alle Varianten, wie sie mit dem Proxy zusammen harmonieren. Zusätzlich haben ich mich einmal in die REGEXP Funktion bei MySQL eingelesen. Vieleicht ist das auch noch ein Weg. Vielleicht auch eine Kombi aus beiden!?! Wir danken euch aber sehr für die Hilfe. Gelernt haben wir viel...

Antworten |