2016-11-22 25 views
5

私が特定のネットワーク(サブネット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 

答えて

4

あなたはこのような何か書くことができるように、特定のコマンドを実行するMatch execオプションを使用する可能性があります:

Match exec "hostname -I | grep -F 10.10.11." host web 
    ForwardAgent yes 
    ProxyCommand ssh -p 110 -q relay.example.com nc %h %p 
Host web 
    HostName web.example.com 
    Port 1111 
+0

私はfgrepかgrep -Fのどちらかを使いますが、あなたのテストは '10.10.110 'のように思っていないものとマッチします。 – Mike

+0

確かに。それはどのように働くことができるよりコンセプトだった。詳細を把握することは読者に任されました。しかし、答えを更新しました。 – Jakuje

0

私はそのための次の機能を使用しています:

function ssh() { 
    network=`networksetup -getairportnetwork en0 | cut -d: -f2 | tr -d [:space:]` 
    if [ -n "$network" -a -f $HOME/.ssh/config.$network ]; then 
    /usr/bin/ssh -F $HOME/.ssh/config.$network "[email protected]" 
    else 
    /usr/bin/ssh "[email protected]" 
    fi 
} 
export -f ssh 

だから私は、私はカスタムソリューションを希望する各WiFiネットワークに個別の設定ファイルを持っている必要があります。それは私のために今働くが、それは醜いので、私はそれを最良の解決策としてではなく、単にアイデアとして推薦することができます。
解決方法を知ってうれしいです。

+0

私は、これはrsyncを、SCPおよび/またはgitのに対処していない推測しているが。あなたはそれらを試しましたか? – Mike

+0

唯一のエイリアスです。他のプログラムには影響しません。 'scp'と' rsync'については、同様のエイリアスを作るのは簡単ですし、 'git'にとっては簡単ではないでしょうか。 @Jakujeは 'Match exec'を使ってソリューションを提供しますが、より良い解決策のように私の設定を書き換えます。 –

+0

「Match exec」ソリューションが動作したら、あなたの経験に応じてコメントしてください。あなたが本当の正規表現を使いたいのでない限り、grepをfgrepに変更します。 – Mike

関連する問題