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
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 12801
|
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)
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: 11176
Wohnort: München
|
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
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: 11176
Wohnort: München
|
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:
| >>> 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: 11176
Wohnort: München
|
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
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. |
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: 11176
Wohnort: München
|
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
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...
|