|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Модуль для работы с протоколом 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
|
|||
|
|||
Это, например:
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 клиент рабочий
|