Задний план: У меня рабочая станция с 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?
К слову, я потратил более нескольких часов на изучение и тестирование возможных решений. Вещи, которые я пробовал, которые не работали должным образом (или вообще не работали):
stdout
в новый файл с именем test.log. Test.log был идентичен исходному файлу журнала. Никакой пользы.$ cat 20151112.170457.log > test.log
cat
вывод на xclip
. В xclip
программа жалуется, потому что у меня нет поддержки X11. Не сработало. Никакой пользы.$ cat 20151112.170457.log | xclip Error: Can't open display: (null)
с помощью встроенной Windows clip
команда. Когда я запускаю эту команду, никаких жалоб от ОС нет, но вместо этого возникают две проблемы, указанные ниже.
ESC
коды). Никакой пользы.У меня есть Mac, и в некоторых других сообщениях, которые я прочитал, предлагается использовать pbcopy
но я скептически отношусь к его работе иначе, чем «clip» в Windows.
Я знаю и использовал less -R
и less -r
чтобы разрешить обработку цвета терминала ESC
коды (с использованием -R
) и все ESC
коды (с использованием -r
), но, опять же, это помогает только при представлении пользователю и не позволяет программный поиск в сотнях файлов журнала для команды pwd
если я допустил ошибку и исправил ее перед нажатием Enter
.
Я также поговорил с коллегой. Никакой пользы. ;-)
По сути, мне просто нужен журнал 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)