Связывание MySQL с локальным портом через SSH – работает в консоли, а не через PHP shell_exec () в Mac OSX

Я запускаю OSX 10.6.7 и пытаюсь подключиться к удаленному серверу MySQL через ssh для запуска некоторых скриптов PHP. В настоящее время я запускаю следующие команды без проблем:

ssh -i /Users/xxxx/key.pem user@data.server.com -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 user@data.server.com -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 разрешений, но не повезло.

Спасибо за помощь; Это сводит меня с ума.

Зачем вам нужен пароль, если вы используете закрытый ключ? Вы имеете в виду пароль для ключевого файла? Я думаю, что это может быть проблемой, потому что ssh принимает аутентификацию с использованием паролей только в tty, а функции php * exec не так ли.

В вопросе сна вы можете попробовать опцию -N ssh, которая полезна для туннелей и не требует выполнения удаленной команды. Попробуйте установить туннель, используя оболочку, а затем просто подключитесь к этому туннелю с помощью php.

Обновить:

Я попробовал это, и он работает на моем Mac

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

вы должны добавить свой параметр -i и заменить свое имя хоста.

Это вывод на моем компьютере

 resource(9) of type (mysql link) 

Но имейте в виду, что у вас будет пара проблем с этим. Оператор &> /dev/null возвращает функцию exec немедленно, но она будет подавлять любой вывод (главным образом, ошибки) при выполнении сценария несколько раз, потому что каждый новый запрос будет пытаться открыть новое соединение, он будет успешным, но он не может настроить туннель, поскольку порт 5500 уже используется. Через некоторое время у вас будет много процесса ssh, ожидающего вашего устройства.

Чтобы этого избежать, вы должны попытаться подключиться к mysql перед вызовом ssh, и если вы не сможете настроить туннель и повторите вызов соединения mysql. Таким образом, вы можете решить эту проблему.