Назад | Перейти на главную страницу

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

Задний план: У меня рабочая станция с Windows 7, и я использую PuTTY для подключения по SSH к серверам Linux с включенным ведением журнала сеанса. Я раньше использовал Printable output вариант, но у этого есть выгода нет escape-символов, но недостаток о создании команд, которые я ввел без поиска, если я использовал tab для автозаполнения или backspace потому что я исправил опечатку (или 3) при вводе команды.

НОТА: у меня есть cygwin установлен для дополнительной поддержки инструментов командной строки (т.е. grep, find, и т.д.).

Недавно мне пришлось вернуться и найти несколько команд, чтобы исправить положение с коллегой о том, что произошло на сервере, и о невозможности увидеть окончательный Команды, которые я вводил, проблематичны и затрудняют поиск в журналах, а также затрудняют демонстрацию того, что на самом деле произошло для моего коллеги.

Пример №1: Это фактический файл журнала PuTTY команды pwd, изначально написанной с ошибкой как pdw, а затем исправленного на pwd с помощью Printable output включен при просмотре с cat или в less.

НОТА: Нет разницы между 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 All session output опция регистрации. Хорошо, так вот сделка с All session output опция включена, файл журнала заполняется ESC коды для цвета терминала и непечатаемых символов, таких как backspace.

Пример №2: Это фактический файл журнала PuTTY команды pwd, изначально написанной с ошибкой как pdw, а затем исправленного на pwd с помощью All session output включен при просмотре в less.

$ 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 с помощью All session output включен при просмотре с помощью 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 команда с All session output включено ли ведение журнала сеанса PuTTY?

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

$ cat 20151112.170457.log > test.log
$ cat 20151112.170457.log | xclip
Error: Can't open display: (null)

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

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

НОТА: Если это не очевидно из моей общей репутации StackExchange 1, это мой первый вопрос или публикация на сайтах StackExchange. Я ищу полезные ответы, а не такие ответы, как «Перейти на Linux» или «RTFM».

У меня была такая же проблема при регистрации сеанса шпатлевки, и я не мог найти никакого решения в Интернете, поэтому в итоге я написал небольшой скрипт на 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.

Предполагая, что 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)