Как мне заставить окно терминала Apple автоматически менять цветовую схему при подключении по ssh к определенному серверу
-
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,:
Вы можете установить переменную $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\] $ "
Тот Самый первая часть (фиолетовый цвет) - это то, что вы ищете.
Это мои любимые цвета.Вы можете настроить цвет каждой части приглашения, изменив m
коды (например, 34m
), которые являются цветовыми кодами ANSI.
Список цветовых кодов ANSI:
- Черный:30 м
- Красный:31 м
- Зеленый:32 м
- Желтый:33 м
- Синий:34м
- Фиолетовый:35 м
- Голубой:36 м
- Белый:37 м