Когда я подключаюсь по ssh к удаленному производственному серверу, я хотел бы, чтобы цветовая схема моего окна терминала изменилась на что-то яркое и пугающее, предпочтительно красное, чтобы предупредить меня о том, что я прикасаюсь к живому страшному серверу.
Как я могу заставить его автоматически определять, что я где-то использовал ssh, и если это где-то находится в определенном списке, изменить цветовую схему?
Я хочу обновить схему Terminal.app, не знаю, как бы это сделать в чистом env linux / unix
@Milhous Потому что Terminal.app OS X предлагает гораздо больше настроек стиля, чем настройки на основе * nix, от цвета шрифта и ANSI до межстрочного интервала и символа, цвета фона, непрозрачности и размытия. Стили терминала выглядят действительно хорошо, если их настроить со вкусом, и многие из нас, пользователей OS X, любят, чтобы наши компьютеры выглядели так, будто они из 2010-х, а не 1980-х.
Почему бы просто не изменить приглашение оболочки всякий раз, когда вы входите в систему через SSH? Обычно существуют определенные переменные оболочки: SSH_CLIENT, SSH_CONNECTION, SSH_TTY
Вы можете установить переменную $ PS1 в своем .bashrc.
red='\e[0;31m'
PS1 = "$\[${red}\]"
Обновлено: Для этого откройте Терминал. Тогда скажи
#touch .bashrc
Затем вы можете открыть .bashrc в textEdit или TextWrangler и добавить предыдущие команды.
Как именно это сделать и откуда терминал Apple знает, что нужно менять цветовую схему
создайте файл ~ / .bashrc на сервере, который вы хотите изменить на красный. (не на вашем Mac)
Терминалы 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, которая сканирует свои аргументы на предмет известных живых имен хостов и соответственно устанавливает фон.
Ссылка битая, боюсь :(
Поместите следующий скрипт в ~/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 с одного хоста на другой. В результате фон станет зеленым, если вы сначала войдете на тестовый сервер, а затем войдете в продакшн с него.
Вы, сэр, только что сделали мой день.
Это нормально, но меняет фон каждого терминала, а не только текущий. Есть какие-нибудь подсказки по этому поводу?
Менее известной особенностью Терминала является то, что вы можете установить имя профиля настроек для имени команды, и он выберет этот профиль при создании нового терминала через Оболочка> Новая команда… или Оболочка> Новое удаленное подключение….
Например, продублируйте свой профиль по умолчанию, назовите его «ssh» и установите для него красный цвет фона. Затем используйте Новая команда… для запуска ssh host.example.com
.
Он также совпадает по аргументам, поэтому вы можете, например, выбрать разные настройки для разных удаленных хостов.
Не могу поверить, насколько это полезно. Как раз то, что я искал.
Для меня это лучший ответ. примечательно, что имя профиля может быть регулярным выражением, например 'ssh. * myserver. *' соответствует 'ssh myserver', 'ssh -p 22 myserver.foo.com' и т. д.
Отлично работает на Sierra. Пытаюсь выяснить, могу ли я где-нибудь сократить ssh вместо того, чтобы каждый раз открывать новое удаленное соединение
к сожалению, это оставляет цвет, установленный после завершения сеанса SSH (например, если терминал повторно открывает окна после перезагрузки или соединение разрывается).
Вот комбинированное решение, основанное на нескольких существующих ответах, которые обрабатывают выход. Также включает в себя небольшую дополнительную информацию, если вы не хотите иметь дело с 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
}
вы можете использовать osascript -e "tell application \"Terminal\" to get background color of window 1"
для получения исходных цветов (в десятичном формате)
Другое решение - установить прямые цвета в файле конфигурации 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}"
Это должен быть принятый ответ. Безусловно, самое простое.
Проблема с этим решением заключается в том, что оно не меняет цвет обратно после выхода из сеанса 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\"'"
Объединяя ответы 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,:
Вы должны изменить цвет имени пользователя и имени хост-машины.
добавьте в файл ~/.bash_profile
следующую строку:
export PS1 = " \[3[34m\]\u@\h \[3[33m\]\w\[3[31m\]\[3[00m\] $ "
первая часть (фиолетовый) - это то, что вы ищете.
Это мои предпочтительные цвета. Вы можете настроить цвет каждой части приглашения, изменив коды m
(например, 34m
), которые являются цветовыми кодами ANSI.
Список цветовых кодов ANSI:
/.bashrc
сервераМне нужно было то же самое, что-то, чтобы я знал, что я нахожусь на промежуточном или производственном сервере, а не в своей среде разработки, что может быть очень сложно определить, особенно когда я использую консоль Ruby или что-то в этом роде.
Для этого я использовал команду setterm
в файле ~./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 Добро пожаловать! Рад, что вы нашли его здесь, в списке. :)
Есть идеи, как настроить его так, чтобы он был красным / желтым в производственных / промежуточных средах?
@ ripper234 Не уверен, но я уверен, что вы можете использовать части других ответов, чтобы изменить цвет фона или что-то в этом роде.
Почему чистое решение linux / unix плохо?