2011-06-30 5 views
3

OSX 10.6.7を実行していて、ssh経由でリモートのMySQLサーバに接続しようとしています。現在、次のコマンドを問題なく実行しています。MySQLをSSH経由でローカルポートにバインドする - Mac OSXのPHP shell_exec()でなく、コンソールで動作する

ssh -i /Users/xxxx/key.pem [email protected] -L 53306:localhost:3306 -f sleep 60 >> logfile 
mysql -u user -p -h 127.0.0.1 -P 53306 

パスワードで認証した後、正常に動作します。 (長いので、それは当然のスリープタイムアウト、前だと。)

私はこのPHPスクリプトを実行すると、しかし...

$shell = shell_exec("ssh -i /Users/xxxx/key1.pem [email protected] -L 53306:localhost:3306 -f sleep 60 >> logfile"); 

$mysqli = mysqli_connect('127.0.0.1', 'user', 'password', 'database', 53306); 

私は接続を拒否します。 shell_exec()を省略すると、同じエラーが発生します。 $ shellをエコーすると何も出力されません。

key1.pemにはchmod 400の権限があり、key.pemのコピーで、chown _wwwを実行しました。私はkey.pemまたはkey1.pemを使用しようとすると同じエラーが発生します。私は運がないと440の許可も試みました。

ありがとうございました。これは私をナットにしている。

+0

私はコンソールから実行すると、スクリプトが実行されているようです。それは別のユーザーの下で実行されていますか?アクセス権の問題のためにsshが起動していない可能性があります。システム($ cmd、$ return)を使用して戻り値が何かを与えているかどうかを調べてみてください。 – Rahly

答えて

3

秘密鍵を使用している場合はなぜパスワードが必要ですか?キーファイルのパスワードを意味しますか? sshはttyとphp * execのパスワードだけを使って認証を受け入れるので問題になると思います。

睡眠に関する質問では、トンネルに便利な-Nオプションを試すことができます。これはリモートコマンドを実行する必要はありません。シェルを使ってトンネルを確立して、そのトンネルにPHPで接続してみてください。

更新:

私はこれを試してみましたが、それはあなたがあなたの-iオプションを追加し、ホスト名を置き換える必要があり

<? 
exec('ssh -f -N -n -L 5500:localhost:3306 your-host-name &> /dev/null'); 
var_dump(mysql_connect('127.0.0.1:5500', 'root')); 

私のMac上で作業を行います。

これは私のコンピュータ上の出力

resource(9) of type (mysql link) 

ですが、あなたはこれで問題のカップルを持っているだろうことを覚えておいてください。 &> /dev/nullステートメントは、exec関数をすぐに返しますが、スクリプトを複数回実行すると、新しい要求がすべて新しい接続を開こうとするため、すべての出力(主にエラー)が抑制されますが、成功しますが、ポート5500はすでに使用中です。しばらくすると、あなたのマシンには多くのsshプロセスが保留されます。

これを避けるには、sshコールの前にmysqlに接続し、トンネルをセットアップしてmysql接続コールをやり直すことができない場合は、接続を試みます。この方法で問題を解決することができます。

+0

パスワードはMySQLサーバ用であり、ssh接続用ではありません(パスワードなし)。私はMySQLサーバを所有していないので、変更することはできません。 –

+0

あなたの答えは私には少し不明です。シェルを使ってトンネルを確立し、それをPHP経由で接続するとどういう意味ですか? shell_exec()はこれを処理する必要があります。 –

+0

この場合、これは問題ではありません。あなたはまだシェルからトンネルを開き(そして開いたままに)しようとし、PHPだけを使ってmysqlサーバにログインしようとすることができます。あなたのコードのshell_exec行をコメントして、その方法で試してみてください) – Fabio

関連する問題