Легенда:
новое сообщение
закрытая нитка
новое сообщение
в закрытой нитке
старое сообщение
|
- Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
- Новичкам также крайне полезно ознакомиться с данным документом.
Сграбить текстовый поток из ДОС-окна. 07.09.12 05:32
Автор: Zef <Alloo Zef> Статус: Elderman
|
Иемеем сервак, подключенный к приемнику. С него вДОС-окно валится непрерывный поток сообщений (текст). Это окно через удаленный стол открыто на другом компе.
Задача:
Сграбить поток из этого окна и наладить его непрерывный парсинг, накопление и анализ. Чем?
|
|
Запустить в телнете/ssh? Перенаправить вывод на smb-ресурс? Или внутри софтины (через пайп)? 07.09.12 11:17
Автор: Ustin <Ustin> Статус: Elderman Отредактировано 07.09.12 12:19 Количество правок: 6
|
up: на сервере: unxutils, cmd /c soft.exe >> \\srv\share\1.out
на клиенте: unxutils, tail -f \\srv\share\1.out |grep...
но 1.out сильно распухнет, поэтому, ИМХО, лучше собирать вывод софтово.
---
Если софтово - пример на делпхи, жрёт stdout и stderr.
Пример рассчитан на запуск винрара, поэтому парсить надо внутри while.
function GetDosOutput(const CmdLine:string;Params:String):string;overload;
var
SA: TSecurityAttributes;
SI: TStartupInfo;
PI: TProcessInformation;
StdOutPipeRead, StdOutPipeWrite: THandle;
WasOK: Boolean;
Buffer: array[0..255] of Char;
BytesRead: Cardinal;
WorkDir, Line: String;
begin
with SA do
begin
nLength := SizeOf(SA);
bInheritHandle := True;
lpSecurityDescriptor := nil;
end;
// создаём пайп для перенаправления стандартного вывода
CreatePipe(StdOutPipeRead, // дескриптор чтения
StdOutPipeWrite, // дескриптор записи
@SA, // аттрибуты безопасности
0 // количество байт принятых для пайпа - 0 по умолчанию
);
// Создаём дочерний процесс, используя StdOutPipeWrite в качестве стандартного вывода,
// а так же проверяем, чтобы он не показывался на экране.
with SI do
begin
FillChar(SI, SizeOf(SI), 0);
cb := SizeOf(SI);
dwFlags := STARTF_USESHOWWINDOW or STARTF_USESTDHANDLES;
wShowWindow := SW_HIDE;
hStdInput := GetStdHandle(STD_INPUT_HANDLE); // стандартный ввод не перенаправляем
hStdOutput := StdOutPipeWrite;
hStdError := StdOutPipeWrite;
end;
// Запускаем компилятор из командной строки
WorkDir := ProcessPath(CmdLine,PPPT_PARENTDIR);
WasOK := CreateProcess(PChar(CmdLine),PChar(Params) ,nil, nil, True, 0, nil, PChar(WorkDir), SI, PI);
// Теперь, когда дескриптор получен, для безопасности закрываем запись.
// Нам не нужно, чтобы произошло случайное чтение или запись.
CloseHandle(StdOutPipeWrite);
// если процесс может быть создан, то дескриптор, это его вывод
if WasOK then
// получаем весь вывод до тех пор, пока DOS-приложение не будет завершено
Line := '';
repeat
// читаем блок символов (могут содержать возвраты каретки и переводы строки)
WasOK := ReadFile(StdOutPipeRead, Buffer, 255, BytesRead, nil);
// есть ли что-нибудь ещё для чтения?
if BytesRead > 0 then
begin
// завершаем буфер PChar-ом
Buffer[BytesRead] := #0;
// добавляем буфер в общий вывод
Line := Line + Buffer;
end;
until not WasOK or (BytesRead = 0);
// ждём, пока завершится консольное приложение
WaitForSingleObject(PI.hProcess, INFINITE);
// Закрываем все оставшиеся дескрипторы
CloseHandle(PI.hThread);
CloseHandle(PI.hProcess);
result:=Line;
CloseHandle(StdOutPipeRead);
end;
---
|
|
Редирект консольного вывода в сеть? 07.09.12 09:39
Автор: HandleX <Александр М.> Статус: The Elderman Отредактировано 07.09.12 09:41 Количество правок: 3
|
> Имеем сервак, подключенный к приемнику. С него вДОС-окно > валится непрерывный поток сообщений (текст). Это окно через > удаленный стол открыто на другом компе. "ДОС окно" это насколько я понимаю консольное приложение, которое выводит в stdout?
> Задача: > Сграбить поток из этого окна и наладить его непрерывный > парсинг, накопление и анализ. Чем? Заредиректить stdout через cmd'шный pipe, например cmd receiver.exe | nc -vv -l -p 8080
nc (netcat) взять где-нить виндовозный порт, в интернетах полно.
Потом дёргаешь с того хоста с порта 8080 вывод той проги.
Пичалька будет, если программа не гонит вывод в stdout, а занимается фигнёй и сама рисует на экране консольными функциями вывода.
|
| |
В крайнем случае -- копать исходники ConEmu, оно умеет... 08.09.12 01:57
Автор: _AMMOnium_ Статус: Незарегистрированный пользователь
|
В крайнем случае -- копать исходники ConEmu, оно умеет читать почти любые консоли.
|
| | |
Редирект, ИМХО, должен быть, но хозяева на сервер не пускают 08.09.12 05:09
Автор: Zef <Alloo Zef> Статус: Elderman
|
прогу остановить и пререзапустить нельзя.
Написать прогу, грабящую текст из окна для меня не проблема, но не договорившись с шефом о цене ничегописать я не хочу. Потому спрашиваю, нет ли готовой грабилки, способной перехватить вывод в окно и перенаправить его в файл/ввод другой проги. Дело в том, что мне сначала надо парсер текста и аниматор ГИС прикинуть.
|
|
|