
Ich habe ein kleines Python-Skript, um die Hausaufgaben- und Online-Unterrichtsergebnisse der Schüler aus der Tabelle „allstudentsAnswers20BE“ zu sammeln.
Das funktioniert auf meiner alten Shared-Webhosting-Webseite hervorragend.
Auf dem neuen Ubuntu 20.04-Cloud-Server wird meine Verbindung abgelehnt. Ich habe keine Erfahrung mit dem Betrieb eines Cloud-Servers.
Ich habe die Ports 33060 und 3306 in UFW zugelassen
Meine IP zu Hause ist nicht festgelegt.
Wenn ich mein Python-Skript ausführe, erhalte ich diesen Fehler beim Versuch, eine Verbindung zum Cloud-Server herzustellen
pymysql.err.OperationalError: (1130, „183.206.16.30‘ darf keine Verbindung zu diesem MySQL-Server herstellen“)
netstat sagt, mysqld lauscht auf 33060 und 3306, also habe ich beide in der Firewall zugelassen ufw
Um eine Verbindung zum Cloud-Server über SSH herzustellen, habe ich Folgendes ausgeführt:
sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf
Ich habe die Zeile „Bind-Adresse“ in 0.0.0.0 geändert (ich habe auch * versucht)
Ich habe MySQL neu gestartet: sudo systemctl restart mysql
Es muss noch etwas anderes geben, das serverseitig eingestellt werden muss.
Bitte irgendwelche Tipps, was das sein könnte, ich brauche das wirklich, damit es funktioniert.
Ich habe auch diese Informationen erhalten (nehme an, meine Cloud-IP ist 123.456.789.123):
pedro@ebs-105422:~$ nc -v -w 2 123.456.789.123 3306
Verbindung zu 123.456.789.123 3306 Port [tcp/mysql] erfolgreich! pedro@ebs-105422:~$
Bedeutet dies, dass mysqld auf 3530 lauscht? Oder ist das die PID von mysqld?
pedro@ebs-105422:~$ sudo netstat -tap | grep mysql tcp 0 0 0.0.0.0:mysql 0.0.0.0:* LISTEN 3530/mysqld
tcp6 0 0 [::]:33060 [::]:* LISTEN 3530/mysqld
pedro@ebs-105422:~$
Unten ist von MySQL auf dem Server, bestätigt Port 3306
mysql> Variablen anzeigen, bei denen Variablenname in ('Hostname', 'Port');
+---------------+------------+
| Variablenname | Wert |
+---------------+------------+
| Hostname | ebs-105422 |
| Port | 3306 | +---------------+------------+
2 Zeilen im Set (0,01 Sek.)MySQL>
Antwort1
Ich habe es herausgefunden, diese Antwort soll nur jedem helfen, der das gleiche Problem haben könnte. Dieser Weg ist wahrscheinlich nicht so sicher, da 3306 geöffnet ist, aber a) habe ich nur Hausaufgaben, b) Sie benötigen trotzdem den Benutzernamen und das Passwort.
Wenn Sie einen Benutzer auf MySQL erstellen, sieht das ungefähr so aus, auch wenn Sie dies über SSH auf dem Server tun:
ERSTELLEN SIE DEN DURCH „Passwort“ IDENTIFIZIERTEN BENUTZER „peter“@„localhost“. GEWÄHREN SIE „
peter“@„localhost“ ALLE PRIVILEGIEN FÜR some_db.*.
Wenn Sie Fernzugriff wünschen, müssen Sie die Benutzerdaten ändern (oder einen neuen Benutzer anlegen):
BENENNEN SIE BENUTZER „peter“@„localhost“ IN „peter“@„%“ UM;
GRANT ALL ON somedb.* IN „peter“@„%“;
% steht hier offenbar für jede IP
Anschließend ebenfalls per ssh auf den Server:
sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf
Suche die Zeile, die
Bindeadresse = 127.0.0.1
ändern Sie dies in
Bindeadresse = 0.0.0.0
Strg X, um Nano zu beenden. Nano fragt, ob Sie speichern möchten. Drücken Sie y und dann die Eingabetaste, um an derselben Stelle zu speichern, an der Sie /etc/mysql/mysql.conf.d/mysqld.cnf geöffnet haben.
Dann (auf dem Server):
sudo systemctl MySQL neu starten
Danach funktionierte mein Python in der Idle-Shell einwandfrei:
def mysqlRemoteAttn(clas):
# To connect remote MySQL database
conn = pymysql.connect(
host='123.456.789.123',
port=3306,
user='myusername',
password = 'mypassword',
db='allstudentsdb',
)
cur = conn.cursor()
sql = f"SELECT studentnr, attn_this_week FROM allstudents{clas}"
cur.execute(sql)
output = cur.fetchall()
# To close the connection
conn.close()
return output
# get the attendance from the webpage MySQL
results = mysqlRemoteAttn(clas)