MacOS – Change background of terminal based on host

macossshterminal

Is there a way I can have my terminal dynamically change covers based on the host I am on? For example, the default background (as determined by terminal profile) is black. Maybe there is another terminal profile that is the exact same except that it has a blue background. Now, if I SSH from black_host which is the default into blue_host, my terminal profile switches (or the background changes from black to blue).

Is this possible? I often have anywhere from 5-10 terminals open at a time on 3-4 different machines and it would be nice to just look and see from a birds eye view which terminal belongs to which host.

Best Answer

I believe this is exactly what you want:

https://stackoverflow.com/questions/157959/how-do-i-make-the-apple-terminal-window-auto-change-colour-scheme-when-i-ssh-to

All credit goes to Yurii Soldak:

Put following script in ~/bin/ssh (ensure ~/bin/ looked 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 "$@"

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.

In the same post, Chris Page writes:

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.