Подтвердить что ты не робот

Как сделать окно окна Apple автоматически изменением цветовой схемы, когда я ssh на конкретный сервер

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

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

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

4b9b3361

Ответ 1

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

#!/bin/sh

HOSTNAME=`echo [email protected] | 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 "[email protected]"

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

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

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

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

Ответ 2

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

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

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

Ответ 3

Здесь комбинированное решение, основанное на нескольких существующих ответах, которые обрабатывают выход. Также включает немного дополнительных, если вы не хотите иметь дело с 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 "[email protected]"
    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 используется для обработки выхода на reset цвета фона.

Ответ 4

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

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

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

#touch .bashrc

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

Ответ 5

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

Ответ 6

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

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

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

Сделайте его исполняемым: 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 ts cmd ,: профили терминалов

Ответ 7

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, даст вам красный фон на живых серверах и зеленый фон для тестирования. Вы также должны добавить что-то вроде этого в reset фон при выходе из системы.

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 "[email protected]"
    set_bg_color "{0, 0, 0, 50000}"
}

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

Ответ 8

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