iTerm и разные цвета для разных окружений

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

Например, была такая проблема у GitLab вроде - их падаван перепутал сервера и случайно удалил продовскую БД. И сразу в комментариях, помнится, появились люди в белых плащах и с нимбами над головой, которые всегда делают проверки перед любой, даже самой простой операцией. Но тут типа штука щекотливая и сложная - вот что значит проверка, если ты её просто забываешь сделать? Естественно, можно сказать что надо нанимать тех кто не забывает, но блин, мы же люди, а значит ошибаемся постоянно. И в итоге задача сводится не к тому чтобы избежать ошибок, а к тому чтобы уменьшить количество ошибок.

И как способ избежания ошибок мне приглянулся вариант с сменой цвета командной строки на удаленном сервере. Для этого на продакшн серверах создаём файлик /etc/profile.d/color.sh с контентом типа

#!/bin/sh
export PROMPT_COMMAND="export PS1='\[\e[1;31m\][\u@\h \W]\$\[\e[0m\] '"

Ну или можно просто изменить PS1 переменную в конкретных ~/.bashrc файлах у каждого пользователя. Выглядит всё примерно так:

Красный цвет это хорошо, красный цвет это надёжно. А для staging окружения можно сделать консоль желтой. Но что будет если мы на сервере зайдём в консоль mysql и попробуем удалить базу данных или начнём редактировать файл при помощи vim? Будем ли мы понимать что это за окружение?

Как вы видели выше - при логине на сервер у меня меняется название вкладки - чтобы и у вас такое происходило, в iTerm надо зайти в настройки Profile и в подвкладке General изменить Title на Name.

Недостаточно хорошо

Лучше бы вообще изменить цвет фона на красный, чтобы когда мы подключались к проду весь терминал становился красноватым. К счастью iTerm позволяет это сделать даже штатными средствами - в вкладке Profiles и подвкладке Advanced можно настроить тригеры и автоматическое переключение профайлов. Но я ленивый и люблю всё менять и хочу хранить всё как код, а не кликать в гуи 100500 профайлов. Поэтому я буду просто менять цвет фона в зависимости от того куда я иду.

Давайте создадим файлик ~/.oh-my-zsh/custom/color.zsh (я пользуюсь zsh на машине, но вы можете просто сделать тоже самое и для bash) с таким содержанием:

function reset_tab() {
    echo -e "\033]50;SetProfile=Default\a"
    trap - INT EXIT
}

function colorssh() {
    if [[ -n "$ITERM_SESSION_ID" ]]; then
        trap "reset_tab" INT EXIT
        if [[ "$*" =~ ".*ctrlok.com" ]]; then
          printf "\e]1337;SetColors=bg=451f28\a"
        fi
    fi
    ssh $*
}
compdef _ssh tabc=ssh

alias ssh="colorssh"

Что он делает?

Первым делом мы создаём алиас с ssh на функцию colorssh, которая парсит аргументы и если видит там что-то похожее на ctrlok.com - меняет цвет фона на 451f28. Соответственно таких правил для любых окружений может быть сколько угодно. Давайте посмотрим как это выглядит:

Вроде симпатично.

И кстати, вот эту последовательность можно вызывать и с удалённого сервера (если вы ходите на сервера по ip, например).

Для этого на удаленном сервере в /etc/profile.d/color.sh (который мы создали раньше ) или в ~/.bashrc добавим

printf '\e]1337;SetColors=bg=451f28\a'

И теперь уже удаленный сервер контролирует какого цвета у нас фон

И сбоку бантик

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

printf "\e]1337;SetBadgeFormat=%s\a" $(echo -n "\(session.name)" | base64)

Выглядит всё вот так:

А итоговый скрипт выглядит так:

function reset_tab() {
    echo -e "\033]50;SetProfile=Default\a"
    trap - INT EXIT
}

function colorssh() {
    if [[ -n "$ITERM_SESSION_ID" ]]; then
        trap "reset_tab" INT EXIT
        if [[ "$*" =~ ".*ctrlok.com" ]]; then
          printf "\e]1337;SetBadgeFormat=%s\a" $(echo -n "\(session.name)" | base64)
           printf "\e]1337;SetColors=bg=451f28\a"
        fi
    fi
    ssh $*
}
compdef _ssh tabc=ssh

alias ssh="colorssh"

А как вы разделяете терминал по цветам?