我說的是ssh_config(5)
。我想知道您是否可以根據當前連接的網路定義配置部分或檔案。
我正在考慮這樣一種情況:公司防火牆阻止連接埠 22,但您的家庭網路卻沒有。所以,你有這個配置,但在技術上它在家裡是不必要的。
Host github.com
Hostname ssh.github.com
Port 443
我確信這不是最有趣的場景,但我希望您能明白我的意思。
答案1
我透過使用由 DHCP 提供的網域命名的多個配置加上一個預設值作為後備解決了這個問題,例如~/.ssh/config.abc
, ~/.ssh/config.xyz
,~/.ssh/config:default
對於兩個網域abc
和xyz
, 加上預設值。如果您想知道為什麼預設使用冒號 - 這允許名為default
.
然後有一個小腳本~/.ssh/update-config
,根據命令列上傳遞的網域連結其中一個檔案:
#!/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 位址/範圍)的單源配置和僅根據實際配置過濾標記主機的腳本可能會更好。也許有人可以在這裡得到靈感。
答案2
評論中暗示的一個答案建議簡單地在使用者 SSH 設定檔中維護每個網路的規則。例如...
Host foo@work
Hostname ssh.foo.com
Port 443
當我對命令和輸入主機名稱有更多控制權時,這可能會起作用,但 gitpush
和pull
命令直接從配置的遙控器讀取。
我似乎還必須配置工作/家庭遙控器:(