вторник, декември 17, 2013

SSH тунели и MySQL

Наложи ми се да боря с доста странен проблем, искам да направя SSH тунел и през него да се вържа към отдалечен mysql сървър. Eто какво се случва

Изпълнявам

ssh user@domain.com -L 4401:127.0.0.1:3306 -N 

което би трябвало да създаде тунела и да мога на port 4401 да се вържа към mysql, обаче се оказа, че не е точно както аз си го мисля.

ако изпълня:
mysql -u user -p --port=4401
ми дава грешен user или парола. Оказа се, че всъщност mysql конзолния клиент се опитва да се свърше на default-ния порт - 3306, а не на 4401 и по незнайно каква логика игнорира параметъра за порт.

Решението е да се укаже протокол
mysql -u user -p --port=4401 --protocol=TCP 
в този случай, нещата сработват.

проблем има и също в php, ако опитате стандартното:
mysql_connect("localhost:4401", "user", "pass)
не успява да се свърже, но пък странно:
mysql_connect("127.0.0.1:4401", "user", "pass)
работи, защото явно това е начина да кажете на mysql_connect, че искате да ползвате TCP.


Този проблем го срещам за пръв път и ми се получава само под Linux (Ubuntu 13.04). Под Windows/Mac OS X няма нужда да указвам протоколи.

Между другото тунела в Windows можете да направите с plink така:

plink.exe -L 4402:localhost:3306 -pw password user@domain

Както се вижда, при plink може директно да се зададе парола в командния ред. При ssh под Линукс нещата са малко по-сложни, но можете да го направите като използвате sshpass:

sshpass -p 'password' ssh -o StrictHostKeyChecking=no user@domain -L 4401:127.0.0.1:3306 -N 


Вкарването на паролата по този начин, не е от най-културните изпълнения за това е препоръчително при възможност да си генерирате ssh ключове и така да се свързвате с отдалечената машина без парола. За това може да пиша някой друг път.