Как сделать так, чтобы цветовая схема окна терминала Apple менялась автоматически при подключении ssh к определенному серверу

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

Как я могу заставить его автоматически определять, что я где-то использовал ssh, и если это где-то находится в определенном списке, изменить цветовую схему?

Я хочу обновить схему Terminal.app, не знаю, как бы это сделать в чистом env linux / unix

Почему чистое решение linux / unix плохо?

Milhous 01.10.2008 23:30

@Milhous Потому что Terminal.app OS X предлагает гораздо больше настроек стиля, чем настройки на основе * nix, от цвета шрифта и ANSI до межстрочного интервала и символа, цвета фона, непрозрачности и размытия. Стили терминала выглядят действительно хорошо, если их настроить со вкусом, и многие из нас, пользователей OS X, любят, чтобы наши компьютеры выглядели так, будто они из 2010-х, а не 1980-х.

Slipp D. Thompson 14.07.2015 22:51
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
48
2
18 571
10
Перейти к ответу Данный вопрос помечен как решенный

Ответы 10

Почему бы просто не изменить приглашение оболочки всякий раз, когда вы входите в систему через SSH? Обычно существуют определенные переменные оболочки: SSH_CLIENT, SSH_CONNECTION, SSH_TTY

Вы можете установить переменную $ PS1 в своем .bashrc.

red='\e[0;31m'
PS1 = "$\[${red}\]"

Обновлено: Для этого откройте Терминал. Тогда скажи

#touch .bashrc

Затем вы можете открыть .bashrc в textEdit или TextWrangler и добавить предыдущие команды.

Как именно это сделать и откуда терминал Apple знает, что нужно менять цветовую схему

Laurie Young 01.10.2008 18:53

создайте файл ~ / .bashrc на сервере, который вы хотите изменить на красный. (не на вашем Mac)

davr 01.10.2008 19:46

Терминалы Unix, совместимые с Xterm, имеют стандартные escape-последовательности для установки цветов фона и переднего плана. Я не уверен, разделяет ли их Terminal.app; должно.

case $HOSTNAME in
    live1|live2|live3) echo -e '\e]11;1\a' ;;
    testing1|testing2) echo -e '\e]11;2\a' ;;
esac

Второе число указывает желаемый цвет. 0 = по умолчанию, 1 = красный, 2 = зеленый и т. д. Таким образом, этот фрагмент, помещенный в общий .bashrc, даст вам красный фон на действующих серверах и зеленый фон на тестовых. Вы также должны добавить что-то подобное, чтобы сбросить фон при выходе из системы.

on_exit () {
    echo -e '\e]11;0\a'
}
trap on_exit EXIT

Обновлено: Google нашел способ установить цвет фона с помощью AppleScript. Очевидно, это работает только при запуске на том же компьютере, что и Terminal.app. Вы можете обойти это с помощью пары функций-оберток:

set_bg_color () {
    # color values are in '{R, G, B, A}' format, all 16-bit unsigned integers (0-65535)
    osascript -e "tell application \"Terminal\" to set background color of window 1 to "
}

sshl () {
    set_bg_color "{45000, 0, 0, 50000}"
    ssh "$@"
    set_bg_color "{0, 0, 0, 50000}"
}

Вам нужно не забыть запустить sshl вместо ssh при подключении к живому серверу. Другой вариант - написать функцию-оболочку для ssh, которая сканирует свои аргументы на предмет известных живых имен хостов и соответственно устанавливает фон.

Ссылка битая, боюсь :(

Joe 07.10.2014 16:38
Ответ принят как подходящий

Поместите следующий скрипт в ~/bin/ssh (убедитесь, что ~/bin/ проверен перед /usr/bin/ в вашем PATH):

#!/bin/sh

HOSTNAME=`echo $@ | sed s/.*@//`

set_bg () {
  osascript -e "tell application \"Terminal\" to set background color of window 1 to "
}

on_exit () {
  set_bg "{0, 0, 0, 50000}"
}
trap on_exit EXIT

case $HOSTNAME in
  production1|production2|production3) set_bg "{45000, 0, 0, 50000}" ;;
  *) set_bg "{0, 45000, 0, 50000}" ;;
esac

/usr/bin/ssh "$@"

Не забудьте сделать скрипт исполняемым, запустив chmod +x ~/bin/ssh.

Приведенный выше сценарий извлекает имя хоста из строки «username @ host» (предполагается, что вы входите на удаленные хосты с помощью «ssh user @ host»).

Затем, в зависимости от имени хоста, он устанавливает красный фон (для производственных серверов) или зеленый фон (для всех остальных). В результате все ваши окна ssh будут с цветным фоном.

Я предполагаю, что здесь ваш фон по умолчанию черный, поэтому скрипт меняет цвет фона обратно на черный при выходе из системы с удаленного сервера (см. «Trap on_exit»).

Обратите внимание, однако, что этот скрипт не отслеживает цепочку входов ssh с одного хоста на другой. В результате фон станет зеленым, если вы сначала войдете на тестовый сервер, а затем войдете в продакшн с него.

Вы, сэр, только что сделали мой день.

Pablo Diaz 01.03.2013 00:06

Это нормально, но меняет фон каждого терминала, а не только текущий. Есть какие-нибудь подсказки по этому поводу?

yves amsellem 07.07.2015 17:52

Менее известной особенностью Терминала является то, что вы можете установить имя профиля настроек для имени команды, и он выберет этот профиль при создании нового терминала через Оболочка> Новая команда… или Оболочка> Новое удаленное подключение….

Например, продублируйте свой профиль по умолчанию, назовите его «ssh» и установите для него красный цвет фона. Затем используйте Новая команда… для запуска ssh host.example.com.

Он также совпадает по аргументам, поэтому вы можете, например, выбрать разные настройки для разных удаленных хостов.

Не могу поверить, насколько это полезно. Как раз то, что я искал.

Pascal 22.02.2014 23:43

Для меня это лучший ответ. примечательно, что имя профиля может быть регулярным выражением, например 'ssh. * myserver. *' соответствует 'ssh myserver', 'ssh -p 22 myserver.foo.com' и т. д.

robm 09.01.2015 12:49

Отлично работает на Sierra. Пытаюсь выяснить, могу ли я где-нибудь сократить ssh вместо того, чтобы каждый раз открывать новое удаленное соединение

George 11.03.2018 01:40

к сожалению, это оставляет цвет, установленный после завершения сеанса SSH (например, если терминал повторно открывает окна после перезагрузки или соединение разрывается).

Dan W 06.10.2020 13:03

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

Это должно быть записано в ваш ~ / .bash_profile

# Convert 8 bit r,g,b,a (0-255) to 16 bit r,g,b,a (0-65535)
# to set terminal background.
# r, g, b, a values default to 255
set_bg () {
    r=${1:-255}
    g=${2:-255}
    b=${3:-255}
    a=${4:-255}

    r=$(($r * 256 + $r))
    g=$(($g * 256 + $g))
    b=$(($b * 256 + $b))
    a=$(($a * 256 + $a))

    osascript -e "tell application \"Terminal\" to set background color of window 1 to {$r, $g, $b, $a}"
}

# Set terminal background based on hex rgba values
# r,g,b,a default to FF
set_bg_from_hex() {
    r=${1:-FF}
    g=${2:-FF}
    b=${3:-FF}
    a=${4:-FF}

    set_bg $((16#$r)) $((16#$g)) $((16#$b)) $((16#$s))
}

# Wrapping ssh command with extra functionality
ssh() {
    # If prod server of interest, change bg color
    if ...some check for server list
    then
        set_bg_from_hex 6A 05 0C
    end

    # Call original ssh command
    if command ssh "$@"
    then
        # on exit change back to your default
        set_bg_from_hex 24 34 52
    fi
}
  • set_bg - принимает 4 (8 битных) значения цвета
  • set_bg_from_hex - принимает 4 шестнадцатеричных значения. большинство моих цветовых ссылок, которые я использую, в шестнадцатеричном формате, так что это просто облегчает мне задачу. Можно было бы сделать еще один шаг, чтобы фактически проанализировать #RRGGBB вместо RR GG BB, но для меня это работает хорошо.
  • ssh - обертывание команды ssh по умолчанию любой настраиваемой логикой, которую вы хотите. Оператор if используется для обработки выхода для сброса цвета фона.

вы можете использовать osascript -e "tell application \"Terminal\" to get background color of window 1" для получения исходных цветов (в десятичном формате)

AlexChaffee 11.12.2015 20:17

Другое решение - установить прямые цвета в файле конфигурации ssh:

внутри ~ / .ssh / config

Host Server1
   HostName x.x.x.x
   User ubuntu
   IdentityFile ~/Desktop/keys/1.pem
   PermitLocalCommand yes
   LocalCommand osascript -e "tell application \"Terminal\" to set background color of window 1 to {27655, 0, 0, -16373}"

Host Server2
   HostName x.x.x.x
   User ubuntu
   IdentityFile ~/Desktop/keys/2.pem
   PermitLocalCommand yes
   LocalCommand osascript -e "tell application \"Terminal\" to set background color of window 1 to {37655, 0, 0, -16373}"

Это должен быть принятый ответ. Безусловно, самое простое.

Bob Woodley 07.08.2018 21:47

Проблема с этим решением заключается в том, что оно не меняет цвет обратно после выхода из сеанса ssh. Однако мне удалось преодолеть это ограничение с помощью простого инструмента: github.com/drinchev/phook. Это моя строка в ~/.ssh/config: LocalCommand phook -a "osascript -e 'tell application \"Terminal\" to set current settings of window 1 to settings set \"Basic\"'" -e "osascript -e 'tell application \"Terminal\" to set current settings of window 1 to settings set \"SSH-Yellow\"'"

Kuba Wyrostek 03.01.2019 15:29

Объединяя ответы 1 и 2, получаем следующее:

Создайте файл ~/bin/ssh, как описано в 1, со следующим содержимым:

#!/bin/sh
# https://stackoverflow.com/a/39489571/1024794
log(){
  echo "$*" >> /tmp/ssh.log
}
HOSTNAME=`echo $@ | sed s/.*@//`
log HOSTNAME=$HOSTNAME
# to avoid changing color for commands like `ssh user@host "some bash script"`
# and to avoid changing color for `git push` command:
if [ $# -gt 3 ] || [[ "$HOSTNAME" = *"git-receive-pack"* ]]; then
  /usr/bin/ssh "$@"
  exit $? 
fi

set_bg () {
  if [ "" != "Basic" ]; then
    trap on_exit EXIT;
  fi
  osascript ~/Dropbox/macCommands/StyleTerm.scpt ""
}

on_exit () {
  set_bg Basic
}


case $HOSTNAME in
  "178.222.333.44 -p 2222") set_bg "Homebrew" ;;
  "178.222.333.44 -p 22") set_bg "Ocean" ;;
  "192.168.214.111") set_bg "Novel" ;;
  *) set_bg "Grass" ;;
esac

/usr/bin/ssh "$@"

Сделайте его исполняемым: chmod +x ~/bin/ssh.

Файл ~/Dropbox/macCommands/StyleTerm.scpt имеет следующее содержимое:

#https://superuser.com/a/209920/195425
on run argv
  tell application "Terminal" to set current settings of selected tab of front window to first settings set whose name is (item 1 of argv)
end run

Слова Basic, Homebrew, Ocean, Novel, Grass взяты из настроек терминала Mac OS cmd,: terminal profiles

Вы должны изменить цвет имени пользователя и имени хост-машины.

добавьте в файл ~/.bash_profile следующую строку:

export PS1 = " \[3[34m\]\u@\h \[3[33m\]\w\[3[31m\]\[3[00m\] $ "

первая часть (фиолетовый) - это то, что вы ищете.

Предварительный просмотр:

Это мои предпочтительные цвета. Вы можете настроить цвет каждой части приглашения, изменив коды m (например, 34m), которые являются цветовыми кодами ANSI.

Список цветовых кодов ANSI:

  • Черный: 30 м
  • Красный: 31м
  • Зеленый: 32м
  • Желтый: 33 м
  • Синий: 34 м
  • Фиолетовый: 35 м
  • Голубой: 36 м
  • Белый: 37 м

Установите цвета терминала в /.bashrc сервера

Мне нужно было то же самое, что-то, чтобы я знал, что я нахожусь на промежуточном или производственном сервере, а не в своей среде разработки, что может быть очень сложно определить, особенно когда я использую консоль Ruby или что-то в этом роде.

Для этого я использовал команду setterm в файле ~./bashrc моего сервера, чтобы инвертировать цвета терминала при подключении и восстанавливать цвета при выходе.

~ / .bashrc

# Inverts console colours so that we know that we are in a remote server. 
# This is very important to avoid running commands on the server by accident.
setterm --inversescreen on

# This ensures we restore the console colours after exiting.
function restore_screen_colours {
  setterm --inversescreen off
}
trap restore_screen_colours EXIT

Затем я помещаю это в файлы ~/.bashrc всех серверов, чтобы знать, находится ли мой терминал на удаленном сервере или нет.

Еще один бонус заключается в том, что любой из ваших разработчиков или разработчиков DevOps получает выгоду от этого, не делая это частью процесса адаптации.

Прекрасно работает.

Все остальные ответы у меня не сработали, а вот этот. Спасибо, сэр!

ripper234 15.08.2018 20:07

@ ripper234 Добро пожаловать! Рад, что вы нашли его здесь, в списке. :)

Joshua Pinter 16.08.2018 00:46

Есть идеи, как настроить его так, чтобы он был красным / желтым в производственных / промежуточных средах?

ripper234 16.08.2018 15:12

@ ripper234 Не уверен, но я уверен, что вы можете использовать части других ответов, чтобы изменить цвет фона или что-то в этом роде.

Joshua Pinter 17.08.2018 21:24

Другие вопросы по теме