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

StackOverflow https://stackoverflow.com/questions/157959

  •  03-07-2019
  •  | 
  •  

Вопрос

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

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

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

Это было полезно?

Решение

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

#!/bin/sh

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

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

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 "$@"

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

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

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

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

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

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

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

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

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

Это должно быть внесено в ваш ~/.bash_profile ~.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 используется для обработки выхода для сброса цвета фона.

Комбинирование ответов 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 [ "$1" != "Basic" ]; then
    trap on_exit EXIT;
  fi
  osascript ~/Dropbox/macCommands/StyleTerm.scpt "$1"
}

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

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

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

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

#touch .bashrc

Затем вы можете открыть .bashrc в TextEdit или в Текстовый редактор и добавьте предыдущие команды.

Другое решение - установить цвета прямо в файле конфигурации 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}"

Терминалы 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= зеленый и т.д.Таким образом, этот фрагмент, помещенный в shared .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 $1"
}

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

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

Почему бы просто не изменить приглашение командной строки всякий раз, когда вы входите в систему через SSH?Обычно существуют определенные переменные оболочки: SSH_CLIENT (КЛИЕНТ), SSH_CONNECTION ( СОЕДИНЕНИЕ), SSH_TTY

Установите цвета терминала в настройках сервера. /.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 получит выгоду от этого, не делая это частью процесса адаптации.

Отлично работает.

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

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

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

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

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

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

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

  • Черный:30 м
  • Красный:31 м
  • Зеленый:32 м
  • Желтый:33 м
  • Синий:34м
  • Фиолетовый:35 м
  • Голубой:36 м
  • Белый:37 м
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top