How do I make the apple terminal window auto change colour scheme when I ssh to a specific server
Put following script in ~/bin/ssh
(ensure ~/bin/
is checked before /usr/bin/
in your 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 "$@"
Remember to make the script executable by running chmod +x ~/bin/ssh
The script above extracts host name from line "username@host" (it assumes you login to remote hosts with "ssh user@host").
Then depending on host name it either sets red background (for production servers) or green background (for all other). As a result all your ssh windows will be with colored background.
I assume here your default background is black, so script reverts the background color back to black when you logout from remote server (see "trap on_exit").
Please, note however this script does not track chain of ssh logins from one host to another. As a result the background will be green in case you login to testing server first, then login to production from it.
A lesser-known feature of Terminal is that you can set the name of a settings profile to a command name and it will select that profile when you create a new terminal via either Shell > New Command… or Shell > New Remote Connection….
For example, duplicate your default profile, name it “ssh” and set its background color to red. Then use New Command… to run ssh host.example.com
.
It also matches on arguments, so you can have it choose different settings for different remote hosts, for example.
Here's a combined solution based on a couple of existing answers that handles the exit. Also includes a little extra if you don't want to deal with 16 bit color values.
This should be put in your ~/.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 - takes 4 (8 bit) color values
- set_bg_from_hex - takes 4 hex values. most of my color references I use are in hex, so this just makes it easier for me. It could be taken a step further to actually parse #RRGGBB instead of RR GG BB, but it works well for me.
- ssh - wrapping the default ssh command with whatever custom logic you want. The if statement is used to handle the exit to reset the background color.