質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
さくらのVPS

さくらのVPSは、さくらインターネット社が提供するVPS(仮想専用サーバー)です。高速なSSDの選択や複数台構成も可能。利用者に応じた柔軟なプランが用意されています。大規模システムにも対応可能なスケーラビリティを備えたホスティングサービスです。

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

SSH

SSH(Secure Shell)は、セキュアチャネルを通してデータを交換するためのネットワークプロトコルです。リモートサーバーへのコマンド実行やファイル転送を行う時に一般的に使用されます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

2回答

4813閲覧

PHPでSSHサーバ経由でMySQLに接続したい。(How to connect to MySQL over SSH)

Arsnova

総合スコア8

さくらのVPS

さくらのVPSは、さくらインターネット社が提供するVPS(仮想専用サーバー)です。高速なSSDの選択や複数台構成も可能。利用者に応じた柔軟なプランが用意されています。大規模システムにも対応可能なスケーラビリティを備えたホスティングサービスです。

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

SSH

SSH(Secure Shell)は、セキュアチャネルを通してデータを交換するためのネットワークプロトコルです。リモートサーバーへのコマンド実行やファイル転送を行う時に一般的に使用されます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

1グッド

2クリップ

投稿2020/03/22 08:45

編集2020/03/22 13:28
APサーバ環境
  • PHP 7.3.12
DB/SSHサーバ環境
  • CentOS 7.7.1908
  • MySQL 8.0.19
実現したいこと

PHPアプリケーション内でSSHポートフォワーディング(トンネル)を構築して、
PHPアプリケーションからMySQLに接続したいです。

試したこと

こちらを参考にし、下記コードを書いてみました。

PHP

1<?php 2 $ret; 3 $output; 4 try { 5 $cmd = 'ssh -f -N -L 19000:server.ne.jp:3306 root@server.ne.jp -i ./key/id_rsa 2>&1'; 6 exec($cmd,$output,$ret); 7 var_dump($output, $ret); 8 echo '<br>'; 9 } catch (Exception $e) { 10 exit('捕捉した例外:'.$e->getMessage()); 11 } 12 13 $dsn = 'mysql:dbname=mydb;host=127.0.0.1;charset=utf8mb4'; 14 $user = 'username'; 15 $pass = 'P@ssw0rd'; 16 try { 17 $pdo = new PDO($dsn,$user,$pass, 18 [ 19 PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, 20 PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, 21 ] 22 ); 23 } catch (PDOException $e) { 24 exit('データベース接続失敗。'.$e->getMessage()); 25 } 26?>
上記コードを実行すると以下、画面に表示されます。

array(1) { [0]=> string(29) "Host key verification failed." } int(255)
データベース接続失敗。SQLSTATE[HY000] [2002] Connection refused

教えていただきたいこと(わからないこと)
  • execコマンドの第3引数で成功したかどうかわかるとのことで表示してみたら255と返ってきましたが、PHP初心者のため、何が原因で失敗しているのか、この先何を試したらよいか分かりません。。。
  • その他、どうすればSSH経由でMySQLに接続できるか教えていただきたく。
補足
  • 当方手元のPCはwindowsです。TeraTermからSSHポートフォワーディングを行い、ODBC接続でMySQLに接続できることは確認しています。(ので、コマンドの接続情報やポート番号等は間違いありません。)
  • MySQLのユーザの認証方法は「mysql_native_password」です。

よろしくお願いいたします。

yodel👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

CHERRY

2020/03/22 09:29

コマンドの標準エラー出力を標準出力にリダイレクトすると $output には、どのようなメッセージが表示されますか?
Arsnova

2020/03/22 13:30

ご連絡ありがとうございます。 先ほど質問を修正しました。そちらにも記載しましたが、$outputには array(1) { [0]=> string(29) "Host key verification failed." } int(255) と出力されるようになりました。 このエラーメッセージで検索してみようと思います。 手元のPCでTeraTermで秘密鍵を使って接続はできてはいます。
guest

回答2

0

まず、手動で下記のsshコマンドが動くかどうかを確認しましょう。

sh

1$ ssh -f -N -L 19000:server.ne.jp:3306 root@server.ne.jp -i ./key/id_rsa

ここで、19000:server.ne.jp:3306 に書かれているホスト名(server.ne.jp)は、ssh接続した端末(サーバー)から見てのホスト名です。上記の記述だと同じホスト名になっているので、以下のように書くこともできます。

sh

1$ ssh -f -N -L 19000:localhost:3306 root@server.ne.jp -i ./key/id_rsa

また、root@server.ne.jp となっているのは、rootでssh接続することになりますが、ssh側でrootログインの許可は与えていますか? セキュリティ上の理由で、多くの場合、rootではsshログインできなくなっています。この点も確認してください。

また、以下のDSNですが、以下は間違いです。

PHP

1$dsn = 'mysql:dbname=mydb;host=server.ne.jp;charset=utf8mb4';

おそらく以下のようにすべきです。参照元の記事もそうなっています(ポート番号等は違いますが)。

PHP

1$dsn = 'mysql:dbname=db;host=127.0.0.1;port=19000;charset=utf8mb4';

こちらも、事前に、以下のようにmysqlコマンドで接続を確認しておくとよいでしょう。

sh

1$ mysql -u root -h 127.0.0.1 -P 19000 -p

初心者の方ほど事前確認を怠りがちですが、段階的に確認していかないとうまくはいきません。難易度の高いことを試す場合はなおさらです。

投稿2020/03/22 11:12

ockeghem

総合スコア11701

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

自己解決

CHERRY様にご質問いただいた後、前に進み始めましたので、
以下私の解決手順等を記載致します。
(エラーメッセージは記憶で調べて書いているので正確ではないかもしれません。)

発生した課題と解決策

#####Host key verification failed.
下記execコマンドでのエラー内容が「array(1) { [0]=> string(29) "Host key verification failed." } int(255)」だった。

PHP

1 $cmd = 'ssh -f -N -L 19000:server.ne.jp:3306 root@server.ne.jp -i ./key/id_rsa 2>&1'; 2 exec($cmd,$output,$ret); 3 var_dump($output, $ret);

解決策としては、known_hostsにフィンガープリントを追記しました。もっとエレガントな方法があると思いますが、私の場合は、手元のPCのTeraTermのknown_hostsをテキストエディタで開いてAPサーバの方にコピペしました。

execコマンドでフリーズ

上記課題を解決した後、実行したらexecのところでフリーズしました。
下記で解決しました。リダイレクトするところで「>/dev/null 2>&1」と書いたら動きました。

PHP

1$cmd = 'ssh -f -N -L 19000:localhost:3306 root@ik1-339-29972.vs.sakura.ne.jp -i ./key/id_rsa >/dev/null 2>&1';

公式のヘルプに該当すると思われる記載があります。

プログラムがこの関数で始まる場合、 バックグラウンドで処理を続けさせるには、 プログラムの出力をファイルや別の出力ストリームにリダイレクトする必要があります。 そうしないと、プログラムが実行を終えるまで PHP はハングしてしまいます。

Permissions xxxx for 'xxxxxxid_rsa' are too open.

鍵ファイルの権限が600である必要があるようです。下記のようなコマンドで解決しました。

SSH

1$ chmod 0600 xxxxid_rsa
DB接続部分でエラー

すみません。エラーメッセージをメモしていませんでしたが上記エラーを解決した段階でDB接続できない状態でした。下記修正で解決しました。

PHP

1 // 修正前 2 $dsn = 'mysql:dbname=mydb;host=127.0.0.1;charset=utf8mb4';

PHP

1 // 修正後 2 $dsn = 'mysql:dbname=mydb;host=127.0.0.1:19000;charset=utf8mb4';

確かにポートフォワーディングしているので当然ですね。19000を追加することにより接続できました。
ご返信くださいましたCHERRY様、ockeghem様(ミサ曲がお好きでしょうか。)、ありがとうございました。

投稿2020/03/31 04:03

Arsnova

総合スコア8

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問