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

Delphi Sources



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

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 31.03.2013, 14:54
darchken darchken вне форума
Прохожий
 
Регистрация: 31.03.2013
Сообщения: 29
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию ввод/вывод командной строки в мемо

Всем привет!

Имеется программа для формирования команд для телнет. Сейчас она работает так: выбираешь сервер телнет, вводишь данные, программа формирует команды типа:

telnet server
login
pass
comand
comand
comand
comand
...

, все это копируется и вставляется в командную строку и все там выполняется. Хотелось бы сделать чтобы он все это выполнял также в командной строке но отображал в мемо.
Так как начинающий програмер, смотрел примеры по работе с командной строкой, но так ничего и не понял или даже еще больше запутался. Смотрел в сторону idTelnet и Winexec. Но пока не осилил. И еще одна просьба, если можно не только пример программы но и объяснения к скрипту. хотелось бы понять для дальнейшей работы с программой.

Заранее благодарен!
Ответить с цитированием
  #2  
Старый 31.03.2013, 20:40
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,723
Репутация: 52347
По умолчанию

Если я правильно понял, то есть некий эмулятор телнета который генерит сей скрипт. Вы затем засовываете это в реальный телнет?
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #3  
Старый 01.04.2013, 15:33
darchken darchken вне форума
Прохожий
 
Регистрация: 31.03.2013
Сообщения: 29
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Не совсем. На данный момент просто команды выводятся в мемо. Я их копирую и вставляю в cmd.exe ну и там все это выполняется(простейши копи-паст). Ну т.е. это просто облегчает тем что не надо команды вспоминать и вводить. А хочется еще доработать программу и сделать чтобы она сама подключалась по телнету и вводила команды по заранее заданным данным.
Ответить с цитированием
  #4  
Старый 01.04.2013, 15:45
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

есть готовое решение:

Цитата:
TSE - Telnet Script Executor. Программа - исполнитель telnet сценариев предназначена для автоматизации рутинных процедур по обслуживанию оборудования и программного обеспечения, сбора статистической информации и прочих работ которые могут делаться при помощи программы/протокола telnet. При необходимости программу TSE можно использовать и для доступа к другим сервисам рассчитанным на символьный обмен. Программа является бесплатной (freeware) и поставляется с исходными текстами (на C++). Программа тестировалась в работе под ОС MS Windows 95, 98, NT 4.0. Последнюю версию программы можно скачать по адресу http://home.onego.ru/~loft/_tse.exe С автором программы можно связаться по E-mail: Loft@onego.ru
Программа TSE принимает со стандартного устройства ввода (по умолчанию это консоль)команды, интерпретирует и выполняет их. Список команд и их действия приведен ниже. При своей работе программа выводит на стандартное устройство вывода (по умолчанию это консоль) символы отосланные и полученные от устройства (ПК) к которому она в данный момент подключена по протоколу TCP/IP. При необходимости может быть включена расширенная диагностика или наоборот полностью отключен вывод сообщений.
Программа TSE может принимать следующие параметры командной строки:
tse.exe [options] [parameters] [<scriptfile] [>outputfile]
[options] в качестве префикса может быть использован символ - или /:
-s: молчаливый режим (отключен вывод сообщений)
-d: показывать сообщения расширенной диагностики
-h: показать экран подсказки по использованию программы
[parameters] список параметров командной строки (до 9-ти параметров) которые могут быть использованы в файле сценария. Если параметр начинается с символа - или / то для отличия его от опции необходимо продублировать первый символ: -- или //
[scriptfile] имя файла со сценарием, если отсутствует программа будет ждать ввода команд с консоли
[outputfile] имя файла для вывода информации, если отсутствует программа будет выводить информацию на консоль

Программа TSE читает и выполняет команды построчно. Строки могут заканчиваться как символами с кодом 0D и 0A, так и только одним символом 0A. Сценарий прекращает выполняться в случае если программа дойдет до конца файла (получит символ Ctrl+Z в случае ввода с консоли), будет выполнена команда на прекращение работы или в случае любой ошибки в синтаксисе команд сценария или ошибки выполнения этих команд. Строки начинающиеся с символа ; считаются комментариями. Комбинация с %1 до %9 считается ссылкой на соответствующий параметр командной строки. Если необходимо использовать символ % в тексте для других целей достаточно его продублировать - %%.
Поддерживаются следующие команды:
- rem - строка является комментарием. Пример: rem Connect to router
- open - подключиться к удаленному устройству/ПК. Команда имеет 2 параметра: open <IP-адрес> [TCP-порт]. В качестве адреса может выступать как имя так и непосредственно IP-адрес. TCP-порт числовой номер порта, если отсутствует, то подключение будет произведено к 23-му порту. Пример: open 192.168.0.1
- close - закрывает текущее соединение. Команда не имеет параметров;
- exit - закрывает текущее соединение и прекращает выполнение сценария. Команда не имеет параметров;
- quit - прекращает выполнение сценария, при этом не ожидается закрытия соединения с удаленным устройством. Данную команду полезно использовать при перезагрузке устройства/ПК, когда TCP-сессия все равно уже не может быть корректно закрыта. Команда не имеет параметров;
- waitfor - ожидает получения от подключенного устройства определенных данных. Команда имеет один параметр - символьную строку в "" которую необходимо ожидать. Пример: waitfor "name:"
- transmit - посылает на подключенное устройство данные. Команда имеет один параметр - символьную строку в "" которую необходимо отослать. Пример: transmit "root^M"
- pause - пауза в работе программы на заданное количество секунд. Может быть полезна для ожидания от удаленного устройства обработки посланных данных, например перед закрытием соединения. Команда имеет один параметр - число секунд, которые необходимо ждать. Пример: pause 3
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #5  
Старый 02.04.2013, 10:01
darchken darchken вне форума
Прохожий
 
Регистрация: 31.03.2013
Сообщения: 29
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Подскажите, как можно этим воспользоваться? Я видимо чего-то не понимаю.
Ответить с цитированием
  #6  
Старый 03.04.2013, 18:15
darchken darchken вне форума
Прохожий
 
Регистрация: 31.03.2013
Сообщения: 29
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Люди может хотя бы подскажите как открыть цмд.ехе (хотя знаю как его открыть из программы) и вставить туда все команды которые он формирует?
Ответить с цитированием
  #7  
Старый 04.04.2013, 01:33
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Код:
 winexec(Pchar('telnet server login pass comand comand comand comand'),sw_Show);
или
Код:
ShellExecute(0, 'open', 'cmd.exe', 'telnet server login pass comand comand comand comand', nil, SW_SHOW);


Специальный ресурс, посвящённый работе с cmd.exe
Ответить с цитированием
  #8  
Старый 04.04.2013, 08:33
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

используй CreateProcess с hStdInput/hStdOutput. темы по этому вопросу встречаются очень часто, как и ответы на них.
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #9  
Старый 05.04.2013, 06:30
darchken darchken вне форума
Прохожий
 
Регистрация: 31.03.2013
Сообщения: 29
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Спасибо за помощь!

Я тут нашел исходники "Простейшего телнет клиента" теперь решил объединить свою програмульку с с этим чудом. Простейший телнет клиент принимает все введенное в мемо с клавиатуры, а я пытаюсь туда вставить командой:
memo1.lines.add('comand')
и никакой реакций т.е. в мемо отображается но от самого телнета ответа нет, как будто ничего и не вводил. Подскажите вот это пожалуйста, думаю я близок к решению данной задачи.

ЗЫ: Если интересно могу выложить исходник.

Последний раз редактировалось darchken, 05.04.2013 в 06:38.
Ответить с цитированием
  #10  
Старый 08.04.2013, 00:14
darchken darchken вне форума
Прохожий
 
Регистрация: 31.03.2013
Сообщения: 29
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

или подскажите как передать командой idtelnet1.sendch()
все то что должно вводится в командной строке. я так понимаю он принимает только нажатие клавиш. sendcmd почему то намертво вешает прогу.
Ответить с цитированием
  #11  
Старый 08.04.2013, 00:27
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Цитата:
Сообщение от darchken
...как передать командой idtelnet1.sendch()
все то что должно вводится в командной строке...
Код:
...

for i:=1 to length(cmdstr) do IdTelnet1.SendCh(cmdstr[i]);
IdTelnet1.SendCh(CR) {#13 или CRLF}  ;
...
наверное потом зависнет на IdTelnet1.CurrentReadBuffer, а почему это происходит, нет инфы.

З.Ы. То что уходит лежит в SendCmd, можно там посмотреть, а что приходит от сервера видно в DataAvailable.

З.Ы.P.S. по теме

Последний раз редактировалось Alegun, 08.04.2013 в 01:21.
Ответить с цитированием
  #12  
Старый 14.04.2013, 08:40
darchken darchken вне форума
Прохожий
 
Регистрация: 31.03.2013
Сообщения: 29
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Спасибище, Alegun!

Помогло, пока еще не дописал программу, но проверил вроде работает. Как допишу обязательно дам знать.
Ответить с цитированием
  #13  
Старый 14.04.2013, 12:01
darchken darchken вне форума
Прохожий
 
Регистрация: 31.03.2013
Сообщения: 29
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Подскажите еще кое что пожалуйста, у меня в проге так команды присваиваются так:
com1:=edit4.Text;
com2:=edit4.Text;
com3:=edit4.Text;
com4:=edit4.Text;
com5:=edit4.Text;

и вот терь запутался в массивах, как правильно сделать?
так:
Код:
for i:=1 to length(com1) do idtelnet1.sendch(com1[i]);
for i:=1 to length(com2) do idtelnet1.sendch(com2[i]);
for i:=1 to length(com3) do idtelnet1.sendch(com3[i]);
for i:=1 to length(com4) do idtelnet1.sendch(com4[i]);
for i:=1 to length(com5) do idtelnet1.sendch(com5[i]);

или можно будет сделать так:

Код:
for j:=1 to 5 do begin
  for i:=1 to length(com[j]) do idtelnet1.sendch(com[j,i]);

Какой массив надо будет объявить - одномерный или двумерный?
Пробывать боюсь так как оборудование рабочее, боюсь что нибудь испортить.
Ответить с цитированием
  #14  
Старый 14.04.2013, 12:20
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

Массив делать и проходить двойным циклом. Иначе если понадобится больше команд, чем 5, то код со статичным заданием превратится в портянку на много километров. Или еще хуже - задаваемое число команд, тогда статичным заданием в принципе сделать невозможно.
__________________
jmp $ ; Happy End!
The Cake Is A Lie.

Последний раз редактировалось Bargest, 14.04.2013 в 12:27.
Ответить с цитированием
  #15  
Старый 14.04.2013, 12:21
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Здесь массива нет совсем, имелось ввиду наверное это
Код:
var
com: array[1..5] of string;

//Заполнение массива
...
com[1]:= edit4.Text;
com[2]:= edit4.Text;
com[3]:= edit4.Text;
com[4]:= edit4.Text;
com[5]:= edit4.Text;
...
...
// или

for i := 1 to 5 do com[i]:= edit4.Text;
...

но зачем лишняя прокладка посредством массива, когда можно так

Код:
var
com: string;
begin
com:=
edit4.Text + ' ' +
edit4.Text + ' ' +
edit4.Text + ' ' +
edit4.Text + ' ' +
edit4.Text;

for i := 1 to Length(com) do idtelnet1.sendch(com[i]);
end;


// или сразу вот это
...
var
s: string;
i,j: integer;
begin
for i := 1 to 5 do
begin

// на форме лежат 5 едитов с именем Edit1..Edit5 
s:= (FindComponent('Edit'+IntToStr(i)) as TEdit).Text;
for j:=1 to Length(s) do idtelnet1.sendch(s[j]);
end;
end;

Последний раз редактировалось Alegun, 14.04.2013 в 12:41.
Ответить с цитированием
Ответ


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

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

ВКонтакте   Facebook   Twitter