rokkonet

PC・Androidソフトウェア・アプリの開発・使い方に関するメモ

unixソケット認証のmysql/mariadbにPCログイン中のユーザー名とは異なるmysqlユーザーで接続する方法

2021 May 21.

シェルスクリプトの中でmysqlにアクセスする方法として調べたもの


unixソケット認証のmysqlでは、ログインしているユーザー(userA)とは別のシステムユーザー名(userB)と同じmysqlユーザー(userB)で接続しようとすると、アクセス拒否される。(userBのmysqlパスワードが設定されていないので当然?)

[userAとuserBは/etc/passwdに登録されていて、mysqlのユーザーにも登録されている]
(失敗例1)

userA $ mysql -u userB --password=xxx
ERROR 1698 (28000): Access denied for user 'userB'@'localhost'


(失敗例2)
次のように~/.my.cnf.userCを作成してアクセスしても拒否される

(1) 任意のファイル(ここでは ~/.my.cnf.userC とする)にuserCの情報を書き込む

[mysqldump]
user=userC
password=xxx

[client]
user=userC
password=xxx

(2) userCでmysqlに接続する

userA $ mysql --defaults-extra-file=.my.cnf.userC -u userC
ERROR 1698 (28000): Access denied for user 'userC'@'localhost'


一方、システムに登録されていないmysqlユーザー(userC)なら、--passwordオプションでパスワードを付けるとアクセスできる

(userCは/etc/passwdに登録されておらず、mysqlのユーザーには登録されている)
userA $ mysql -u userC --password=xxx
MariaDB [(none)]>


・sudoコマンドを使ってシステムのuserAがmysqlのuserBでパスワード無しで接続する方法

[userAとuserBは/etc/passwdに登録されていて、mysqlのユーザーにも登録されている]

(1) /etc/sudoerにシステムの他のユーザーとなる設定を記述する

visudoコマンドで/etc/sudoerに下記を記述する

userA ALL=(userB) NOPASSWD: /usr/bin/mysql
  userA: システムにログインしているユーザー名
  userB: mysqlのユーザー名でもある、システムの他のユーザー(mysqlにuserB@localhostユーザーが必要)

(2) sudoコマンドでmysqlに接続する

userA $ sudo -u userB mysql


・利用したいmysqlユーザーと同じ権限の別ユーザーを作成して接続する方法

rootユーザーと同じ権限のadminユーザーを作る例

(1) ユーザーadminを作成
$ sudo mysql -u root

> GRANT ALL ON *.* TO 'admin'@'localhost' IDENTIFIED BY 'XXXX' WITH GRANT OPTION ;
> FLUSH PRIVILEGES;

(2) ~/.my.cnfを作成
userA $ cat ~/.my.cnf
[mysqldump]
user=admin
password=XXXX

[client]
user=admin
password=XXXX

(3) adminユーザーでmysqlに接続

(~/.my.cnfを読み込むのでパスワード入力不要)

userA $ mysql -u admin


/etc/passwdに登録されておらず、mysqlのユーザーに登録されているuserCでのパスワード入力無しのmysqlアクセス

(1) 任意のファイルパス(ここでは ~/.my.cnf.userC とする)にuserCの情報を書き込む

[mysqldump]
user=userC
password=xxx

[client]
user=userC
password=xxx

(2) mysqlにuserCでパスワード入力無しで接続する

userA $ mysql --defaults-extra-file=.my.cnf.userC -u userC