Привязка MySQL к локальному порту через SSH - работает в консоли, а не через PHP shell_exec () в Mac OSX - PullRequest
3 голосов
/ 01 июля 2011

Я использую 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 разрешений, но безуспешно.

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

1 Ответ

3 голосов
/ 01 июля 2011

Зачем вам нужен пароль, если вы используете закрытый ключ?Вы имеете в виду пароль для файла ключей?Я думаю, что это может быть проблемой, потому что 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 подключиться вызов.Таким образом, вы можете решить проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...