Datenbankverbindung zu mySQL mittels perl DBI

Alle weiteren Dienste, die nicht in die drei oberen Foren gehören.
Antworten
ropri8
Beiträge: 82
Registriert: 22.02.2008 08:37:56

Datenbankverbindung zu mySQL mittels perl DBI

Beitrag von ropri8 » 25.02.2019 19:00:39

Hallo!
Ich habe eine entfernte Datenbank, auf welche ich mittels mysql-Client zugreifen kann. Nun will ich ein kleines Script erstellen, um gewisse Abfragen zu automatisieren und die Abfrageergebnisse dann in Form zu bringen. Hab's schon mit einem Shell-Script versucht, und im Prinzip sind erste Tests auch gelungen, aber ich finde es eher umständlich. Ich müsste (soweit meine Kenntnisse reichen) oftmals den Befehl mysql aufrufen, da dazwischen mit shell-Befehlen abgefragte Daten verarbeitet werden müssen und mit dem Ergebnis neuerlich Abfragen gestartet werden.

Ich möchte aber was basteln, wo ich die Verbindung nur 1x aufbauen muß und dann während des gesamten Programmablaufes Zugriff habe und am Ende die Verbindung schließe.
Also versuche ich es mit perl, wo ich absoluter Anfänger bin. Leider scheitere ich schon am Verbindungsaufbau, welcher offenbar nach folgendem Muster erfolgen kann:

Code: Alles auswählen

my $db_user = 'USER';
my $db_name = 'DATENBANKNAME';
my $db_passwd = 'PASSWORT';
my $db_host = 'SERVERIP';

my $db = DBI->connect("DBI:mysql:database=$db_name;host=$db_host", "$db_user", "$db_passwd");
Hier bekomme ich den Fehler: Access denied for user ....., und zwar offenbar deswegen,
weil nicht nur der 'USER' übertragen wird, sondern zusätzlich der eigene Hostname etwa in der Form: 'USER@EIGENER_HOSTNAME'
Wie kann man das machen, daß nur der USER übertragen wird?
Gruß,
Roman

Benutzeravatar
bluestar
Beiträge: 2346
Registriert: 26.10.2004 11:16:34
Wohnort: Rhein-Main-Gebiet

Re: Datenbankverbindung zu mySQL mittels perl DBI

Beitrag von bluestar » 26.02.2019 10:29:12

ropri8 hat geschrieben: ↑ zum Beitrag ↑
25.02.2019 19:00:39
weil nicht nur der 'USER' übertragen wird, sondern zusätzlich der eigene Hostname etwa in der Form: 'USER@EIGENER_HOSTNAME'
Es wird nur USER übertragen, aber anhand deiner Fehlermeldung kann ich erahnen, dass der Benutzer 'USER' von deinem Rechner aus nicht das Recht hat auf die Datenbank zuzugreifen. Prüfe mal ob du mit dem mysql-Clienten darauf zugreifen kannst:

Code: Alles auswählen

mysql --host='SERVERIP' --user='USER' '$DATENBANKNAME' 
Wenn du nach dem Passwort gefragt wirst, dann gibst du das Passwort 'PASSWORT' ein.

ropri8
Beiträge: 82
Registriert: 22.02.2008 08:37:56

Re: Datenbankverbindung zu mySQL mittels perl DBI

Beitrag von ropri8 » 26.02.2019 11:58:02

Hallo!
Ja, das funktioniert - habe ich übrigens auch im 1. Satz geschrieben :-)
Vielleicht habe ich mich dennoch nicht klar ausgedrückt wie ich das meine beim Zugriff mittels perl:
Das Wort 'USER' habe ich nur hier zum posten genommen - natürlich habe ich einen anderen Namen für den Zugriff.

Sagen wir als Beispiel, der Username (welcher mit mysql funtktioniert) wäre 'admin123'. Perl macht bei der Fehlermeldung die Angabe:
Access denied for user 'admin123@123-456-789-123.dsl.dyn-su.de'
Den Teil nach dem @ hat er scheinbar von meiner dynamischen Adresse, welche mir der Provider zugewiesen hat (habe hier aber absichtlich andere Werte angegeben). Wie sage ich es ihm, daß er nur 'admin123' übertragen soll?

Benutzeravatar
bluestar
Beiträge: 2346
Registriert: 26.10.2004 11:16:34
Wohnort: Rhein-Main-Gebiet

Re: Datenbankverbindung zu mySQL mittels perl DBI

Beitrag von bluestar » 26.02.2019 12:02:12

ropri8 hat geschrieben: ↑ zum Beitrag ↑
26.02.2019 11:58:02
Access denied for user 'admin123@1123-456-789-123.dsl.dyn-su.de'
Ja die Fehlermeldubg generiert der MySQL Server.
Wie sage ich es ihm, daß er nur 'admin123' übertragen soll?
Dein Client überträgt nur „admin123“, schau es dir mit Wireshark an.

Daher meine Bitte es auf exakt dem Clienten mit dem mysql Kommandozeilen Tool probieren, wo du deinen Perlcode laufen lassen möchtest.

Benutzeravatar
heisenberg
Beiträge: 3540
Registriert: 04.06.2015 01:17:27
Lizenz eigener Beiträge: MIT Lizenz

Re: Datenbankverbindung zu mySQL mittels perl DBI

Beitrag von heisenberg » 26.02.2019 12:03:58

Die Fehlermeldung bedeutet nicht, dass der MySQL-Server das(admin123@1123....) als Benutzernamen bekommen hat. Sie bedeutet dass der Benutzer "admin123" tatsächlich vom Host "1123-456-789-123.dsl.dyn-su.de'" kommt und keine Zugriffsberechtigung hat und deswegen ein "Access denied" bekommt.

a) Mit welchen genauen Kommandos hast Du die Zugriffsberechtigung gesetzt?
b) Zeige mal die Ausgabe von mysql -e 'select user,host from mysql.user where user like "%admin123%"'

Da Du ja offensichtlich eine dynamische IP hast, musst Du den Zugriff unbeschränkt gestatten(Sicherheitsrisiko!).

Code: Alles auswählen

mysql> grant all on deinedatenbank.* to 'admin123'@'%' identified by "sehrgeheimespasswort";
mysql> flush privileges;
Das % - Zeichen steht hier für eine beliebige IP-Adresse.

Aus Sicherheitsgründen empfehle ich Dir stattdessen wärmstens den Mysql-Port nicht auf der öffentlichen IP-Adresse laufen zu lassen, sondern als Bind-Address die 127.0.0.1 zu verwenden. Der Zugriff kann dann über eine SSH-Portweiterleitung laufen. Z. B. so:

Code: Alles auswählen

ssh -L 13306:127.0.0.1:3306 deinserver 
# Jetzt kannst Du lokal(Hostname: 127.0.0.1) via Port 13306 auf den MySQL-Dienst zugreifen.
mysql -h 127.0.0.1 -P 13306 
alternativ auch nur via sockets...

Code: Alles auswählen

ssh -L /tmp/mysqld-remote.sock:/var/run/mysqld/mysqld.sock
mysql --socket=/tmp/mysqld-remote.sock 
Jede Rohheit hat ihren Ursprung in einer Schwäche.

ropri8
Beiträge: 82
Registriert: 22.02.2008 08:37:56

Re: Datenbankverbindung zu mySQL mittels perl DBI

Beitrag von ropri8 » 26.02.2019 15:09:35

Hallo!
Huh - das ist jetzt peinlich: ich hatte im perl-script bei der Befüllung der Variablen Username und Datenbank vertauscht. Und trotz Fehlermeldung ist mir das leider so lange nicht aufgefallen (vielleicht aus dem Grund, weil Datenbankname und Username relativ ähnlich sind) ... Ok, jetzt sollte die Verbindung mal funktionieren, mal schauen, ob ich was rauskriege :-)
Danke für eure Hilfe!!

@ heisenberg:
a) zur Zugriffsberechtigung: ich hab' da ein kleines Hosting-Paket wo eben eine Datenbank dabei ist. Also im Prinzip kann ich beim mySQL-Server wenig konfigurieren wenn ich das richtig kapiere. Von vornherein ist ein Fernzugriff gesperrt. Aber es gibt bei diesem Hosting-Paket ein Admin-Panel. Dort komme ich mittels mySQL-php-admin zur Datenbank und/oder man kann man unter "Fernzugriff verwalten" eine oder mehrere IP-Adressen eingeben, für welche der externe Zugriff dann erlaubt ist. Und ich versuche das jetzt mal so, indem ich dort die mir aktuell zugewiesene dynamische IP-Adresse eingebe. Ist zwar nicht besonders elegant, da ich den Zugriff über dieses script nur eher selten brauche reicht es aber vorerst.
Was du am Schluß mit "Aus Sicherheitsgründen ..." durchschaue ich jetzt leider noch nicht. Wäre dazu ein voller Serverzugriff nötig?

Benutzeravatar
heisenberg
Beiträge: 3540
Registriert: 04.06.2015 01:17:27
Lizenz eigener Beiträge: MIT Lizenz

Re: Datenbankverbindung zu mySQL mittels perl DBI

Beitrag von heisenberg » 27.02.2019 16:00:52

ropri8 hat geschrieben: ↑ zum Beitrag ↑
26.02.2019 15:09:35
Was du am Schluß mit "Aus Sicherheitsgründen ..." durchschaue ich jetzt leider noch nicht. Wäre dazu ein voller Serverzugriff nötig?
Ja. Da brauchst Du vollen Serverzugriff, den Du bei einem Webhostingpaket nicht hast. Das wären Einstellungen am mysql-daemon. Auch die SSH-Variante wird wohl nicht gehen, da Du wahrscheinlich keinen SSH-Zugriff auf Deinen Server hast.
Jede Rohheit hat ihren Ursprung in einer Schwäche.

Antworten