![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
|
Здравствуйте!
Нужно написать модуль для Delphi 2010 для реализации подключения к оборудованию по протоколу SSH. Подключение по логину и паролю без использования ключей. Схема работы: 1. Подключение к оборудованию. 2. Отправка команды (текста). 3. Получение данных. 4. Отключение. Команда одна строчка или несколько, результат может иметь достаточно большой размер, в редких случаях и более 100 тысяч символов. Если есть возможность, то многопоточную реализацию для обработки большого количества устройств за раз. В общих чертах нужны следующие процедуры и функции: Connect с указанием IP адреса, номера порта, логина с паролем, в ответ результат True если удалось подключиться. Send с указанием в качестве данных типа TStrings или String, в зависимости от размера запроса. Get в ответе которой будут все полученные данные типа TStrings. Disconnect по которому связь будет завершаться. Во время работы может выполняться несколько чередующихся между собой Send - Get, либо просто Send, а результат выполнения не требуется. Если есть возможность, то еще добавить и многопоточный Ping по IP адресу. Последний раз редактировалось Trotillo, 05.02.2016 в 14:45. |
|
#2
|
|||
|
|||
|
Это, например:
http://leonardorame.blogspot.com/201...sh-client.html И вот это еще: http://www.pascalgamedevelopment.com...ple-connection Последний раз редактировалось lmikle, 04.02.2016 в 20:11. |
|
#3
|
|||
|
|||
|
[quote=lmikle]Это, например:
http://leonardorame.blogspot.com/201...sh-client.html По этому примеру подключение по SSH происходит к оборудованию, но, например, если имя администратора "admin", то на оборудование идет попытка связи с именем "a d m" и естественно не пускают. Если сделать имя администратора просто "A", то все равно не пускает, видимо и пароль подставляется с такими же ошибками, если указать пустой пароль то тоже соединения нет. Работу программы проследил, нигде не нашел, что бы какое-то действие производилось с этими данными - они несколько раз переприсваиваются другим переменным и уходят в вызываемую библиотеку. Так же не понятно зачем этому synapse клиенту столько различных файлов. У меня есть другой вариант на базе DelphiCryptlib и cryptlib, которые вызывают функции из файла cl32.dll, более того, все даже работает, можно подключиться к устройству, отправить команду и получить ответ. Только проблема в том, что ответ программа ждет время, указанное в константах этих модулей, и если данные задержатся, то будут обрезаны. Кроме всего иногда данные приходят с мусором, или приходят совсем другие, как будто в буфере где-то затерялись. То есть для практического применения не годится. Код:
cryptInit;
SSH := SSH_Client('192.168.0.1', 'admin', '12345');
if SSH = nil then
Exit;
Form1.Memo1.Lines.Add('Ok create SSH');
SleepX(100);
SSH.FlushData; // из доки понял, что обязателен вызов перед использованием PopData
SleepX(100);
LenData := 10000;
BytePoped := SSH.PopData(addr(Data), LenData);
Form1.Memo1.Lines.Add(Data); // тут приветствие читаем
Form1.Memo1.Lines.Add(IntToStr(BytePoped));
Form1.Memo1.Lines.Add('------ОТПРАВЛЯЕМ КОМАНДУ--------');
Data := '/export compact'#13#10;
LenData := 20;
SSH.PushData(addr(Data), LenData, BytePushed);
Form1.Memo1.Lines.Add(IntToStr(BytePushed));
SleepX(1000);
Form1.Memo1.Lines.Add('------ПОЛУЧАЕМ ОТВЕТ--------');
SSH.FlushData;
Form1.Memo1.Lines.Add('------БЕРЕМ ДАННЫЕ--------');
SleepX(500);
LenData := 10000;
BytePoped := SSH.PopData(addr(Data), LenData);
Form1.Memo1.Lines.Add(Data);
Form1.Memo1.Lines.Add(IntToStr(BytePoped));
FreeAndNil(SSH); // закругляемся
cryptEnd;Последний раз редактировалось Trotillo, 05.02.2016 в 00:48. |
|
#4
|
|||
|
|||
|
Есть подозрение на очередные грабли с юникодом. В приведенных примерах вместо String укажи везде AnsiString и попробуй.
|
|
#5
|
|||
|
|||
|
Там и так практически у всех текстовых типов стоит ansistring, однако все равно имя пользователя уходит не верно.
|
|
#6
|
|||
|
|||
|
Значит сам синапс у тебя не юникодный (этот код "сидит" поверх синапса). Кстати, какая версия дельфей?
|
|
#7
|
|||
|
|||
|
Версия 2010.
Заменил везде не только string но и char на юникодовые соответствия. Теперь подключение к серверу происходит и можно получить приглашение. Однако команда на него не отправляется. То есть пишу lSSh.SendCommand указываю команду, далее lSSh.ReceiveData и пусто. Если сначала приглашение не читать а отправить команду, и только потом прочитать данные, то отправленная строка появляется в ответе команды на чтение, однако на оборудование она не передается. Если написать рядом большое количество команд на отправку, а после несколько раз прочитать - все пусто. Символы конца строки и прочее не влияют. Последний раз редактировалось Trotillo, 08.02.2016 в 01:16. |
|
#8
|
|||
|
|||
|
надо смотреть. Скорее всего ты просто теряешь ответ, т.к. он должен тут же приходить в ответ на комманду.
|
|
#9
|
|||
|
|||
|
Я не знаю каким образом в синапсе реализована работа с SSH, но в DelphiCryptoLib, можно было отправить хоть 10 команд, а потом одним чтением получить сразу все ответы.
На просторах интернета есть несколько тем про клиент SSH, в некоторых указано что проблему решили, однако никакой более полной информации там не предоставлено. Если у кого-то есть готовое решение, или кто может помочь в реализации этой затеи - отблагодарю. |
|
#10
|
|||
|
|||
|
нужен ssh клиент рабочий
|