Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Интернет и сети
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 04.02.2016, 15:07
Trotillo Trotillo вне форума
Прохожий
 
Регистрация: 04.02.2016
Сообщения: 5
Версия Delphi: Delphi 2010
Репутация: 10
Радость Модуль для работы с протоколом SSH, за финансовое вознаграждение.

Здравствуйте!

Нужно написать модуль для 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  
Старый 04.02.2016, 20:06
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,003
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Это, например:
http://leonardorame.blogspot.com/201...sh-client.html

И вот это еще:
http://www.pascalgamedevelopment.com...ple-connection

Последний раз редактировалось lmikle, 04.02.2016 в 20:11.
Ответить с цитированием
  #3  
Старый 05.02.2016, 00:45
Trotillo Trotillo вне форума
Прохожий
 
Регистрация: 04.02.2016
Сообщения: 5
Версия Delphi: Delphi 2010
Репутация: 10
По умолчанию

[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  
Старый 06.02.2016, 05:33
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,003
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Есть подозрение на очередные грабли с юникодом. В приведенных примерах вместо String укажи везде AnsiString и попробуй.
Ответить с цитированием
  #5  
Старый 06.02.2016, 18:28
Trotillo Trotillo вне форума
Прохожий
 
Регистрация: 04.02.2016
Сообщения: 5
Версия Delphi: Delphi 2010
Репутация: 10
По умолчанию

Там и так практически у всех текстовых типов стоит ansistring, однако все равно имя пользователя уходит не верно.
Ответить с цитированием
  #6  
Старый 07.02.2016, 02:33
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,003
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Значит сам синапс у тебя не юникодный (этот код "сидит" поверх синапса). Кстати, какая версия дельфей?
Ответить с цитированием
  #7  
Старый 07.02.2016, 23:44
Trotillo Trotillo вне форума
Прохожий
 
Регистрация: 04.02.2016
Сообщения: 5
Версия Delphi: Delphi 2010
Репутация: 10
По умолчанию

Версия 2010.

Заменил везде не только string но и char на юникодовые соответствия. Теперь подключение к серверу происходит и можно получить приглашение. Однако команда на него не отправляется.

То есть пишу lSSh.SendCommand указываю команду, далее lSSh.ReceiveData и пусто. Если сначала приглашение не читать а отправить команду, и только потом прочитать данные, то отправленная строка появляется в ответе команды на чтение, однако на оборудование она не передается. Если написать рядом большое количество команд на отправку, а после несколько раз прочитать - все пусто. Символы конца строки и прочее не влияют.

Последний раз редактировалось Trotillo, 08.02.2016 в 01:16.
Ответить с цитированием
  #8  
Старый 08.02.2016, 03:14
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,003
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

надо смотреть. Скорее всего ты просто теряешь ответ, т.к. он должен тут же приходить в ответ на комманду.
Ответить с цитированием
  #9  
Старый 08.02.2016, 10:42
Trotillo Trotillo вне форума
Прохожий
 
Регистрация: 04.02.2016
Сообщения: 5
Версия Delphi: Delphi 2010
Репутация: 10
По умолчанию

Я не знаю каким образом в синапсе реализована работа с SSH, но в DelphiCryptoLib, можно было отправить хоть 10 команд, а потом одним чтением получить сразу все ответы.

На просторах интернета есть несколько тем про клиент SSH, в некоторых указано что проблему решили, однако никакой более полной информации там не предоставлено.

Если у кого-то есть готовое решение, или кто может помочь в реализации этой затеи - отблагодарю.
Ответить с цитированием
  #10  
Старый 30.01.2017, 04:22
nubik nubik вне форума
Прохожий
 
Регистрация: 06.09.2014
Сообщения: 4
Версия Delphi: Delphi XE
Репутация: 10
По умолчанию готов тоже благодарить

нужен ssh клиент рабочий
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 12:13.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter