私が話しているのはssh_config(5)
現在接続されているネットワークに基づいて、設定セクションまたはファイルを定義できるかどうか疑問に思います。
企業のファイアウォールがポート 22 をブロックしているが、自宅のネットワークではブロックしていないというシナリオを考えています。つまり、この構成はありますが、自宅では技術的には必要ありません。
Host github.com
Hostname ssh.github.com
Port 443
これはあまり興味深いシナリオではないと思いますが、私が何を言いたいのかは伝わると思います。
答え1
私は、DHCP 提供のドメインで命名された複数の構成と、フォールバックとしての 1 つのデフォルト (例: 、で2 つのドメイン、 で~/.ssh/config.abc
、およびデフォルト) を用意することでこの問題を解決しました。なぜデフォルトでコロンが必要なのか疑問に思うかもしれませんが、これにより という名前のドメインが許可されます。~/.ssh/config.xyz
~/.ssh/config:default
abc
xyz
default
~/.ssh/update-config
次に、コマンドラインで渡されたドメインに基づいてファイルの 1 つをリンクする小さなスクリプトがあります。
#!/bin/bash`
config=~/.ssh/config
default_config=${config}:default
domain="$1"
domain_config=${config}.${domain}
if test -f ${domain_config}; then
echo "Using config ${domain_config}"
ln -sf ${domain_config} ${config}
else
echo "Using default config ${default_config}"
ln -sf ${default_config} ${config}
fi
その後、適切なドメインを最初のパラメータとして指定して、このスクリプトを手動で呼び出すことができます。
これを自動化するために、NetworkManager フック ( /etc/NetworkManager/dispatcher.d/02-sshconfig
) も追加しました。
#!/bin/bash
case "$2" in
up|dhcp4-change)
break
;;
*)
exit 0
;;
esac
# some iface went up
for home in /home/*; do
user=$(basename ${home})
script="${home}/.ssh/update-config"
test -x ${script} && su -l ${user} ${script} ${IP4_DOMAINS}
done
exit 0
これで、インターフェースが起動するか、DHCP 構成が変更されるたびに、このスクリプトがupdate-config
各ユーザーに対して実行されます。
理想的ではありませんが (有線ネットワークのドメインが無線ネットワークと異なる場合や、DHCP 構成にドメインがない場合など)、何年もの間非常にうまく機能していたため、構成したことを忘れてしまい、古いラップトップを探し回って新しいラップトップに移植する必要がありました。
DHCP 構成によってドメインが提供されていない場合は、割り当てられた IP など、他の何かに基づいて構成の選択を試みることができます。
もちろん、構成には重複がいくつかあるため、特別なタグ (DHCP ドメイン、IP アドレス/範囲) を含む 1 つのソース構成と、タグ付けされたホストのみを実際の構成にフィルターするスクリプトの方が適している可能性があります。誰かがここでインスピレーションを得られるかもしれません。
答え2
コメントで示唆された 1 つの回答では、ユーザーの SSH 構成ファイルでネットワークごとのルールを維持することを提案しています。たとえば...
Host foo@work
Hostname ssh.foo.com
Port 443
これは、コマンドをより細かく制御し、ホスト名を入力する場合に機能する可能性がありますが、git とpush
コマンドpull
は構成されたリモートから直接読み取られます。
どうやら、仕事用/自宅用のリモコンも設定する必要があるようです :(