Имя: Пароль:
1C
1С v8
PuTTY. Как использовать из 1С?
,
0 cube033
 
16.04.13
08:31
День добрый. Стоит задача - наполнить БД сайта данными из 1С.
База сайта лежит на masterhost.ru (uХХХХХХ.mysql.masterhost.ru)
Как следует из названия темы - masterhost.ru защищен от подключения извне: "В целях безопасности прямой доступ к серверам MySQL из интернета закрыт (исключение составляет ssh-туннель)" и они советуют PuTTy и даже приводят настройки (http://masterhost.ru/support/doc/mysql/).
Подключение готово - авторизацию проходит. Запуск с ключами работает. А что дальше? Открывается окно консоли с приглашением удаленного сервера.
Вдохновившись подобными темами на Мисте родился такой код:


ЗапуститьПриложение("""C:\хххх\PuTTY-0.62-RU-9\putty.org.ru\PuTTY\PuTTY.exe"" -load хххх -l uХХХХХХ -pw хххх");
ConString = "Driver={MySQL ODBC 3.51 Driver};SERVER=uХХХХХХ.mysql.masterhost.ru;Port=22;Database=uХХХХХХ_newgard;Uid=uХХХХХХ_1c;PWD=хххххх;";


Остальной код естественно присутствует, но не принципиален. При выполнении кода опять же открывается окно консоли, проходит авторизация. Тем временем 1С пытается подключиться.
Ошибка:
"{Форма.Форма(17)}: Ошибка при вызове метода контекста (Open): Произошла исключительная ситуация (Microsoft OLE DB Provider for ODBC Drivers): [MySQL][ODBC 3.51 Driver]Can't connect to MySQL server on 'uХХХХХХ.mysql.masterhost.ru' (10013)" 10013 - касается прав/разрешений.
При попытке подключится на любой другой порт (либо 22, либо в PuTTY указать локальный порт не 3306, а любой другой и пробовать подключится к нему) ошибка (10060) - касается свойств подключения.
Подскажите пожалуйста - в какую сторону думать? Как связать PuTTY и 1С?
1 cube033
 
16.04.13
08:33
В ConString - Port=3306. Скопировал не ту строку.
2 mikecool
 
16.04.13
08:33
копай в сторону командной строки пути...
но все равно - изврат
3 vde69
 
16.04.13
08:39
при подключению к мускулю с разношерстными правами следует использовать префиксое имя базы
[DBA][ИмяБазы]

и в  последствии во всех запросах следует явно указывать
[DBA][ИмяБазы][ИмяТаблицы]

я на выяснение сего факта потратил уйму времени, нигде не описано...
4 shuhard
 
16.04.13
08:39
(0)[Как связать PuTTY и 1С?]
их не надо связывать
1С работает с СУБД через ADODB
ADODB пофиг есть туннель или нет
5 mikecool
 
16.04.13
08:40
(3) ой ли нигде не описано? открой справку по т-скл - в описании синтаксиса все есть
6 mikecool
 
16.04.13
08:41
+5 если бы пришлось писать запросы к другим инстансам - столкнулся бы сразу
7 shuhard
 
16.04.13
08:42
(5) а каким боком Т-SQL связан с MySQL ?
8 vde69
 
16.04.13
08:43
(5) ну это было лет 12 назад, сам допер методом тыка, а понял ПОЧЕМУ так уже сильно потом :)
9 Klesk
 
16.04.13
08:44
(0) задумайтесь об обмене через ftp или http
иначе это и правда изврат
10 mikecool
 
16.04.13
08:49
(7) а чо, не связаны? синтаксис то один и тотже в декларировании декста запроса, просто скуль выдает некие поблажки
11 mikecool
 
16.04.13
08:49
текста*
12 shuhard
 
16.04.13
08:51
(10) это не так, совсем
13 mikecool
 
16.04.13
08:53
(12) наверное... но описанги таблицы для выборки одинаково [DBA][ИмяБазы][ИмяТаблицы] везде
14 cube033
 
16.04.13
08:53
(4)
Так оно и было изначально

Connection = Новый COMОбъект("ADODB.Connection");
Connection.CommandTimeOut= 30;
Connection.Open(ConString);

и так впервые появилась ошибка 10013

Я подсматриваю способ в т.ч. из готового проекта, который на данный момент заброшен и не работает, и там в папочке я и нашел ПуТТи, проблема в том, что я так и не знаю - добились ли люди, у которых я подсматриваю метод, результата.

Я общаюсь с разработчиками искомого сайта, которые в свою очередь общаются с хостером БД. И вот ответ от МастерХост: "Да, похоже и правда прийдётся использовать PuTTY, доступ возможен только через ssh-туннель"
15 cube033
 
16.04.13
08:55
Точнее это ответ разработчика сайта
16 ЧашкаЧая
 
16.04.13
08:59
Нужно создать ssh-тунель к базе посредством putty, гуглится на раз. ADO не может знать как подключиться через ssh.
17 mistеr
 
16.04.13
09:05
(0) Для того, чтобы подключаться через ssh туннель, сначала нужно его поднять. Для этого используется plink, а PuTTY для интерактивной работы. Как создавать туннели расписано в доке к PuTTY. То есть схема такая.

1. Сначала запускаем что-то типа

plink -i файл_с_ключем -L 3306:localhost:3306 uХХХХХХ@uХХХХХХ.mysql.masterhost.ru

2. Ждем немного, убеждаемся, что процесс не завершился быстро с ошибкой.

3. Ломимся через ADO на localhost:3309
18 mistеr
 
16.04.13
09:06
(17) 3309->3306
19 cube033
 
16.04.13
09:11
(16)
"Нужно создать ssh-тунель к базе посредством putty"
Что еще для этого нужно, кроме того что описано в (0)?

(17)
"а PuTTY для интерактивной работы" -т.е. ответ на заголовок темы - НИКАК?
Судя по этой схеме PuTTY вообще не причем.
20 cube033
 
16.04.13
09:14
(16) Всмысле - подключение настроено, окно консоли открыто, логин/пароль введены, авторизация успешна, надпись Welcome!, строка приглашение. [uхххххх@gen44 ~]$

На этот момент туннель не создан?
21 mistеr
 
16.04.13
09:23
(19) ОК, немного ликбеза.
1. plink это утилита из состава PuTTY (продукт), она для батников и автоматизации. putty другая утилита из состава PuTTY, она для интерактива.

2. SSH сервер может предоставлять несколько сервисов, вообще говоря друг с другом не связанных. Такие как:
* консоль с шеллом
* туннели
* SFTP
Тебе для твоей задачи нужен только один туннель. для этого plink подходит лучше. Но туннель можно создать и c putty, если очень хочется.
22 cube033
 
16.04.13
09:26
Спасибо. Ликбез и правда нужен. Пробую.
23 cube033
 
16.04.13
09:34
Параметры запуска Plink.exe  плохо гуглятся, можете подсказать или дать ссылку?
24 mistеr
 
16.04.13
10:13
(23) http://the.earth.li/~sgtatham/putty/0.62/htmldoc/Chapter7.html#plink

Ключевые - те же, что и у putty.
Можно все отладить с putty (тут же консоль, удобно смотреть логи мускула), а потом заменить на plink.
25 cube033
 
16.04.13
11:22
Спасибо.
26 cube033
 
16.04.13
11:57
ЗапуститьПриложение("""C:\xxxx\PuTTY\plink.exe""-load Sadovod -l xxxxxx -pw xxxxxxx");
ConString = "Driver={MySQL ODBC 3.51 Driver};SERVER=xxxxxx.mysql.masterhost.ru;Port=3036;Database=uxxxxxx_newgard;Uid=uxxxxx_1c;PWD=xxxxxxx;";
Connection = Новый COMОбъект("ADODB.Connection");
Connection.CommandTimeOut= 30;
Connection.Open(ConString);



plink.exe работает точно также, как PuTTY.exe с параметрами.
То же самое окно консоли. Та же самая ошибка. Ничего принципиально нового не увидел.
А главное - как происходит взаимодействие? По какому принципу?
После запуска правильно настроенного ПуТТИ - Моя ОС - слушает обращение к 3306 (или другому указанному) и перенаправляет его на указанный сервер?
27 mistеr
 
16.04.13
12:21
Мда, шаг 2 ты конечно пропустил. И в шаге 3 напутал.

>То же самое окно консоли.
Добавь ключ -N

>как происходит взаимодействие?
После создания туннеля plink/putty слушает указанный порт на клиенте, и весь трафик пересылает через туннель на указанные хост/порт. В резульате для 1С все выглядит так, как будто MySQL работает на этой же машине, на localhost:3306.
Теперь сам догадайся, что нужно вписать в ConString.
28 cube033
 
16.04.13
12:57
-N приводит к тому, что открывается то самое окно - просто дальше вывода логина дело не идет.

"Шаг 2 пропустил" - если речь идет о -ssh, то -load Sadovod загружает сессию, в которой указано, что SSH подключение по 22 порту к серверу xxxx.ssh.masterhost.ru, а в разделе туннели говорится ,что локальный порт 3306, Назначение uхххххх.mysql.masterhost.ru:3306.

Не представляю, что можно дописать в ConString...............
............................................................
Включил мозг и перечитал (27). Теперь представляю))) Спасибо все заработало!!!!!!



ConString = "Driver={MySQL ODBC 3.51 Driver};SERVER=localhost;Port=3306;Database=uхххх_newgard;Uid=uххххх_1c;PWD=ххххххх;";
29 cube033
 
19.04.13
09:39
Всё отлично работает - только не могу решить последнюю проблему. Кто сталкивался с plink.exe - подскажите как её запустить в свернутом режиме или вообще без окна)
-N не помогает. Окно открывается, авторизация не происходит либо не отображается.

Или может у 1С есть параметр - запуск приложения в свернутом состоянии?
30 SanGvin
 
19.04.13
10:03
(14) зря подсматриваешь там, г-код, зарисовка так сказать))
(29)
WSHShell = Новый COMОбъект("WScript.Shell");
WSHShell.Run("твое творчество",0);
31 cube033
 
19.04.13
13:44
(30) Спасибо. Тоже нашел этот способ, только у меня:
WSHShell.Run("твое творчество",7,0);

Теперь думаю над Terminate.

Приложение = WSHShell.Run("твое творчество",7,0);
Приложение.Terminate();

- не работает. Без скобок тоже не работает.
32 Абырвалг
 
19.04.13
13:45
ws вам помогут
33 cube033
 
19.04.13
14:01
(31) такой способ обречен, ибо тип переменной "Приложение" - число. В мануалах с терминатором используют открытие через Exec, а не Run.
Но Exec - не позволяет запустить в свернутом состоянии.
Надо искать дальше.
34 cube033
 
19.04.13
14:28
Да блин, что же за напасть?!
Уже согласился на Exec, пусть окошко консоли появляется, а потом закрывается. Так ведь Exec не поддерживает запуск с параметрами! Может кто знает лекарство от моей беды?
35 SanGvin
 
20.04.13
08:56
(34) эм... а
taskkill /im plink.exe
потом вызывать религия не позволяет? или это не подходит?
36 Ковычки
 
20.04.13
09:20
putty -L 33306:uХХХХХХ.mysql.masterhost.ru:3306 усер@uХХХХХХ.mysql.masterhost.ru -pw пароль -N


Driver={MySQL ODBC 3.51 Driver};SERVER=127.0.0.1;Port=33306;Database=uХХХХХХ_newgard;Uid=uХХХХХХ_1c;PWD=хххххх
37 Ковычки
 
20.04.13
10:05

Процедура КнопкаВыполнитьНажатие(Кнопка)
   // Вставить содержимое обработчика.
   ШелСкрипт = Новый COMОбъект("WScript.Shell");
   Хост = "ТвойХост";
   ПортЛокальный = ТвойПорт;
   ПортУдаленный = ИхУнутреннийПорт;
   Пользователь = "ТвойИхПользователь";
   Пароль = "ПарольТвоегоИхогоПользователя";
   Пути = "%programfiles%\putty\putty.exe";
   КоманднаяСтрока = Пути + " -L " + ПортЛокальный + ":" + Хост + ":" + ПортУдаленный + " " + Пользователь + "@" + Хост + " -pw " + Пароль + " -N";
   КоманднаяСтрока=ШелСкрипт.ExpandEnvironmentStrings(КоманднаяСтрока);
   Сообщить(КоманднаяСтрока);
   Казать = Ложь;
   Сервис = ПолучитьCOMОбъект("winmgmts:\\.\Root\CIMV2");
   Процессы = Сервис.Get("Win32_Process");
   ЗанускПроцесса = Сервис.Get("Win32_ProcessStartup");
   Конфигурация = ЗанускПроцесса.SpawnInstance_();
   Конфигурация.ShowWindow = ?(Казать,10,0);
   
   ГСЧ = Новый ГенераторСлучайныхЧисел(255);
   Заголовок = "Тонель тут " + ГСЧ.СлучайноеЧисло(0, 10000);
   Конфигурация.Title = Заголовок;

   ВходныеПараметры = Процессы.Methods_("Create").InParameters.SpawnInstance_();
   ВходныеПараметры.CommandLine = КоманднаяСтрока;
   ВходныеПараметры.CurrentDirectory = КаталогВременныхФайлов();
   ВходныеПараметры.Properties_.Item("ProcessStartupInformation").Value = Конфигурация;
   ВыходныеПараметры = Сервис.ExecMethod("Win32_Process", "Create", ВходныеПараметры);
   ПроцессИД = Формат(ВыходныеПараметры.ProcessId,"ЧВН=; ЧДЦ=0; ЧГ=0");
   Сообщить(ПроцессИД);
   Предупреждение("Тонель закроется через несколько времен...",30,"Тонель закроется через несколько времен...");
   Сервис.Get("Win32_Process.Handle='" + ПроцессИД + "'").Terminate();
КонецПроцедуры
38 Ковычки
 
20.04.13
12:07

ШелСкрипт = Новый COMОбъект("WScript.Shell");
Хост = "ТвойИхХост";
ПортЛокальный = ТвойПорт;
ПортУдаленный = ИхУнутреннийПорт;
Пользователь = "ТвойИхПользователь";
Пароль = "ПарольТвоегоИхогоПользователя";
Пути = "%programfiles%\putty\plink.exe";
Интерпритатор = "%comspec% /c ";
КоманднаяСтрока = """" + Пути + """ -L " + ПортЛокальный + ":" + Хост + ":" + ПортУдаленный + " " + Пользователь + "@" + Хост + " -pw " + Пароль + " ""mkfifo ~/tunnel.pid; echo $$ > ~/tunnel.pid; read;""";
КоманднаяСтрока=ШелСкрипт.ExpandEnvironmentStrings(КоманднаяСтрока);
ШелСкрипт.Run(КоманднаяСтрока,0,Ложь);
Предупреждение("Тонель закроется через несколько времен...",30,"Тонель закроется через несколько времен...");
КоманднаяСтрока = """" + Пути + """ " + Пользователь + "@" + Хост + " -pw " + Пароль + " ""kill -9 `cat ~/tunnel.pid`; sleep 1;""";
КоманднаяСтрока=ШелСкрипт.ExpandEnvironmentStrings(КоманднаяСтрока);
Сообщить(КоманднаяСтрока);
ШелСкрипт.Run(КоманднаяСтрока,0,Истина);
39 cube033
 
23.04.13
14:54
(38) Спасибо огромное!
Не понимаю каким образом это работает, но это работает.
У меня это в разных процедурах и покомпактнее.

ЗапускТуннеля

ШелСкрипт = Новый COMОбъект("WScript.Shell");
КоманднаяСтрока = """C:\...\PuTTY\plink.exe"" -load Sadovod -l ххх -pw ххх ""mkfifo ~/tunnel.pid; echo $$ > ~/tunnel.pid; read;""";
КоманднаяСтрока=ШелСкрипт.ExpandEnvironmentStrings(КоманднаяСтрока);
ШелСкрипт.Run(КоманднаяСтрока,0,Ложь);

УбитьТоннель

ШелСкрипт = Новый COMОбъект("WScript.Shell");
КоманднаяСтрока = """C:\...\PuTTY\plink.exe"" -load Sadovod -l ххх -pw ххх ""kill -9 `cat ~/tunnel.pid`; sleep 1;""";
КоманднаяСтрока=ШелСкрипт.ExpandEnvironmentStrings(КоманднаяСтрока);
ШелСкрипт.Run(КоманднаяСтрока,0,Истина);
40 lavrov
 
23.04.13
15:00
Специально для мастер хоста.
функция ПодключитьSSH() экспорт
   ПутьPytty=ПолучитьИмяВременногоФайла("exe");
   ПутьФайлу=Новый Файл (ПутьPytty);
   макет=ПолучитьОбщийМакет("putty");
   макет.Записать(ПутьPytty);
   Если  ПутьФайлу.Существует() Тогда
       ИмяСкрипта=ПолучитьИмяВременногоФайла("vbs");
       Скрипт = Новый ЗаписьТекста(ИмяСкрипта, КодировкаТекста.ANSI);  
       СтрокаВыполнения="  
       | File = """+ПутьPytty+"""
       |";
       СтрокаВыполнения=СтрокаВыполнения+"
       | Set ws = Wscript.CreateObject(""Wscript.Shell"")
       | CommandString = """""""" &File& """""" -ssh -l uххххххх -pw пароль -L 3306:хххххх.mysql.masterhost.ru:3306 u333431.ssh.masterhost.ru ""  
       | 'MsgBox (CommandString)
       |  Return = ws.Run(CommandString, 1, TRUE)
       |
       |";
       //
       Скрипт.Записать(СтрокаВыполнения);
       //
       Скрипт.Закрыть();
       
       cmdLine="wscript.exe "+ИмяСкрипта;
       
       WshShell = Новый COMОбъект("WScript.Shell");
       Попытка
           WshShell.Run(cmdLine, 0, "False");
       исключение
       КонецПопытки;
       Общий.ПаузаВыполения(5);
       попытка
           УдалитьФайлы(ИмяСкрипта);
       исключение
       КонецПопытки;

   иначе
       Сообщить("Программма putty не найдена");
       
   КонецЕсли;
   возврат ПутьФайлу;
КонецФункции    

функция ОтключитьSSH(ПутьКФайлу) экспорт
   ИмяСкрипта=ПолучитьИмяВременногоФайла("vbs");
   Скрипт = Новый ЗаписьТекста(ИмяСкрипта, КодировкаТекста.ANSI);  
   СтрокаВыполнения="  
   | File = """+ПутьКФайлу.Имя+"""
   |";
   СтрокаВыполнения=СтрокаВыполнения+"
   | Set ws = Wscript.CreateObject(""Wscript.Shell"")
   | CommandString = ""taskkill /F /IM """""" &File& """"""""  
   | 'MsgBox (CommandString)
   |  Return = ws.Run(CommandString, 1, TRUE)
   |
   |";
   //
   Скрипт.Записать(СтрокаВыполнения);
   //
   Скрипт.Закрыть();
   
   cmdLine="wscript.exe "+ИмяСкрипта;
   
   WshShell = Новый COMОбъект("WScript.Shell");
   Попытка
       WshShell.Run(cmdLine, 0, "False");
   исключение
   КонецПопытки;
   Общий.ПаузаВыполения(3);
   попытка
       УдалитьФайлы(ПутьКФайлу.ПолноеИмя);
       УдалитьФайлы(ИмяСкрипта);

   исключение
   КонецПопытки;
КонецФункции
41 cube033
 
13.05.13
10:31
Подскажите пожалуйста примерчик или толковое описание параметров запуска plink.exe

пробую из cmd.exe

Говорит:
Фатальная ошибка: Server refused to start a shell/command

Вот строка: ""C:\ххх\plink.exe"" -ssh -L 3306:uххххх.ssh.masterhost.ru:3306 uххххх@uххххх.ssh.masterhost.ru -pw хххххх

Как я понимаю эту строку. Открой программу plink.exe, используй ssh протокол, перенаправляй все обращения на локальный порт 3306 по адресу ssh хоста на 3306 порт. а конструкцию ххх@xxx не совсем понимаю, да и неважно - я пробовал и ssh и mysql хост, ошибка где-то в другом месте

Еще иногда говорит: ?°шсър ёхЄш: ?Ёхь  юцшфрэш  ёюхфшэхэш  шёЄхъыю - но тут я его совсем понимаю.
42 mistеr
 
13.05.13
16:47
(41) "Server refused" ни на что не намекает? Сервер не дает тебе шелл. Тебе он и не нужен, поэтому не надо просить. Не просить шелл это ключ -N, я давно про него сказал, а ты проигнорил.

>конструкцию ххх@xxx не совсем понимаю.
Это есть в любом описании, даже самом бестолковом. Даже если просто запустсть plink, оно сразу выскакивает. Делаю вывод, что ты и не пытался читать.
43 cube033
 
14.05.13
08:14
(42) Серьезно, сколько раз я писал про то что пробовал -N и не к чему полезному это не приводило?

Про конструкцию ххх@xxx действительно есть в каждом описании (которых я прочитал больше 10) как "параметры подключения".
Вопрос в том что мне нужно подключиться к SSH серверу для тоннеля и mysql серверу для обращения к базе, поэтому и не понимаю какой сервер указывать именно в этой конструкции. Немного запутал (38), так как там Дважды указывается "Хост" как одна переменная. Копания в интерфейсе Путти привели меня к выводу что для -L указывается mysql хост, а для конструкции xxx@xxx - ssh хост.

Про "Server refused" мне намекает, что сервер мне отказал, но не намекает на причину. Ошибка возникает даже при подключении из интерфейса Путти, такого раньше не было.
А все дело в том что сервер загружен, так как в данный момент выполняется моя обработка,которая выбгружает все изображения из базы (базе 6 лет) на FTP, делая preview и записывая инфу в БД сайта. Рассчетное время выполнение обработки - 25 часов.