Доступ к БД через SSH-туннель

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Re: Доступ к БД через SSH-туннель

Сообщение Владимир » 22.09.2010 15:58:54

Нет. Сам виноват - в скрипте напорол. С TProcess проброс туннеля происходит штатно. Только вот не очень понятно, что дальше делать для подключения к удаленной БД, т.е. как объяснить Zeos-у, чтобы он использовал туннель?
Или использовать тот же TProcess и заливать туда строку подключения к БД, туда же писать запросы и читать ответы? Как-то коряво...
Владимир
постоялец
 
Сообщения: 355
Зарегистрирован: 23.08.2007 19:48:39
Откуда: Москва

Re: Доступ к БД через SSH-туннель

Сообщение MageSlayer » 22.09.2010 20:10:58

Владимир писал(а):Нет. Сам виноват - в скрипте напорол. С TProcess проброс туннеля происходит штатно. Только вот не очень понятно, что дальше делать для подключения к удаленной БД, т.е. как объяснить Zeos-у, чтобы он использовал туннель?
Или использовать тот же TProcess и заливать туда строку подключения к БД, туда же писать запросы и читать ответы? Как-то коряво...


Ё-маё.
Сообщение читали viewtopic.php?f=5&t=6264&st=0&sk=t&sd=a#p46095 ?

Все, туннель открылся.
Указывайте своему Zeos'у в строку подключения: хост - localhost, порт - тот который указан в скрипте, все остальное тоже самое.
MageSlayer
постоялец
 
Сообщения: 216
Зарегистрирован: 07.09.2006 12:30:44

Re: Доступ к БД через SSH-туннель

Сообщение Владимир » 22.09.2010 21:38:35

Уважаемый MageSlayer! Ё-маё - это, как понимаю, раздражение на мою бестолковость. Ок, принимается.
Очень прошу помочь. Теперь по порядку.
Код: Выделить всё
procedure TMainFrm.FormCreate(Sender: TObject);
begin //создание формы и начальные установки
myProc:=TProcess.Create(Nil);//myProc объявлен глобально
myProc.CommandLine:='/home/shop/exec/ssh_conn1';//вызываем скрипт ssh_conn1 проброса туннеля
//myProc.Options:=myProc.Options+[poWaitOnExit, poUsePipes, poNoConsole];//если так, то в процессах есть строка ssh -L 122:127.0.0.1:3306 и т.д. но приложение виснет...
myProc.Options:=myproc.Options+[poUsePipes, poNoConsole];//если так, то в процессах строка зомби  [ssh_conn1] <defunct>
myProc.Execute;
MyProc.Free;
end;

Далее, в свойствах Zeos изначально установлено Database, User, Password,HostName=127.0.0.1, port=122
При попытке в софте поставить Connected:=True получаю "Can't connect to MYSQL server on 127.0.0.1"
p.s. Вопрос 1: если на локальной машине работает сервер MySQL - это не мешает?
Вопрос 2: если в командной строке пробросить туннель, то из Lazarus-а через него к удаленной БД не добраться? Это я в плане отладки...
Спасибо.
Владимир
постоялец
 
Сообщения: 355
Зарегистрирован: 23.08.2007 19:48:39
Откуда: Москва

Re: Доступ к БД через SSH-туннель

Сообщение MageSlayer » 23.09.2010 09:57:49

Владимир писал(а):
Код: Выделить всё
procedure TMainFrm.FormCreate(Sender: TObject);
begin //создание формы и начальные установки
myProc:=TProcess.Create(Nil);//myProc объявлен глобально
myProc.CommandLine:='/home/shop/exec/ssh_conn1';//вызываем скрипт ssh_conn1 проброса туннеля
//myProc.Options:=myProc.Options+[poWaitOnExit, poUsePipes, poNoConsole];//если так, то в процессах есть строка ssh -L 122:127.0.0.1:3306 и т.д. но приложение виснет...
myProc.Options:=myproc.Options+[poUsePipes, poNoConsole];//если так, то в процессах строка зомби  [ssh_conn1] <defunct>
myProc.Execute;
MyProc.Free;
end;


Думаю, что строка с зомби, это нужная вам строка. Но код не тестил.
Просто перенесите myProc.Execute; MyProc.Free; подальше по времени. Например на событие закрытие коннекции с базой. То есть процесс должен работать параллельно с вашей программой. С poWaitOnExit так и должно быть, вы просто ждете завершения процесса. Это вам не надо.

Владимир писал(а):Далее, в свойствах Zeos изначально установлено Database, User, Password,HostName=127.0.0.1, port=122


Порт 122 выглядит странно. Порты <1024 это системные и обычно доступно только под рутом.
Выберите что-нибудь типа 10000 и проверьте через "netstat -ln" что порт действительно открылся и слушает подключения.
То есть надо отладить туннель отдельно.

Владимир писал(а):При попытке в софте поставить Connected:=True получаю "Can't connect to MYSQL server on 127.0.0.1"

Чтобы локализовать проблему, после установки туннеля, попробуйте подконнектиться через него не своей программой, а каким-нибудь клиентом к MySQL.

Владимир писал(а):Вопрос 1: если на локальной машине работает сервер MySQL - это не мешает?

Если он слушает на порту отличном от того, что вы указываете для туннеля, то мешать не будет.

Владимир писал(а):Вопрос 2: если в командной строке пробросить туннель, то из Lazarus-а через него к удаленной БД не добраться? Это я в плане отладки...
Спасибо.

Неясен вопрос.
Если туннель уже проброшен, то через него может коннектиться кто угодно.
MageSlayer
постоялец
 
Сообщения: 216
Зарегистрирован: 07.09.2006 12:30:44

Re: Доступ к БД через SSH-туннель

Сообщение Владимир » 23.09.2010 10:22:48

Спасибо, пробую, отпишусь.

Добавлено спустя 29 минут 22 секунды:
Сделал
Код: Выделить всё
myProc.Options:=myproc.Options+[poUsePipes]

Туннель запускается (и с портом 22 и с 1122 - изменил по Вашему совету). В процессах имеем
ssh -L 1122:127.0.0.1:3306 и т.д.
netstat показывает прослушку по 1122
в командной строке руками подключаюсь к БД штатно
убрал из текста Process.Free - запуск нормальный
При попытке коннекта из софта приложение виснет без каких-либо сообщений.
Zeos вроде живой - стоит указать другой порт - идет ругань.

Добавлено спустя 13 минут 30 секунд:
Листинг после проброса порта 1122
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 127.0.0.1:2208 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:512 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:2049 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:513 0.0.0.0:* LISTEN
tcp 0 0 127.0.0.1:1122 0.0.0.0:* LISTEN

Добавлено спустя 5 часов 39 минут 4 секунды:
Ппц. Попробовал соединиться по SSH (использовал Puttu) с той же БД под виндой - та же фигня.
В командной строке - все отлично.
Использовал свой софт под Delphi с Zeos, а также фирменный MysqlQueryBrowser - в обоих случаях получаю Can't connect to host 127.0.0.1.
Что-то как-то странно.
Владимир
постоялец
 
Сообщения: 355
Зарегистрирован: 23.08.2007 19:48:39
Откуда: Москва

Re: Доступ к БД через SSH-туннель

Сообщение MageSlayer » 25.09.2010 00:07:48

Несколько грязноватая реализация на срокую руку.

Код в Лазарусе:
Код: Выделить всё
...
implementation
uses BaseUnix;

procedure TForm1.FormCreate(Sender: TObject);
begin
  p:=TProcess.Create(nil);
  p.CommandLine:='ssh-connect.sh';
  p.Options:=p.Options + [poNoConsole];

  p.Execute;
  Caption:=IntToStr(p.ProcessID);
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  //p.Terminate(0); - слишком быстро прибивает потомка через SIGKILL
  //SIGTERM не успевает выполниться

  fpkill(p.Handle,SIGTERM);
  p.Free;
end;



Скрипт запуска ssh:
Код: Выделить всё
#!/bin/bash

LOG=ssh.log
rm $LOG
trap bashtrap 0

bashtrap()
{
    echo "ssh kill started at" >> $LOG
    date >> $LOG
    kill -9 $pid
    echo "Amen" >> $LOG
}

export SSH_ASKPASS="./pass.sh" # сюда подставляем скрипт, который выдает пароль в STDOUT
export DISPLAY=":0" # надо даже если у вас нету X

setsid ssh -L 10000:localhost:3050 denis@server sleep INF &
pid=$!
echo "ssh pid=$pid" >> $LOG

sleep INF
MageSlayer
постоялец
 
Сообщения: 216
Зарегистрирован: 07.09.2006 12:30:44

Re: Доступ к БД через SSH-туннель

Сообщение Владимир » 25.09.2010 23:43:00

Уважаемый MageSlayer!
Огромное спасибо за внимание, я обязательно попробую Ваши код и скрипты (пиво по-любому с меня) - я чуть подразобрался и вроде как локализовал проблему.
Под виндой с Puttu и MySqlQueryBrowser все живет, доступ к БД нормальный, а под Delphi-6 с Zeos (версия около 5-й) - фигвам (индейское жилище). При попытке коннекта к базе выдается сообщение, что, мол, данный клиент не поддерживает "протокол с аутентификацией".
Под лином - стоит только в параметрах подключения Zeos указать localhost, он (Zeos) требует локальную базу с данным пользователем, глубоко наплевав на номер порта - пишет Access denied for user 'lalala'@'localhost'. Конечно, я мог бы добавить нужного пользователя в локальную БД, но что будет дальше - это уже экзотика какая-то...
Таким образом, исключив мои детские ошибки, предварительно можно констатировать: Zeos 6.6.5 по SSH не работает.
СПАСИБ!

Добавлено спустя 37 минут 37 секунд:
p.s. Даже при запущенном SSH-туннеле попытка доступа к удаленной БД командой
mysql -h localhost -u username_db -pxxxxxx
заканчивается также
ERROR 1045 (28000): Access denied for user 'lalala'@'localhost' (using password: YES)
Вот это уж совсем непонятно - или при соединении № порта указывать надо?
Последний раз редактировалось Владимир 28.09.2010 09:26:27, всего редактировалось 1 раз.
Владимир
постоялец
 
Сообщения: 355
Зарегистрирован: 23.08.2007 19:48:39
Откуда: Москва

Re: Доступ к БД через SSH-туннель

Сообщение MageSlayer » 26.09.2010 12:17:39

Владимир писал(а):Добавлено спустя 37 минут 37 секунд:
p.s. Даже при запущенном SSH-туннеле попытка доступа к удаленной БД командой
mysql -h localhost -u username_db -pxxxxxx
заканчивается также
ERROR 1045 (28000): Access denied for user 'ekadrive_db'@'localhost' (using password: YES)
Вот это уж совсем непонятно - или при соединении № порта указывать надо?


Разумеется надо указывать порт.
MageSlayer
постоялец
 
Сообщения: 216
Зарегистрирован: 07.09.2006 12:30:44

Re: Доступ к БД через SSH-туннель

Сообщение Владимир » 27.09.2010 16:30:33

Доброго! Команда при запущенном туннеле
root@azs:/etc/ssh# mysql -h localhost -u lalala -pxxxxx -P 3306
заканчивается так же:
ERROR 1045 (28000): Access denied for user 'lalala'@'localhost' (using password: YES)
Складывается впечатление, что на моей (локальной) машине в конфиге mysql что-то не поднято?
С какого-такого клиент mysql ломится в локальную базу?
Остановил локальный сервер - сразу ругань на /tmp/mysql.sock - мол, нет сервера.
От отчаяния попробую на win-машину установить Zeos 6.6.5 (как и в лин-машине) и там попробовать ssh-доступ к mysql.
Вопрос (дурацкий): если поднят SSH-туннель (запущен скрипт /bin/bash ./ssh_conn1), то в процессах должно быть
4381 pts/8 S+ 0:00 /bin/bash ./ssh_conn1
4382 ? Ss 0:00 ssh -L 11122:127.0.0.1:3306 lalala@ssh.tralala.ru
или что-то не так?
Последний раз редактировалось Владимир 28.09.2010 09:28:54, всего редактировалось 1 раз.
Владимир
постоялец
 
Сообщения: 355
Зарегистрирован: 23.08.2007 19:48:39
Откуда: Москва

Re: Доступ к БД через SSH-туннель

Сообщение MageSlayer » 27.09.2010 23:18:03

Владимир писал(а):Доброго! Команда при запущенном туннеле
root@azs:/etc/ssh# mysql -h localhost -u ekadrive_db -pxxxxx -P 3306
заканчивается так же:
ERROR 1045 (28000): Access denied for user 'ekadrive_db'@'localhost' (using password: YES)
Складывается впечатление, что на моей (локальной) машине в конфиге mysql что-то не поднято?
С какого-такого клиент mysql ломится в локальную базу?

Если локальный (не сервер на который проброшен порт) сервер слушает 3306, то все верно. А по-умолчанию Mysql слушает 3306.
Так что вы уже определитесь, или вы коннектитесь с локальному серверу mysql, к удаленному через проброшенный порт или к локальному через проброшенный на localhost-же порт. Пока что складывается впечатление, что вы сами не понимаете с чему вы коннектитесь.

Владимир писал(а):Остановил локальный сервер - сразу ругань на /tmp/mysql.sock - мол, нет сервера.
От отчаяния попробую на win-машину установить Zeos 6.6.5 (как и в лин-машине) и там попробовать ssh-доступ к mysql.

Во-первых. Если и дальше будете пытаться прыгать с машины на машину без _детального_ указания (условного конечно) где сервер с mysql (хост), какой на нем есть пользователь, как к нему коннектитесь (какая команда или скрипт), через какой порт и т.д., то мне скоро надоест эта бесконечная история.
У меня нет винды и запускать ее нет никакого желания. Так что давайте остановимся на варианте с Linux.

Владимир писал(а):Вопрос (дурацкий): если поднят SSH-туннель (запущен скрипт /bin/bash ./ssh_conn1), то в процессах должно быть
4381 pts/8 S+ 0:00 /bin/bash ./ssh_conn1
4382 ? Ss 0:00 ssh -L 11122:127.0.0.1:3307 login@ssh.server
или что-то не так?

Отличный вопрос. Можно встречный - что у вас в ./ssh_conn1? Как говорится - штатные телепаты в отпуске.
Вы можете запустить мой рабочий скрипт, который я выложил ранее, со своими параметрами и не выдумать велосипеды с квадратными колесами?
Кстати, советую убрать из вашего последнего поста dns-имя своего сервера. Я думаю, что лишние проблемы вам никчему :).
MageSlayer
постоялец
 
Сообщения: 216
Зарегистрирован: 07.09.2006 12:30:44

Re: Доступ к БД через SSH-туннель

Сообщение Владимир » 28.09.2010 10:55:48

Спасибо за терпение.
Есть MySQL сервер на хостинге провайдера, к которому нужно подключиться с помощью клиента на локальной машине.
(на локальной машине также работает MySQL сервер)
Из командной строки запускаю
Код: Выделить всё
#!/bin/bash
# 19.09.2010
export SSH_ASKPASS="/home/volod/ssh_psw"
export DISPLAY=":0"
setsid ssh -L 11122:127.0.0.1:3050 lalal@ssh.tralala.ru

в процессах на локальной машине
4381 pts/8 S+ 0:00 /bin/bash ./ssh_conn1
4382 ? Ss 0:00 ssh -L 11122:127.0.0.1:3050 lalala@ssh.tralala.ru

открывается терминал удаленной машины - я так понимаю, что туннель установлен - могу войти в БД.

Далее в другом терминале на локальной машине
root@azs:/etc/ssh# mysql -h localhost -u lalala_db -pxxxxx -P 3050
ERROR 1045 (28000): Access denied for user 'lalala_db'@'localhost' (using password: YES)
Понятно, что на локальном сервере нет пользователя lalala_db.

Добавлено спустя 5 часов 34 минуты 54 секунды:
Касаемо Вашего скрипта ssh_conn2
Код: Выделить всё
#!/bin/bash
# 26.09.2010

LOG=ssh.log
rm $LOG
trap bashtrap 0

bashtrap()
{
echo "ssh kill started at" >> $LOG
date >> $LOG
kill -9 $pid
echo "Amen" >> $LOG
}
export SSH_ASKPASS="/home/volod/ssh_psw"
export DISPLAY=":0"
setsid ssh -L 11122:127.0.0.1:3050 lalal@ssh.tralala.ru sleep INF &
pid=$!
echo "ssh pid=$pid" >> $LOG

sleep INF

Далее в Lazarus
Код: Выделить всё
procedure TMainFrm.Button1Click(Sender: TObject);
begin //запуск скрипта ssh_conn2
AProc:=TProcess.Create(Nil);
AProc.CommandLine:='/home/shop/exec/ssh_conn2';
AProc.Options:=AProc.Options+[poNoConsole];
AProc.Execute;
MainFrm.Caption:=IntToStr(AProc.ProcessID);
end;

procedure TMainFrm.BitOkNewClick(Sender: TObject);
//пытаемся подключиться к БД
begin
ZConnSHH.Connected:=False;
ZConnSHH.Database:='qwert_db';
ZConnSHH.HostName:='localhost';
ZConnSHH.User:='qwert_mysql';
ZConnSHH.Password:='xxxx';
ZConnSHH.Port:=3050;

ZConnSHH.Connected:=True;       
end;             

Результат тот же - Access denied...

ps x
7192 ? S 0:00 /bin/bash /home/shop/ssh_conn2
7195 ? S 0:00 sleep INF

netstat - ln
нет порта 11122 ...
Владимир
постоялец
 
Сообщения: 355
Зарегистрирован: 23.08.2007 19:48:39
Откуда: Москва

Re: Доступ к БД через SSH-туннель

Сообщение MageSlayer » 28.09.2010 20:20:06

Владимир писал(а):Спасибо за терпение.
Есть MySQL сервер на хостинге провайдера, к которому нужно подключиться с помощью клиента на локальной машине.
(на локальной машине также работает MySQL сервер)
Из командной строки запускаю
Код: Выделить всё
#!/bin/bash
# 19.09.2010
export SSH_ASKPASS="/home/volod/ssh_psw"
export DISPLAY=":0"
setsid ssh -L 11122:127.0.0.1:3050 lalal@ssh.tralala.ru

в процессах на локальной машине
4381 pts/8 S+ 0:00 /bin/bash ./ssh_conn1
4382 ? Ss 0:00 ssh -L 11122:127.0.0.1:3050 lalala@ssh.tralala.ru

открывается терминал удаленной машины - я так понимаю, что туннель установлен - могу войти в БД.

Далее в другом терминале на локальной машине
root@azs:/etc/ssh# mysql -h localhost -u lalala_db -pxxxxx -P 3050
ERROR 1045 (28000): Access denied for user 'lalala_db'@'localhost' (using password: YES)
Понятно, что на локальном сервере нет пользователя lalala_db.


Опять та же история.
Код: Выделить всё
setsid ssh -L 11122:127.0.0.1:3050 lalal@ssh.tralala.ru

Здесь 11122 - порт на локальной машине, а 3050 - порт на удаленной. Откуда порт 3050 взялся? Это в моем скрипте 3050 (порт базы Firebird), а вашем случае скорее всего 3306. У вас на удаленном сервере ssh.tralala.ru mysql висит на порту 3306? Раз так, то указан должен быть 3306.

Значит:
- в скрипте установки коннекта:
Код: Выделить всё
setsid ssh -L 11122:localhost:3306 lalal@ssh.tralala.ru sleep INF

- строка коннекта должна быть:
Код: Выделить всё
root@azs:/etc/ssh# mysql -h localhost -u lalala_db -pxxxxx -P 11122


Владимир писал(а):Добавлено спустя 5 часов 34 минуты 54 секунды:
Касаемо Вашего скрипта ssh_conn2
Код: Выделить всё
#!/bin/bash
# 26.09.2010

LOG=ssh.log
rm $LOG
trap bashtrap 0

bashtrap()
{
echo "ssh kill started at" >> $LOG
date >> $LOG
kill -9 $pid
echo "Amen" >> $LOG
}
export SSH_ASKPASS="/home/volod/ssh_psw"
export DISPLAY=":0"
setsid ssh -L 11122:127.0.0.1:3050 lalal@ssh.tralala.ru sleep INF &
pid=$!
echo "ssh pid=$pid" >> $LOG

sleep INF

Далее в Lazarus
Код: Выделить всё
procedure TMainFrm.Button1Click(Sender: TObject);
begin //запуск скрипта ssh_conn2
AProc:=TProcess.Create(Nil);
AProc.CommandLine:='/home/shop/exec/ssh_conn2';
AProc.Options:=AProc.Options+[poNoConsole];
AProc.Execute;
MainFrm.Caption:=IntToStr(AProc.ProcessID);
end;

procedure TMainFrm.BitOkNewClick(Sender: TObject);
//пытаемся подключиться к БД
begin
ZConnSHH.Connected:=False;
ZConnSHH.Database:='qwert_db';
ZConnSHH.HostName:='localhost';
ZConnSHH.User:='qwert_mysql';
ZConnSHH.Password:='xxxx';
ZConnSHH.Port:=3050;

ZConnSHH.Connected:=True;       
end;             

Результат тот же - Access denied...

ps x
7192 ? S 0:00 /bin/bash /home/shop/ssh_conn2
7195 ? S 0:00 sleep INF

netstat - ln
нет порта 11122 ...


Надо поправить:
Код: Выделить всё
...
setsid ssh -L 11122:127.0.0.1:3306 lalal@ssh.tralala.ru sleep INF &
...
ZConnSHH.Port:=11122;
...

Детали были выше.
MageSlayer
постоялец
 
Сообщения: 216
Зарегистрирован: 07.09.2006 12:30:44

Re: Доступ к БД через SSH-туннель

Сообщение Владимир » 29.09.2010 18:21:11

Доброго!
Поправил. Ваш скрипт как-то странно работает, во всяком случае в netstat -lvn порта 11122 нет. Переменная INF не объявлена/не определена - поставил вместо нее 10 - после запуска в течение 10 с в процессах вижу строку проброса порта, потом она (строка) исчезает.
Запускаю свой (ssh_conn1), порт 11122 в listen есть.
Далее запускаю mysql --port=11122 -u user -pxxxxx tralala_db,
получаю привычное Access denied for user....
Запускаю mysql --protocol=TCP --port=11122 -u user -pxxxxx tralala_db - якобы идет процесс соединения, но ничем не заканчивается, висит и висит.
Грустно.
Владимир
постоялец
 
Сообщения: 355
Зарегистрирован: 23.08.2007 19:48:39
Откуда: Москва

Пред.

Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: Google [Bot] и гости: 9

Рейтинг@Mail.ru