Вход | Регистрация
 
1С:Предприятие :: 1С:Предприятие 8 общая

PuTTY. Как использовать из 1С?

PuTTY. Как использовать из 1С?
Я
   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С?
   cube033
 
1 - 16.04.13 - 08:33
В ConString - Port=3306. Скопировал не ту строку.
   mikecool
 
2 - 16.04.13 - 08:33
копай в сторону командной строки пути...
но все равно - изврат
   vde69
 
3 - 16.04.13 - 08:39
при подключению к мускулю с разношерстными правами следует использовать префиксое имя базы
[DBA][ИмяБазы]

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

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

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

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

Я общаюсь с разработчиками искомого сайта, которые в свою очередь общаются с хостером БД. И вот ответ от МастерХост: "Да, похоже и правда прийдётся использовать PuTTY, доступ возможен только через ssh-туннель"
   cube033
 
15 - 16.04.13 - 08:55
Точнее это ответ разработчика сайта
   ЧашкаЧая
 
16 - 16.04.13 - 08:59
Нужно создать ssh-тунель к базе посредством putty, гуглится на раз. ADO не может знать как подключиться через ssh.
   mistеr
 
17 - 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
   mistеr
 
18 - 16.04.13 - 09:06
(17) 3309->3306
   cube033
 
19 - 16.04.13 - 09:11
(16)
"Нужно создать ssh-тунель к базе посредством putty"
Что еще для этого нужно, кроме того что описано в (0)?

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

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

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

Ключевые - те же, что и у putty.
Можно все отладить с putty (тут же консоль, удобно смотреть логи мускула), а потом заменить на plink.
   cube033
 
25 - 16.04.13 - 11:22
Спасибо.
   cube033
 
26 - 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 (или другому указанному) и перенаправляет его на указанный сервер?
   mistеr
 
27 - 16.04.13 - 12:21
Мда, шаг 2 ты конечно пропустил. И в шаге 3 напутал.

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

>как происходит взаимодействие?
После создания туннеля plink/putty слушает указанный порт на клиенте, и весь трафик пересылает через туннель на указанные хост/порт. В резульате для 1С все выглядит так, как будто MySQL работает на этой же машине, на localhost:3306.
Теперь сам догадайся, что нужно вписать в ConString.
   cube033
 
28 - 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=ххххххх;";
   cube033
 
29 - 19.04.13 - 09:39
Всё отлично работает - только не могу решить последнюю проблему. Кто сталкивался с plink.exe - подскажите как её запустить в свернутом режиме или вообще без окна)
-N не помогает. Окно открывается, авторизация не происходит либо не отображается.

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

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

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

- не работает. Без скобок тоже не работает.
   Абырвалг
 
32 - 19.04.13 - 13:45
ws вам помогут
   cube033
 
33 - 19.04.13 - 14:01
(31) такой способ обречен, ибо тип переменной "Приложение" - число. В мануалах с терминатором используют открытие через Exec, а не Run.
Но Exec - не позволяет запустить в свернутом состоянии.
Надо искать дальше.
   cube033
 
34 - 19.04.13 - 14:28
Да блин, что же за напасть?!
Уже согласился на Exec, пусть окошко консоли появляется, а потом закрывается. Так ведь Exec не поддерживает запуск с параметрами! Может кто знает лекарство от моей беды?
   SanGvin
 
35 - 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,Истина);

   cube033
 
39 - 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,Истина);
   lavrov
 
40 - 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);
    попытка
        УдалитьФайлы(ПутьКФайлу.ПолноеИмя);
        УдалитьФайлы(ИмяСкрипта);

    исключение
    КонецПопытки;
КонецФункции
   cube033
 
41 - 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 хост, ошибка где-то в другом месте

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

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

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

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


Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Тема не обновлялась длительное время, и была помечена как архивная. Добавление сообщений невозможно.
Но вы можете создать новую ветку и вам обязательно ответят!
Каждый час на Волшебном форуме бывает более 2000 человек.