~/.ssh/config
IPアドレスをホスト名として使用する場合、これを実現することはできません。追加の複雑さは、異なるIPアドレスに接続するだけでなく、異なるポートにも接続するという事実によって導入されます。これは、DNSリゾルバーの調整をほとんど排除するためです。
私は修正済みです- Match originalhost ... exec ...
コンボを使用できます~/.ssh/config
- @MichałPolitowskiの答えをご覧ください。ただし、OpenSSHの場合は完全に機能しますが、他のSSHクライアントで同様の機能が見つかるとは限りません。
のための単純なラッパー(シェル関数またはさまざまなシェルから使用する必要がある場合はスクリプト)を使用して問題を回避できます。これにより、現在使用してssh
いるネットワークを確認し、適切なHost
エントリを使用します。大きな問題は、どのネットワークにいるのかを確実に検出する方法です。ローカルIPアドレスが思い浮かびますが、信頼できるものではありません。仕事用ネットワークと同じサブネットを使用するLANからも接続している可能性があるためです。
ローカルネットワークとリモートネットワークの両方に同じポートを使用できる/etc/resolv.conf
場合は、使用しているネットワークに応じて編集できます。明らかに、自動的に実行する必要があります(ほとんどの場合、DHCPクライアントのフックスクリプトから)。または-より良い-ローカルネームサーバー(たとえばなどdnsmasq
)を実行し、適切な構成を指定します。しかし、それはこの質問の範囲を超えています。
別のオプション-対話的にのみ接続する必要がある場合-は、スキャンするコマンド補完を使用すること~/.ssh/config
です。これにより、いくつかの入力を節約できます(特に、十分な数のHost
エントリを持っている場合)。次のようなもの(bash
初期化用):
# complete session names for ssh
declare -g _ssh_complete_hostlist 2> /dev/null
function _ssh_complete_init () {
_ssh_complete_hostlist=$( \
sed -nr '/^\s*Host\s*=/{s/^[^=]+= *//;s/ /\n/g;p}' ~/.ssh/config \
| sort )
}
_ssh_complete_init
function _ssh_complete () {
local match=${COMP_WORDS[${COMP_CWORD}]}
local hosts=
local default=
for h in $_ssh_complete_hostlist; do
if [[ $h =~ ^$match ]]; then
hosts="$hosts $h"
fi
done
if ! (( ${COMP_CWORD} == ${#COMP_WORDS[@]}-1 )); then
default=$( compgen -f ${COMP_WORDS[${COMP_CWORD}]} )
fi
COMPREPLY=($hosts $default)
}
complete -F _ssh_complete ssh
最初の関数は、ホストが完了するリストを作成します(通常、すべてのシェルでこれを1回実行するだけで十分です)。コマンドラインの最後のトークン。
このすべてに、この問題に対処する正しい方法は、VPNを介して職場のネットワークに接続し、オフィスにいるかのようにローカルの職場のIPアドレスにアクセスできるようにすることです。次に、アドレスを、好きなレイヤーに組み込むことができます:~/.ssh/config
、/etc/resolv.conf
または(最適なオプション)オフィスネームサーバー。
/etc/hosts
これを達成するためにSSH構成ファイルをいじることができるかどうかです?または、現在接続しているLANを「検出」する方法はありますか?