информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
За кого нас держат?Spanning Tree Protocol: недокументированное применениеСтрашный баг в Windows
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Бэкдор в xz/liblzma, предназначенный... 
 Три миллиона электронных замков... 
 Doom на газонокосилках 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / programming
Имя Пароль
ФОРУМ
если вы видите этот текст, отключите в настройках форума использование JavaScript
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
  • Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
  • Новичкам также крайне полезно ознакомиться с данным документом.
Запустить в телнете/ssh? Перенаправить вывод на smb-ресурс? Или внутри софтины (через пайп)? 07.09.12 11:17  Число просмотров: 4805
Автор: 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; 

---
<programming>
Сграбить текстовый поток из ДОС-окна. 07.09.12 05:32  
Автор: Zef <Alloo Zef> Статус: Elderman
<"чистая" ссылка>
Иемеем сервак, подключенный к приемнику. С него вДОС-окно валится непрерывный поток сообщений (текст). Это окно через удаленный стол открыто на другом компе.

Задача:
Сграбить поток из этого окна и наладить его непрерывный парсинг, накопление и анализ. Чем?
MSDN, всё чётко описано 07.09.12 11:30  
Автор: kstati <Евгений Борисов> Статус: Elderman
<"чистая" ссылка>


Creating a Child Process with Redirected Input and Output
Запустить в телнете/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
<"чистая" ссылка>
прогу остановить и пререзапустить нельзя.

Написать прогу, грабящую текст из окна для меня не проблема, но не договорившись с шефом о цене ничегописать я не хочу. Потому спрашиваю, нет ли готовой грабилки, способной перехватить вывод в окно и перенаправить его в файл/ввод другой проги. Дело в том, что мне сначала надо парсер текста и аниматор ГИС прикинуть.
1




Rambler's Top100
Рейтинг@Mail.ru


  Copyright © 2001-2024 Dmitry Leonov   Page build time: 0 s   Design: Vadim Derkach