私が特定のネットワーク(サブネット10.10.11.x)にいるとき、宛先ポートのために中間のホストを経由してジャンプする必要があります。私は変更できません。ネットワーク。私はそれが必要とされていない時代の大多数のためにそれを避けるために必要があるので、ヒット大幅な性能があるローカルサブネットに基づいてssh設定を自動的に切り替える方法は?
Host web-direct web
HostName web.example.com
Port 1111
Host web-via-jump jweb
HostName web.example.com
Port 1111
ForwardAgent yes
ProxyCommand ssh -p 110 -q relay.example.com nc %h %p
のJumpBoxを通って行く:私は成功を収めて、次のようなSSHの設定を使用します。 ssh/scp/rsyncのホストニックネームを切り替えることは対話的には有効ですが、自動化された/スクリプト化されたタスクがあり、非常に苦労しています。
起動(.zshrc)メカニズムが役に立たないように、私のシェルはネットワーク移行を介して開いたままです。
スクリプトを実行して制限されたサブネットをポーリングし、.ssh/configファイルを変更してスイッチを自動化することを考えましたが、キャッシングの問題があるかどうかもわかりません。私がそれを実装する前に、よりよいアプローチがあるかどうか尋ねると思いました。
発信元ホストのサブネット検出に基づいてssh configを交換する最適な方法は何ですか?
擬似Configで、のようなもの:
私はonsubnetという名前のbashスクリプト作成の@ヒョードル-dikarevによって回答に基づいてif <any-active-local-interface> is on 10.10.11.x:
Host web
HostName web.example.com
Port 1111
ForwardAgent yes
ProxyCommand ssh -p 110 -q relay.example.com nc %h %p
else:
Host web
HostName web.example.com
Port 1111
endif
ソリューション
:
#!/usr/bin/env bash
if [[ "$1" == "--help" ]] || [[ "$1" == "-h" ]] || [[ "$1" == "" ]] ; then
printf "Usage:\n\tonsubnet [ --not ] partial-ip-address\n\n"
printf "Example:\n\tonsubnet 10.10.\n\tonsubnet --not 192.168.0.\n\n"
printf "Note:\n\tThe partial-ip-address must match starting at the first\n"
printf "\tcharacter of the ip-address, therefore the first example\n"
printf "\tabove will match 10.10.10.1 but not 110.10.10.1\n"
exit 0
fi
on=0
off=1
if [[ "$1" == "--not" ]] ; then
shift
on=1
off=0
fi
regexp="^$(sed 's/\./\\./g' <<<"$1")"
if [[ "$(uname)" == "Darwin" ]] ; then
ifconfig | fgrep 'inet ' | fgrep -v 127.0.0. | cut -d ' ' -f 2 | egrep "$regexp" >/dev/null
else
hostname -I | tr -s " " "\012" | fgrep -v 127.0.0. | egrep "$regexp" >/dev/null
fi
if [[ $? == 0 ]]; then
exit $on
else
exit $off
fi
を次に、私のssh-configファイルで、私は次のようなものを使用します:
Match exec "onsubnet 10.10.1." host my-server
HostName web.example.com
Port 1111
ForwardAgent yes
ProxyCommand ssh -p 110 -q relay.example.com nc %h %p
Match exec "onsubnet --not 10.10.1." host my-server
HostName web.example.com
Port 1111
私はfgrepかgrep -Fのどちらかを使いますが、あなたのテストは '10.10.110 'のように思っていないものとマッチします。 – Mike
確かに。それはどのように働くことができるよりコンセプトだった。詳細を把握することは読者に任されました。しかし、答えを更新しました。 – Jakuje