
allstudentsAnswers20BE テーブルから生徒の宿題とオンライン授業の成績を収集するための小さな Python スクリプトがあります。
これは、私の古い共有 Web ホスティング Web ページでは非常にうまく機能します。
新しい Ubuntu 20.04 クラウド サーバーで、接続が拒否されます。クラウド サーバーを実行した経験はありません。
UFWでポート33060と3306を許可しました
私の自宅の IP は固定されていません。
Pythonスクリプトを実行すると、クラウドサーバーに接続しようとするとこのエラーが発生します
pymysql.err.OperationalError: (1130、「183.206.16.30」はこの MySQL サーバーに接続できません)
netstatによると、mysqldは33060と3306でリッスンしているので、ファイアウォールufwで両方を許可しました
ssh 経由でクラウド サーバーに接続し、次を実行しました。
sudo ナノ /etc/mysql/mysql.conf.d/mysqld.cnf
bind-addressの行を0.0.0.0に変更しました(*も試しました)
mysqlを再起動しました: sudo systemctl restart mysql
サーバー側で設定が必要な他のものがあるはずです。
それが何なのか、何かヒントがあれば教えてください。これが機能することが本当に必要です。
次の情報も取得しました (クラウド IP が 123.456.789.123 であると仮定します)。
pedro@ebs-105422:~$ nc -v -w 2 123.456.789.123 3306
123.456.789.123 3306 ポート [tcp/mysql] への接続が成功しました! pedro@ebs-105422:~$
これは、mysqld が 3530 でリッスンしていることを意味しますか? それとも、それは mysqld の PID ですか??
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:~$
以下はサーバー上のmysqlからのもので、ポート3306を確認しています。
mysql> show variables where variable_name in ('hostname','port');
+--------------+-------------+
| Variable_name | Value |
+--------------+-------------+
| hostname | ebs-105422 |
| port | 3306 | +---------------+-------------+
セットに 2 行あります (0.01 秒)マイSQL>
答え1
私はそれを理解しました。この回答は、同じ問題を抱えている可能性のある人を助けるためのものです。この方法は、3306 が開いているため、それほど安全ではない可能性がありますが、a) 宿題しかありません。b) ユーザー名とパスワードは依然として必要です。
mysql でユーザーを作成すると、次のようになります。サーバー上で ssh 経由で作成する場合も同様です。
'password' で識別されるユーザー 'peter'@'localhost' を作成します。some_db
.* のすべての権限を 'peter'@'localhost' に付与します。
リモート アクセスを希望する場合は、ユーザー データを変更する (または新しいユーザーを作成する) 必要があります。
ユーザー名 'peter'@'localhost' を 'peter'@'%' に名前変更します。somedb
.* のすべての権限を 'peter'@'%' に付与します。
ここでの%は、どうやら任意のIPを表すようです
次に、サーバー上で ssh 経由で次の操作を実行します。
sudo ナノ /etc/mysql/mysql.conf.d/mysqld.cnf
行を見つける
バインドアドレス = 127.0.0.1
これを変更
バインドアドレス = 0.0.0.0
Ctrl + X で nano を終了します。nano は保存するかどうかを尋ねてきます。y を押してから Enter を押すと、/etc/mysql/mysql.conf.d/mysqld.cnf を開いたのと同じ場所に保存されます。
次に(サーバー上で):
sudo systemctlでmysqlを再起動します
その後、Python は Idle シェルから正常に動作するようになりました。
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)