Как программно преобразовать журналы замазки в удобочитаемые файлы с возможностью поиска?

Справочная информация: У меня рабочая станция с Windows 7, и я использую PuTTY для подключения по SSH к серверам Linux с включенным ведением журнала сеанса. Раньше я использовал параметр вывода для печати, но он имеет преимущество ...

Справочная информация: У меня рабочая станция с Windows 7, и я использую PuTTY для подключения по SSH к серверам Linux с включенным ведением журнала сеанса. Раньше я использовал параметр вывода для печати, но он имеет преимущество ...

Справочная информация: У меня рабочая станция с Windows 7, и я использую PuTTY для подключения по SSH к серверам Linux с включенным ведением журнала сеанса. Раньше я использовал параметр Вывод для печати , но у него есть преимущество отсутствия escape-символов, но недостаток создания команд, которые я ввел без возможности поиска, если я использовал tab для автозаполнения или backspace , потому что я исправил опечатку (или 3) при вводе команды.

ПРИМЕЧАНИЕ: У меня установлен cygwin для поддержка дополнительных инструментов командной строки (например, grep , find и т. д.).

Недавно Это фактический файл журнала PuTTY команды 'pwd', изначально неправильно написанный как 'pdw', а затем исправленный на 'pwd' с включенным Вывод для печати при просмотре с помощью cat или ] меньше .

ПРИМЕЧАНИЕ: В этом случае нет никакой разницы между less и cat , потому что нет кодов ESC и был захвачен только вывод для печати.

$ cat 20151112.170705.log
=~=~=~=~=~=~=~=~=~=~=~= PuTTY log 2015.11.12 17:07:05 =~=~=~=~=~=~=~=~=~=~=~=
[root@eye ~]# pdwwd
/root
[root@eye ~]# exit
logout
$

Как видите, если вы выполните поиск по запросу pwd , вы не получите подходящих результатов. Я использовал iTerm на Mac и знаю, что он может автоматически воспроизводить журналы, и кажется, что должен быть способ увидеть конечный результат того, что я в конечном итоге использовал.

Введите PuTTY Опция регистрации всех выходных сеансов . Хорошо, так вот сделка, с включенной опцией Весь вывод сеанса файл журнала заполняется кодами ESC для цвета терминала и непечатаемыми символами, такими как backspace .

Пример №2: Это фактический файл журнала PuTTY для команды 'pwd', изначально неправильно написанной как 'pdw', а затем исправленный на 'pwd' с включенным Все выходные данные сеанса при просмотре в меньше .

$ less 20151112.170457.log
=~=~=~=~=~=~=~=~=~=~=~= PuTTY log 2015.11.12 17:04:57 =~=~=~=~=~=~=~=~=~=~=~=
Using username "root".
Authenticating with public key "ssh2_rsa_2048_private_key_20111128.ppk"
ESC[?1034hESC]0;root:~^GESC[1;30m[ESC[1;35mrootESC[1;30m@ESC[1;35meye ESC[1;34m~ESC[1;30m]ESC[1;35m# ESC[0mpdESC[ESC[Kwd
/root
ESC]0;root:~^GESC[1;30m[ESC[1;35mrootESC[1;30m@ESC[1;35meye ESC[1;34m~ESC[1;30m]ESC[1;35m# ESC[0mexit
logout
$

] Хорошо, я почти подошел к сути проблемы. Если я использую cat с включенной опцией All session output , это выглядит идеально. Это именно то, что я хочу видеть и над чем работать.

Пример № 3: Это фактический файл журнала PuTTY команды 'pwd', первоначально записанный с ошибкой как 'pdw', а затем исправленный на 'pwd' с включенным Все выходные данные сеанса при просмотре с использованием cat .

] ПРИМЕЧАНИЕ: Это тот же файл журнала, что и выше. Это также точный видимый результат и формат, в котором я хочу иметь возможность искать.

$ cat 20151112.170457.log
=~=~=~=~=~=~=~=~=~=~=~= PuTTY log 2015.11.12 17:04:57 =~=~=~=~=~=~=~=~=~=~=~=
Using username "root".
Authenticating with public key "ssh2_rsa_2048_private_key_20111128.ppk"
[root@eye ~]# pwd
/root
[root@eye ~]# exit
logout

$

Настоящая проблема, которую мне нужно решить: Как я могу программно переводить, преобразовывать или обновлять содержимое этих файлов журнала, чтобы они только отображали то, что фактически видно пользователю после обработки файла журнала с помощью cat Команда с Все выходные данные сеанса включены в журнал сеанса PuTTY?

Для записи, я потратил более нескольких часов на изучение и тестирование возможных решений. То, что я пробовал, но которые не работали должным образом (или вообще не работали):

  • прямое перенаправление stdout в новый файл с именем test.log. Test.log был идентичен исходному файлу журнала. Никакой выгоды.
 $ cat 20151112.170457.log> test.log
  • установка xclip и перенаправление вывода cat на xclip . Программа xclip жалуется, потому что у меня нет поддержки X11. Не сработало. Никакой выгоды.
 $ cat 20151112.170457.log | xclip
Ошибка: не удается открыть дисплей: (null)
  • с помощью встроенной команды Windows clip . Когда я запускаю эту команду, никаких жалоб от ОС нет, но вместо этого возникают две проблемы, указанные ниже.

    • Нет программного способа получить данные из буфера обмена Windows
    • Даже если бы я мог получить данные, содержимое буфера обмена идентично исходному файлу журнала (с кодами ESC ). Никакой пользы.
  • У меня есть Mac, и в некоторых других сообщениях, которые я прочитал, предлагается использовать pbcopy , но я скептически отношусь к его работе иначе, чем clip »в Windows.

  • Я знаю и использовал less -R и less -r , чтобы разрешить обработку кодов цвета терминала ESC (с использованием -R ) и все коды ESC (с использованием -r ), но, опять же, это только помогает при представлении пользователю и не позволяет программный поиск сотен файлов журнала для команды pwd , если я допустил ошибку и исправил ее до нажатия Enter .

  • Я также поговорил с коллегой. Никакой пользы. ; -)

По сути, мне просто нужен журнал PuTTY, эквивалентный копированию / вставке веб-страницы в блокнот. Исходный код веб-страницы содержит множество тегов , но пользователь ничего из этого не видит, и если они выделяют страницу, нажмите скопировать и вставить в Блокнот, все, что они получают, - это текст, который они видели на странице.

Я хочу иметь возможность программно создать в Блокноте эквивалент всех этих файлов журнала PuTTY для эффективного поиска (то есть, используя grep ).

ПРИМЕЧАНИЕ: Если это не ' Это очевидно из моей общей репутации на StackExchange 1 , это мой первый вопрос или сообщение на сайтах StackExchange. Я ищу полезные ответы, а не ответы типа «Переключитесь на Linux» или «RTFM».

4
задан 13 November 2015 в 01:09
3 ответа

Предполагая, что escape-коды в файле замазки являются двоичными (я немного запутался, почему в вашем примере есть управляющие символы - я предполагаю, что это меньше), вы можете попробовать col

http://man7.org/linux/man-pages/man1/col.1.html

Управляющие последовательности для движения каретки, которые col понимает и их десятичные значения перечислены в следующей таблице:

          ESC-7             reverse line feed (escape then 7)
          ESC-8             half reverse line feed (escape then 8)
          ESC-9             half forward line feed (escape then 9)
          backspace         moves back one column (8); ignored in the
                            first column
          newline           forward line feed (10); also does carriage
                            return
          carriage return   (13)
          shift in          shift to normal character set (15)
          shift out         shift to alternate character set (14)
          space             moves forward one column (32)
          tab               moves forward to next tab stop (9)
          vertical tab      reverse line feed (11)
1
ответ дан 3 December 2019 в 03:56

У меня была такая же проблема при регистрации сеанса замазки, и я тоже не мог найти какое-либо решение в Интернете, поэтому в итоге я написал небольшой скрипт на Python, чтобы прочитать журнал сеанса и очистить его.

file_in=open('input.log')
file_out=open('output.log', 'w')

for line in file_in:
    input_line = bytearray(line, 'utf-8')

    input_line=input_line.replace(b"\x1b[J", b'')       #remove \x1b[J
    input_line=input_line.replace(b"\x1b[20D", b'')     #remove \x1b[20D
    input_line=input_line.replace(b"\x1b[H", b'')       #remove \x1b[H
    input_line=input_line.replace(b"\x1b[0m", b'')      #remove \x1b[0m
    input_line=input_line.replace(b"\x1b[0;0m", b'')    #remove \x1b[0;0m
    input_line=input_line.replace(b"\x1b[1;32m", b'')   #remove \x1b[1;32m
    input_line=input_line.replace(b"\x1b[1;34m", b'')   #remove \x1b[1;34m
    input_line=input_line.replace(b"\x1b[1;35m", b'')   #remove \x1b[1;35m
    input_line=input_line.replace(b"\x1b[1;36m", b'')   #remove \x1b[1;36m
    input_line=input_line.replace(b"\x1b[1m", b'')      #remove \x1b[1m
    input_line=input_line.replace(b"\x07", b'')         #remove \x07 (BEL)

    p = input_line.find(b"\x08")
    while p>0:                          #apply backspace and remove 'BS'
        del input_line[p]
        del input_line[p-1]
        p = input_line.find(b"\x08")

    file_out.write(input_line.decode())

file_in.close
file_out.close

Это сработало для моего журнала. Так что включите 'All Session Output', попробуйте и дайте мне знать.

Кстати, это Python 3.5.1.

1
ответ дан 3 December 2019 в 03:56

Я наткнулся на ваш пост в поисках ответа на тот же проблема. Вы заявили, что если вы просматриваете файл, он выглядит идеально. Я использовал cat в CYGWIN, чтобы распечатать файл на терминале CYGWIN, затем я выбрал все и вставил в файл NotePad ++. Это сработало отлично.

0
ответ дан 15 September 2020 в 23:20

Теги

Похожие вопросы