概要
踏み台をつかって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
以上で自分のグローバル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