web-dev-qa-db-ja.com

特定のサーバーにSSH接続したときにAppleターミナルウィンドウの配色を自動変更するようにするにはどうすればよいですか?

リモートの本番サーバーにSSHで接続するときは、ターミナルウィンドウの配色を明るく怖いもの、できれば赤に変更して、ライブの怖いサーバーに触れていることを警告します。

どこかでsshを実行したことを自動的に検出し、そのどこかが特定のリストにある場合は、配色を変更するにはどうすればよいですか?

Terminal.appのスキームを更新したいのですが、純粋なlinux/unix環境でこれを行う方法がわかりません

43
Laurie Young

次のスクリプトを~/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」からホスト名を抽出します(「sshuser @ Host」を使用してリモートホストにログインすることを前提としています)。

次に、ホスト名に応じて、赤の背景(本番サーバーの場合)または緑の背景(その他すべての場合)を設定します。その結果、すべてのsshウィンドウは色付きの背景になります。

ここでは、デフォルトの背景が黒であると想定しているため、リモートサーバーからログアウトすると、スクリプトは背景色を黒に戻します(「trapon_exit」を参照)。

ただし、このスクリプトは、あるホストから別のホストへのsshログインのチェーンを追跡しないことに注意してください。その結果、最初にテストサーバーにログインしてから本番サーバーにログインした場合、背景は緑色になります。

50
Yurii Soldak

ターミナルのあまり知られていない機能は、設定プロファイルの名前をコマンド名に設定でき、シェル>新しいコマンド…または-のいずれかを使用して新しいターミナルを作成するときにそのプロファイルを選択することです。 シェル>新しいリモート接続…

たとえば、デフォルトのプロファイルを複製し、「ssh」という名前を付けて、背景色を赤に設定します。次に、新しいコマンド…を使用してssh Host.example.comを実行します。

また、引数にも一致するため、たとえば、リモートホストごとに異なる設定を選択させることができます。

29
Chris Page

これは、出口を処理するいくつかの既存の回答に基づく組み合わせソリューションです。 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
}
  • set_bg-4(8ビット)のカラー値を取ります
  • set_bg_from_hex-4つの16進値を取ります。私が使用するカラーリファレンスのほとんどは16進数であるため、これにより簡単になります。 RR GG BBの代わりに#RRGGBBを実際に解析するために、さらに一歩踏み出すことができますが、それは私にとってはうまく機能します。
  • ssh-デフォルトのsshコマンドを必要なカスタムロジックでラップします。 ifステートメントは、出口を処理して背景色をリセットするために使用されます。
7
bingles

答えを組み合わせる 12 は次のとおりです。

作成~/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はmacos端末設定からのものです cmd,terminal profiles

6
Maxim Yefremov

.bashrcで$ PS1変数を設定できます。

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

編集:これを行うには、ターミナルを開きます。次に言う

#touch .bashrc

次に、textEditまたは TextWrangler で.bashrcを開き、前のコマンドを追加できます。

5
Milhous

別の解決策は、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}"
5
arnon cohen

Xterm互換のUnix端末には、背景色と前景色を設定するための標準のエスケープシーケンスがあります。 Terminal.appがそれらを共有しているかどうかはわかりません。そうすべき。

case $HOSTNAME in
    live1|live2|live3) echo -e '\e]11;1\a' ;;
    testing1|testing2) echo -e '\e]11;2\a' ;;
esac

2番目の数字は、目的の色を指定します。 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 $1"
}

sshl () {
    set_bg_color "{45000, 0, 0, 50000}"
    ssh "$@"
    set_bg_color "{0, 0, 0, 50000}"
}

ライブサーバーに接続するときは、sshではなくsshlを実行することを忘れないでください。別のオプションは、既知のライブホスト名の引数をスキャンし、それに応じてバックグラウンドを設定するsshのラッパー関数を作成することです。

2
skymt

SSH経由でログインするたびにシェルプロンプトを変更しないのはなぜですか?通常、特定のシェル変数があります:SSH_CLIENTSSH_CONNECTIONSSH_TTY

1
unexist

サーバーの/.bashrcで端末の色を設定します

同じことが必要でした。開発環境ではなく、ステージングサーバーまたは本番サーバーにいることを認識させるためのものでした。これは、特にRubyコンソールの場合は非常にわかりにくい場合があります。か何か。

これを実現するために、サーバーの~./bashrcファイルで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ファイルに入れて、端末がリモートサーバー上にあるかどうかを確認します。

もう1つのボーナスは、開発チームまたはDevOpsチームが、オンボーディングプロセスの一部にすることなく、このメリットを享受できることです。

うまくいきます。

1
Joshua Pinter

ユーザー名とホストマシン名の色を変更する必要があります。

~/.bash_profileファイルに次の行を追加します。

export PS1=" \[\033[34m\]\u@\h \[\033[33m\]\w\[\033[31m\]\[\033[00m\] $ "

最初の部分(紫色)はあなたが探しているものです。

プレビュー:enter image description here

これは私の好みの色です。 ANSIカラーコードであるmコード(例:34m)を変更することで、プロンプトの色の各部分をカスタマイズできます。

ANSIカラーコードのリスト:

  • 黒:30m
  • 赤:31m
  • 緑:32m
  • 黄色:33m
  • 青:34m
  • 紫:35m
  • シアン:36m
  • 白:37m
0
Shayan Amani