На хабре уже создавались топики по разукрашиванию вывода терминала, но каждый топик в основном касался одной конкретной задачи — раскрасить собственные скрипты, раскрасить приглашение терминала и т.п. Я же решил написать обобщенную статью, в который вы узнаете, как внести больше красок в ваш терминал.
Многие не всегда понимают смысла делать вывод терминала цветным и считают это пустой тратой времени. Я же считаю, что это очень облегчает восприятие текстовой информации. Смотрим ли мы логи или просто делаем трэйсроут до своего сервера. Выделение цветом поможет сконцентрировать внимание на важных вещах и отделить мух от котлет.
Что нам потребуется
Для воплощения в жизнь дальнейших планов по раскраске терминала нам потребуется две вещи.
- Программа grc. Она позволит создать правила разукрашивания вывода для многих программ на основе регулярных выражений. В ее стандартной поставке содержится достаточно конфигов для наиболее часто используемых программ, которых уже будет достаточно для более комфортной работы, а для всего остального мы сможем написать свои собственные конфиги или же найти их в интернете.
- Конфигурационный файл нашего интерпретатора командной строки (оболочки). Он находится в домашнем каталоге и должен именоваться ".bashrc" при условии, что вы используете дефолтную для linux оболочку. Ежели вы используете другой интерпретатор, то вы наверняка знаете, где лежит его конфиг.
Console Codes — управляющие последовательности вывода
Каким вообще образом терминал определяет, что сточку надо вывести зеленым цветом, верхнее поле жирным, а этот символ вообще должен мигать и быть подчеркнутым? Для этого существуют так называемые «control sequences» (управляющие последовательности). Визуально они представляют из себя набор специальных символов, которые не выводятся на экран, а лишь указывают терминалу, что он должен изменить цвет или тип шрифта. Выглядит эта последовательность символов так:
33[XXXm — Вместо XXX следует писать специальные коды, которые и указывают терминалу, что необходимо так или иначе обработать текст. Пример:
echo -e "hello 33[<i>44</i>mworld33[<i>0</i>m. How are you"
Здесь мы вывели строку «hello world. How are you» и напечатали слово «world» на голубом фоне. Для этого нам потребовалось указать перед словом «world» управляющую последовательность с кодом голубого фона — 44. Так как вызов управляющих
последовательностей изменяет вывод всего остального текста, идущего после последовательности, нам пришлось вызвать еще одну после слова «world», с кодом 0. Как вы, наверное, догадались, код 0 сбрасывает настройки на дефолтные.
Мы можем комбинировать несколько кодов в одной управляющей последовательности, просто записывая их через точку с запятой:
echo -e "33[<i>31;4;47</i>mTEST"
Слово «TEST» будет выведено красным цветом, на белом фоне и будет подчеркнутым. Все это благодаря трем кодам: 31(красный цвет текста), 4(подчеркнуть), 47(белый фон)
Вот и все, что необходимо знать, чтобы самостоятельно разукрашивать вывод. Эти знания пригодятся вам при написании собственных скриптов. Как вариант, можно отредактировать конфиг оболочки рута, покрасить приглашение в красный цвет:
Теперь вы вряд ли сможете случайно выполнить опасную команду под рутом…
1 — повысить яркость
2 — понизить яркость
4 — подчеркнуть
5 — нормальная яркость
7 — Инвертировать
8 — скрыть
Черный текст 30
Черный фон 40
Красный текст 31
Красный фон 41
Зеленый текст 32
Зеленый фон 42
Желтый текст 33
Желтый фон 43
Синий текст 34
Синий фон 44
Фиолетовый цвет 35
Фиолетовый фон 45
Голубой цвет 36
Голубой фон 46
Белый цвет 37
Белый фон 47
Более подробно можно почитать в манах — man console_codes
Разукрашиваем Man-страницы
Всем, в независимости от опыта, иногда приходится читать маны. Так почему бы не сделать этот процесс более удобным и приятным? С помощью изученных выше последовательностей, мы можем выделить в манах аргументы, значения параметров и служебную информацию.
Чтобы это осуществить, вы должны убедиться, что ман-страницы показываются при помощи less. Если это не так, вам нужно добавить в конфиг вашей командной оболочки следующую строчку:
export PAGER=less
Так мы назначим less просмоторщиком по умолчанию.
Разработчики less ввели разные стили вывода текста в своей программе: полужирный, подчеркнутый, выделенный (служебная информация внизу страницы) и мерцающий. Вот для этих стилей мы и должны задать свои собственные цвета, вместо однотонных по умолчанию.
Для этого вновь добавляем в конфиг командной оболочки следующие строчки:
export LESS_TERMCAP_mb=$'E[01;33m' # цвет мерцающего стиля
export LESS_TERMCAP_md=$'E[01;31m' # цвет полужирного стиля
export LESS_TERMCAP_me=$'E[0m'
export LESS_TERMCAP_so=$'E[01;42;30m'# цвет и фон служебной информации
export LESS_TERMCAP_se=$'E[0m'
export LESS_TERMCAP_us=$'E[01;32m' # цвет подчеркнутого стиля
export LESS_TERMCAP_ue=$'E[0m'
Проверяем, открыв какой либо ман:
Разумеется, вы можете указать свои цвета, воспользовавшись таблицей кодов.
Цветные ls и grep
Многие программы сами по себе поддерживают цветной вывод. Например, ls и grep. Но для того, чтобы ls или grep сделали свой вывод цветным, мы должны добавить параметр --color=auto
. (ls --color=auto
, например). Благодаря этому параметру, ls меняет цвет каждого файла, исходя из его типа. Архив одним цветом, изображение другим, каталог третьим и так далее. Думаю, не стоит доказывать, что благодаря такому выводу поиск файлов упрощается в разы. Если же мы добавим параметр --color=auto
к grep, то он будет выделять цветом найденное вхождение в строке, что также бывает очень полезно.
Конечно же, вводить каждый раз --color=auto
слишком утомительно и поэтому мы просто добавим в конфиг оболочки альясы для этих команды:
alias ls='ls --color=auto'
alias grep='grep --color=auto'
Теперь, когда мы выполним команду ls, интерпретатор сам заменит ее на ls --color=auto
. Аналогично и для grep.
Чтобы указать цвет выделения для grep, добавим в наш конфиг оболочки:
export GREP_COLOR="1;31"
А для раскраски файлов по их расширениям в ls добавим:
export LS_COLORS='no=00;37:fi=00;37:di=01;36:ln=04;36:pi=33:so=01;35:do=01;35:bd=33;01:cd=33;01:or=31;01:su=37:sg=30:tw=30:ow=34:st=37:ex=01;31:*.cmd=01;31:*.exe=01;31:*.com=01;31:*.btm=01;31:*.sh=01;31:*.run=01;31:*.tar=33:*.tgz=33:*.arj=33:*.taz=33:*.lzh=33:*.zip=33:*.z=33:*.Z=33:*.gz=33:*.bz2=33:*.deb=33:*.rpm=33:*.jar=33:*.rar=33:*.jpg=32:*.jpeg=32:*.gif=32:*.bmp=32:*.pbm=32:*.pgm=32:*.ppm=32:*.tga=32:*.xbm=32:*.xpm=32:*.tif=32:*.tiff=32:*.png=32:*.mov=34:*.mpg=34:*.mpeg=34:*.avi=34:*.fli=34:*.flv=34:*.3gp=34:*.mp4=34:*.divx=34:*.gl=32:*.dl=32:*.xcf=32:*.xwd=32:*.flac=35:*.mp3=35:*.mpc=35:*.ogg=35:*.wav=35:*.m3u=35:';
Само собой, вы можете добавить свои собственные расширения файлов и прописать для них цвета.
Как можно заметить на скриншоте, каждый тип файла выделен своим цветом. Помимо самих файлов окрашены и права на них, что должно облегчить поиск некорректно выставленных аргументов. Как этого добиться, вы узнаете ниже.
Grc — раскрасим все!
Наконец то мы добрались до самого интересного. Конечно замечательно, когда программы имеют дефолтную возможность красить свой вывод, но как быть, если такой возможности нет? Тут нам поможет программа grc, которая написана на
python. Скорее всего, она есть в ваших репозиториях и с установкой не должно возникнуть проблем.
Давайте попробуем раскрасить вывод ping. Для этого просто выполним команду:
grc ping 8.8.8.8
Работает? Прекрасно! Все что нужно для работы grc — это передать ей команду, а она уже сама примет меры по раскрашиванию ее вывода. Как это проходит? Первым делом grc обращается к своему конфигу ~/.grc.conf (если его нет, то к глобальному /etc/grc.conf) и смотрит, есть ли свои собственные правила расцветки для вызываемой команды. Если правила для вызываемой программы существуют, то они применяются, если же для вызываемой программы нет своих правил, то используются стандартные правила (conf.other)
Все конфиги с правилами хранятся в /usr/share/grc/ или же вы можете создать правила в каталоге ~/.grc/, которые будут доступны только вашему пользователю.
Понятное дело, что мы не будем постоянно писать «grc» перед командой, а просто создадим альясы для нужных команд, добавив в конфиг своей оболочки:
alias ll='grc ls -lFh --color=yes'
alias ping="grc ping"
alias traceroute="grc traceroute"
alias make="grc make"
alias diff="grc diff"
alias cvs="grc cvs"
alias netstat="grc netstat"
alias logc="grc cat"
alias logt="grc tail"
alias logh="grc head"
Здесь мы создали три альяса (logc, logt, logh) специально для чтения логов в цвете. ll — это будет альяс для подробного вывода ls, как на скриншоте выше.
Согласитесь, теперь работать в терминале стало намного лучше:
В /urs/share/grc находятся правила для многих стандартных программ, но давайте напишем свой небольшой конфиг правил для nmap.
Для начала создаем сам файл с правилами conf.nmap в каталоге ~/.grc (или /usr/share/grc, если хотите сделать его доступным всем пользователям)
Пишем внутри:
# ip number
regexp=d{1,3}.d{1,3}.d{1,3}.d{1,3}
colours=bold yellow
======
# list header
regexp=(PORT|STATE|SERVICE|REASON|VERSION)
colours=bold white
======
# open
regexp=open
colours=dark green
======
# filtered
regexp=filtered
colours=dark yellow
======
# closed
regexp=closed
colours= dark red
======
# tcp n udp
regexp=(/tcp|/udp)
colours=bold black
======
# device type
regexp=(Device type:)
colours=cyan
======
# running
regexp=(Running:|Running)
colours=cyan
======
# os details
regexp=(OS details:)
colours=cyan
======
# MAC
regexp=(MAC Address:)
colours=cyan
======
# network distance
regexp=(Network Distance:)
colours=cyan
======
# Service Info
regexp=(Service Info:)
colours=cyan
======
# Agressive
regexp=(Aggressive OS guesses:)
colours=cyan
======
# no exact match
regexp=(No exact OS matches for host)
colours=magenta
Как видно из нашего конфига, правила задаются в виде регулярных выражений (regexp=). Именно с помощью них grc определяет, каким цветом (colours=) нужно вывести вхождение, подходящее под regexp. Чтобы отделить регулярки друг от друга
используйте ======
.
Итак, правила для nmap есть, но если сейчас мы выполним grc nmap
, то мы не получим ожидаемого результата. Ведь grc еще не знает, что для nmap нужно использовать свои собственные правила и будет брать их из conf.other, а они не дадут нам того, что нам нужно.
Чтобы исправить ситуацию, редактируем главный конфиг grc ~/.grc.conf (или /etc/grc.conf, чтобы все пользователи могли пользоваться правилами для nmap). Просто добавляем в этот файл:
# nmap command
(^|[/w.]+/)nmaps?
conf.nmap
Вторая строчка — это регулярное выражение, на которое будет проверяться вызываемая через grc команда. Если команда будет подходить под это выражение, то к ней будут применены правила из файла conf.nmap.
Последнее, что осталось сделать, это создать альяс в конфиге оболочки:
alias nmap='grc nmap'
Вот и все. Теперь вы можете раскрасить все используемые вами программы по своему вкусу.
Цветной вывод mysql-client
Рекомендую к прочтению хабратопик Разукрашиваем вывод mysql-client в консоли, из которого вы узнаете, как с помощью того же grc сделать вывод mysql-client более понятным.
На этом все. Надеюсь, теперь ваша работа в терминале станет более комфортной и не такой однообразной.
Автор: lirvux