Наложи ми се да боря с доста странен проблем, искам да направя 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 ключове и така да се свързвате с отдалечената машина без парола. За това може да пиша някой друг път.