LoginSignup
31
29

More than 5 years have passed since last update.

多段SSHしたときの経路をプロンプトに出してみる

Last updated at Posted at 2016-09-13

概要

踏み台をつかってSSHしてるときに,どこ経由できてたんだっけ?というのを確認したいときがあったので,プロンプトに出すようにしてみた.

追記:ProxyCommandかいて一気に接続できるようにしてたら何の意味もない...つらい

環境

uraura@rosemary$ uname -a
Linux ip-10-7-76-44 4.1.17-22.30.amzn1.x86_64 #1 SMP Fri Feb 5 23:44:22 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux

サーバ側

環境変数を追加

/etc/ssh/sshd_config
AcceptEnv SOURCE_SSH_CONNECTION

クライアント側

環境変数を設定.
SSH_CONNECTIONはSSH接続されたときに設定されるので,そいつをSOURCE_SSH_CONNECTIONに連結させていく.

~/.bash_profile
SOURCE_SSH_CONNECTION="$SOURCE_SSH_CONNECTION $SSH_CONNECTION"

export SOURCE_SSH_CONNECTION

目当てのサーバへたどりついたときのSOURCE_SSH_CONNECTIONはこんなかんじ.

SOURCE_SSH_CONNECTION= xxx.xxx.xxx.xxx 63011 10.1.68.129 10022 10.1.68.129 51440 10.7.76.44 22

自分のグローバルIPからはじまって,目的のサーバのIPまでならぶ.ポート番号はいらないので破棄,重複したIPも破棄してプロンプトをがんばって設定

~/.bashrc
right_prompt() {
  declare -a ips
  adj=0 # 色を付けるためのエスケープシーケンスをつかうとカラムがズレるので調整用
  set -- $SOURCE_SSH_CONNECTION
  while [ $# -gt 0 ]; do
    ip=$1
    case "$ip" in
      10.1.*) ip="ESC[0;34m${ip}ESC[0m"; adj=$((adj+11));; # 10.1.x.xが踏み台
      10.*)   ip="ESC[0;32m${ip}ESC[0m"; adj=$((adj+11));; # 10.n.x.x(n!=1)が目当てのサーバ
      *)      ip="ESC[0;33m${ip}ESC[0m"; adj=$((adj+11));;
    esac
    [[ $ip = ${ips[0]} ]] && adj=$((adj-11)) || ips=($ip "${ips[@]}")
    shift
    shift
  done

  printf "%*s" $((COLUMNS+adj)) $(IFS='<'; echo "${ips[*]}")
}

export PS1="\[\$(tput sc; right_prompt; tput rc)\]$PS1"

接続

uraura@rosemary$ ssh -o SendEnv=SOURCE_SSH_CONNECTION ec2-user@foo

image

以上で自分のグローバルIPから目当てのサーバまでの経路がプロンプトの右側に表示される.

参考

https://wiki.voidlinux.eu/Bash/Prompt_customization
https://wiki.archlinuxjp.org/index.php/Bash_%E3%82%AB%E3%83%A9%E3%83%BC%E3%83%97%E3%83%AD%E3%83%B3%E3%83%97%E3%83%88

31
29
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
31
29