Как сделать так, чтобы окно терминала Apple автоматически меняло цветовую схему при подключении к серверу SSH? - PullRequest
42 голосов
/ 01 октября 2008

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

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

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

Ответы [ 10 ]

50 голосов
/ 03 октября 2008

Поместите следующий скрипт в ~/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 $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 с одного хоста на другой. В результате фон будет зеленым, если вы сначала войдете на тестовый сервер, а затем войдите в систему с него.

29 голосов
/ 11 сентября 2013

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

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

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

7 голосов
/ 24 сентября 2015

Вот комбинированное решение, основанное на паре существующих ответов, которые обрабатывают выход. Также включает в себя немного больше, если вы не хотите иметь дело с 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 используется для обработки выхода для сброса цвета фона.
6 голосов
/ 14 сентября 2016

Комбинированные ответы 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

5 голосов
/ 29 декабря 2015

Другое решение состоит в том, чтобы установить цветовую полосу в конфигурационном файле 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}"
5 голосов
/ 01 октября 2008

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

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

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

#touch .bashrc

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

2 голосов
/ 01 октября 2008

Xterm-совместимые терминалы Unix имеют стандартные 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 $1"
}

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

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

1 голос
/ 28 апреля 2018

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

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

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

1 голос
/ 01 октября 2008

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

0 голосов
/ 14 января 2018

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

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

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

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

Preview: enter image description here

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

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

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