Как автоматически изменить фон терминала, основываясь на имени хоста ssh?

9

Как можно программно изменить цвет фона окна терминала, основываясь на имени хоста, в который вы входите?

То есть, когда я подключаюсь к встроенным системам реального времени на производственном оборудовании, я хочу, чтобы фон терминала изменился на красный, чтобы «поддерживать осведомленность» о том, на каком сервере я работаю. Наличие только имени хоста в PS1 не всегда достаточно.

Я использую gnome-терминал, но приму любое работоспособное решение под Linux.

Mtl Dev
источник

Ответы:

7

Вы можете использовать команду ssh LocalCommand для выдачи escape-последовательности ANSI для изменения цвета фона и иметь раздел для каждого хоста (или шаблона хоста), чтобы выбрать соответствующий цвет, который вы хотите соответствовать удаленному хосту.

Если ваши рабочие серверы следуют соглашению об именах, например «начинается с prod», вы можете попробовать следующий фрагмент в файле ~ / .ssh / config: Host prod* PermitLocalCommand yes LocalCommand printf "\x1b[41m\x1b[2JPRODUCTION SYSTEM [%n]\n\n"

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

После подключения к хосту, который соответствует шаблону, соответствующий printf будет выполняться локально, изменяя цвет фона на красный ([41m выбирает красный в качестве цвета фона, часть [2J перерисовывает весь экран с обновленным цветом фона. См. https://en.wikipedia.org/wiki/ANSI_escape_code для многих других вариантов)

Самым большим неудобством этого подхода является то, что цвет фона сохраняется при выходе из сеанса ssh; Нет аналога LocalCommand для запуска при разъединении (о чем я знаю). Скрипт псевдонима или оболочки для ssh может вызываться printf "\x1b[0m"как сброс. С другой стороны, установка цвета фона с помощью LocalCommand означает, что вы получите набор цветов, даже если ssh не запускается через скрипт-оболочку или псевдоним.

PKapp
источник
Отличный ответ! Единственная проблема, которую я вижу, которая, однако, является существенной, заключается в том, что изменение цвета остается только для первого «экрана». Как только команды введены и экран прокручивается вверх, он переходит с красного на черный. Возможно, контроль цвета терминала gnome имеет приоритет над управляющей последовательностью ANSI? Вы знаете обходной путь?
Mtl Dev
Возможно ли сделать что-то похожее на переменную приглашения PS1 на хосте SSH?
Mtl Dev
Сброс может быть вызван последовательностями либо в вашей переменной приглашения PS1, либо если у вас есть команды, подобные lsпсевдонимам, ls --color=autoи они включают последовательность сброса «<ESC> [0m». Чтобы сохранить это, вам, вероятно, потребуется настроить различные профили gnome-терминала и пойти по маршруту сценария оболочки, выбрав имя профиля на основе имени хоста и вызвав егоgnome-terminal --profile=$PROFILE_NAME -e ssh $HOST &
PKapp
Вы совершенно правы: если у меня есть ls --colourИЛИ последовательность сброса в PS1, то один из них переопределит предыдущие настройки цвета ANSI. Поэтому я посмотрю на реализацию предложенного вами сценария-обертки, что тоже является отличной идеей! Merci Beaucoup!
Mtl Dev
Просто так знают: добавление printf в ~ / .ssh / config, кажется, нарушает rsync. Связанные детали здесь: serverfault.com/questions/267154/…
Mtl Dev