Если вы активно используете PuTTY для подключения к Linux-серверам, то наверняка сталкивались с тем, что логи сессии превращаются в кашу из символов табуляции. Особенно раздражает, когда автоматическое завершение команд (то самое нажатие Tab) добавляет в файл кучу непонятных escape-последовательностей. Хочется открыть журнал и быстро найти нужную команду, а вместо этого – сплошные ^[[ и лишние пробелы.
Проблема в том, что PuTTY воспринимает весь вывод с сервера как единый поток текста – будь то результат команды, подсказка bash или те самые символы табуляции. Он не умеет разделять «важные» и «вспомогательные» данные (это, кстати, особенность работы SSH-клиента, а не сервера). Но есть пара обходных путей, которые сделают логи чище.
Настраиваем командную строку
Самый действенный способ – изменить приглашение командной строки (переменная PS1 в bash). Если между выполнением команд в логе будут чёткие разделители, вы сможете быстро ориентироваться даже при наличии лишних символов.
Допустим, ваш текущий PS1 выглядит так:
[u@h W]$
Превратите его в многострочный формат с пустыми строками-разделителями:
PS1='n────────────────────n[u@h W]$ '
Как это сделать постоянно:
1. Откройте файл ~/.bashrc
через nano или vim.
2. Добавьте строку:
export PS1='n────────────────────n[u@h W]$ '
3. Выполните source ~/.bashrc
, чтобы применить изменения.
Теперь в логах между командами будут горизонтальные линии (или пустые строки, если использовать nn
). Да, символы табуляции никуда не денутся, но вы хотя бы увидите, где заканчивается одна команда и начинается другая.
Кстати, вместо линий можно использовать временные метки – например, добавить
D{%H:%M:%S}
в PS1. Это особенно полезно для аудита.
Фильтрация логов
Если менять PS1 не хочется, попробуйте постобработку логов. Например, удаляйте все escape-последовательности с помощью sed
или ansifilter
.
Пример команды для очистки файла session.log
:
cat session.log | sed -r 's/x1B[[0-9;]*[a-zA-Z]//g' > cleaned.log
Или установите утилиту ansifilter
(есть в репозиториях большинства дистрибутивов):
sudo apt install ansifilter && ansifilter -H session.log > cleaned.html
Ещё один вариант – перенаправлять логи через script
, сохраняя только ввод пользователя:
script -f logfile.txt
…но тут есть нюанс: script
записывает всё, включая управляющие символы, так что придётся комбинировать методы.
Важно: не надейтесь на встроенные опции PuTTY вроде «Exclude terminal/prompt» – они не влияют на обработку Tab. Как показала практика, даже в версии 0.83 ничего не поменялось.
К сожалению, универсального решения нет. Если очень хочется автоматизировать фильтрацию, напишите простой скрипт на Python или Perl, который будет удалять строки с определёнными ANSI-кодами. Например, табуляция в bash часто сопровождается последовательностью x1b[?2004h
– её можно вырезать регулярным выражением.
Если увидите советы про «настройте завершение команд без вывода в терминал» – не верьте. Такие опции есть в zsh или fish, но не в классическом bash. Остаётся либо мириться с лишними символами, либо активно использовать историю команд через history
вместо анализа логов.