Зависает скрипт при выполнении команды создания туннеля

_Евгений

Новичок
Задача: перед обращением к базе данных mysql на другом сервере нужно предварительно сделать к нему ssh-туннель (программно)

Я делаю это так:
PHP:
`ssh -2 -N -f -C -L 5671:localhost:3306 [email protected]`;
И запускаю скрипт из терминала. Вручную эта команда прекрасно запускается. Однако когда php до нее доходит он тупо зависает и чего-то ждет (хотя на самом деле туннель создается). Вывести его из ступора можно только ctrl+c. После чего туннель остается, но скрипт то свою работу не доделал.

Пробывал разные варианты:
PHP:
`ssh -2 -N -f -C -L 5671:localhost:3306 [email protected]&`;
`ssh -2 -N -f -C -L 5671:localhost:3306 [email protected]  2>&1`;
exec('ssh -2 -N -f -C -L 5671:localhost:3306 [email protected]');
shell_exec('ssh -2 -N -f -C -L 5671:localhost:3306 [email protected]');
system('ssh -2 -N -f -C -L 5671:localhost:3306 [email protected]');
ничего не помагает. Что это такое может быть?
 

_Евгений

Новичок
возможно, ждет ввода пароля :)

попробуй или через proc_open() или через расширение http://pecl.php.net/package/ssh2
Соединение без пароля по сертификату. proc_open() работает точно так же, а пичкать нестандартными расширениями, которые в репозиторий не входят, не очень хочется...
Но похоже на то, что действительно просит пароль, сейчас попробую в опциях покопаться.
 

DYPA

Настоящая dypa (c)
а пичкать нестандартными расширениями, которые в репозиторий не входят, не очень хочется...
pecl install уже не стандартное?! с каких пор? юзаем ssh2 на продакшен серверах уже почти пол года - проблем с ним нет ;)
зато со стандартным curl попадается segfault при неопределенных условиях... так что поставка того или иного pecl расширения с php не гарантия качества
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
DYPA обнови курл в системе и пересобери экстеншн
 

_Евгений

Новичок
Не получилось у меня с ssh2, потому что там функция ssh2_tunnel принимает в параметрах только один порт. Мне же нужно указать 2: который слушать и к которому обращаться на удаленном сервере.

Проблему удалось решить с помощью ruby. При обращении к ssh там тоже происходило зависание, однако там предусмотрена возможность параллельных вычислений. Таким образом я открыл поток, отправил туда открытие туннеля, он там и остался. Если кому пригодиться, это можно сделать так:
PHP:
Thread.new(params.command) do |command|
  puts `#{command}`
end

Вот вам, блин, и php vs ruby
 

fixxxer

К.О.
Партнер клуба
о господи какой п-ц

1) давайте я угадаю, php работает от другого юзера, потому и ключики не цепляются
2) nohup ssh параметры 1>/dev/null 2>/dev/null & (или если по уму то же самое через proc_open)
 

_Евгений

Новичок
1) давайте я угадаю, php работает от другого юзера, потому и ключики не цепляются
Нет, они работают от одного и того же пользователя. Да и с соединением все нормально - ведь туннель создается.

2) nohup ssh параметры 1>/dev/null 2>/dev/null & (или если по уму то же самое через proc_open)
О! А так работает!!! Без всяких костылей! Ура!!!
 
Сверху