ラズベリパイからサクラVPSのMySQLへ外部からのアクセス

MySQL

(2019-08-22)

あれこれと検索してたらサクラのVPSサーバー側のMySQLのユーザー権限で外部からのアクセスが出来るようになるとあった。以下実施してみたらうまく行った。

ラズパイからsshでrootで入る。
#mysql -uroot -pkxxx6
サクラのMySQLはlocalhostしか設定されていない。
mysqlのuserを追加
mysql> grant all on cake_db.* to test_user@”%” identified by ‘kxx6’;
Query OK, 0 rows affected (0.01 sec)

mysql>flush privileges;
??うまく行かないが・・・
必要なくなったらしい。grantは自動でフラッシュされるとある。

mysql> grant all on cd_rom.* to test_user@”%” identified by ‘kxxxx6’ with grant option;
Query OK, 0 rows affected (0.00 sec)
・ユーザー名は不要だがパスワードはシングルクオートが必要だ。
・test_userは追加された。データベースは存在しないものでも登録というか認識許可となるようだ。以下を再度実行して存在するデータベースを有効にする。
mysql> grant all on cake_db.* to test_user@”%” identified by ‘kxxx6’ with grant option;

データベースは*.*を追加ユーザーでは許可しないようだ・・・。

mysql> select user,host from mysql.user;
+———–+———–+
| user | host |
+———–+———–+
| db_user | % |
| test_user | % |
| root | 127.0.0.1 |

+———–+———–+
11 rows in set (0.00 sec)

●確認
[root@www8384ui ~]# mysql ーhmk.jp -utest_user -pkxx6
mysql> show databases;
+——————–+
| Database |
+——————–+
| information_schema |
| cake_db |
+——————–+
使えるデータベースが制限されている。というか割り当てられた。
mysql> show grants;
+————————————————————————–+
| Grants for test_user@% |
+————————————————————————–+
| GRANT USAGE ON *.* TO ‘test_user’@’%’ IDENTIFIED BY PASSWORD |
| GRANT ALL PRIVILEGES ON `cake_db`.* TO ‘test_user’@’%’ WITH GRANT OPTION |
| GRANT ALL PRIVILEGES ON `cd_rom`.* TO ‘test_user’@’%’ WITH GRANT OPTION |
+————————————————————————–+

それではここで、ラズパイからホストに向けて接続を行ってみた。
ラズパイ側にもMySQLをインストールしておかないとmysqlコマンドが使えないので注意

root@rasp2:/home/pi# mysql -hmakxx.jp -utest_user -pkxxx6
MySQL [(none)]> show databases;
+——————–+
| Database |
+——————–+
| information_schema |
| cake_db |
+——————–+
2 rows in set (1.15 sec)
MySQL [(none)]>

これで外部からのPCでサクラVPSのMySQLサーバーにアクセスできることになった。
これは便利だ!感激!!

●外部PCからサクラVPSのMySQLへアクセスする。(ラズパイとWindows7で実行)
※windows7はプロクシを外してのアクセス

/#!/usr/bin/python3

import MySQLdb

conn = MySQLdb.connect(
user ='test_user',
passwd='kxxx6',
host='makexx.jp', <-- 数字IPでなくともいける
db='cake_db',
charset='utf8') <-- これがないと文字化けになる
cur = conn.cursor()
cur.execute("SELECT kind_string from kinds;")
print(cur.description)
print()

for row in cur:
    print(row)

cur.close()
conn.close()

同じものを以下にも(シンタクスハイライトの違いを見るため)

/#!/usr/bin/python3

import MySQLdb

conn = MySQLdb.connect(
user ='test_user',
passwd='kxxx6',
host='makexx.jp', <-- 数字IPでなくともいける
db='cake_db',
charset='utf8') <-- これがないと文字化けになる
cur = conn.cursor()
cur.execute("SELECT kind_string from kinds;")
print(cur.description)
print()

for row in cur:
    print(row)

cur.close()
conn.close()

実行した結果。うまくいった。
pi@rasp2:~/work/sql $ ./connect.py

((‘kind_string’, 253, 21, 150, 150, 0, 1),)
(‘未分類’,)
(‘ひらめき’,)
(‘課題’,)
(‘開発ツール’,)
(‘PHP’,)
(‘SQL’,)
(‘JavaScript’,)
(‘WEB制作’,)
(‘PhpStrom’,)
(‘Unity’,)


 

https://make-muda.net/2016/07/3550/

 

以下ができるようになるにはそのアクセスする側にもMySQLがないと駄目だとか。
まあ理解できるかな。c#で外部からとはちょっと違いうかな。でもローカルからリーモートのDBを操作できるのは便利だね(勘違いしてないよね。確認が必要だな)。
$mysql -h mk.jp -uuser1 -p
passwd: xxxxx

ホストからの接続でのサーバー側の設定をした確認のためにc#で作成してアクセスしてみる。会社では専らそれだからね。ただし会社のIPはプロクシで範囲が決まっている。今回はパブリックなIPに対して接続するもの。以下はSSHでローカルのいサーバーに接続だから、少し違う。sshでなら参考になるので記載しておくことに。

さくらレンタルサーバのDBにSSH経由でC#を使って接続する - Qiita
##流れ公開鍵を作るRenci.SshNet.dllを使ってポートフォワードデータベース接続##公開鍵を作るTeraTermでさくらに接続。~/.sshに作るのが良いらしいので下記のように…

考えて見たらサクラVPSはlocalhostで自分にアクセス(WEB)のプログラムだけだった。
外部から接続は考えてなかった。以下が参考になるね。

https://linuxserver.jp/%E3%82%B5%E3%83%BC%E3%83%90%E6%A7%8B%E7%AF%89/db/mysql/%E5%A4%96%E9%83%A8%E6%8E%A5%E7%B6%9A%E8%A8%B1%E5%8F%AF%E8%A8%AD%E5%AE%9A/

以下はWindowsからODBCでラズパイのMySQLへアクセスする例だ(これもいいね)。
http://marchan.e5.valueserver.jp/cabin/comp/jbox/arc102/doc10203.html

/* Your code... */
※ ''で囲むときはシングルクオートは必要だ。

select user,host from mysql.user;


mysql> grant all privileges on client_data.* to user1@"192.168.1.%" identified by 'パスワード' with option;


DROP USER 'user'@'localhost';


$mysql -h makejapan.jp -u user1 -p
passwd: ......

 

ここを参考にしてやってみる。

$pip3 install PyMySQL <—これではないようだ
sakuta VPS mk.jpにあるサーバーにアクセスしてみる
DB:cake_db
table: kinds
kind_id,
kind_num,
kind_string

開発環境を入れてからとあるが、撥ねられた。不要なようだ。
$pip3 install mysqlclient
$pip3 show mysqlclient
情報が表示される。

ううむ3.6版だとijmportできない
インポートは名前が変わるとある・・・。

/* Your code... */# 接続する
 conn = MySQLdb.connect(
 user='root',
 passwd='root',
 host='localhost',
 db='mysql')

# 接続を閉じる
 con.close

 

まだ不足があるようだ以下を参考にツールを追加

https://pypi.org/project/mysqlclient/

3.6ではimportできないが、3.5ではOKだ・・・。ベリーコンダはやめようかな。なんだかラズパイは版管理が面倒だ。4Bでメモリ増えたものでubuntouでやるかな。(逃げるなよ!!)

エラーメッセージを見るとauが云々で Access denied が・・・。ルータの制か?
これは、サクラ側のMySQLの許可がないからなようだ。MySQLで設定が必要だ。
以下は会社のIP内でアクセスさせてうまく行ったものサクラのIPで実施したもの。

# モジュール読み込み
import pymysql.cursors
# MySQLに接続する
connection = pymysql.connect(
host='133.243.255.258',
user='root',
password='kxx6',
db='aoc',
charset='utf8',
# cursorclassを指定することで
# Select結果をtupleではなくdictionaryで受け取れる
cursorclass=pymysql.cursors.DictCursor)

print("------------------------- SQLを実行する -----------------------");
with connection.cursor() as cursor:
sql = "SELECT * FROM cake_db.kinds;"
cursor.execute(sql)

# Select結果を取り出す
results = cursor.fetchall()
for r in results:
print(r)

# MySQLから切断する
connection.close()
No tags for this post.
タイトルとURLをコピーしました