![您可以配置每个网络的 SSH 设置吗?](https://linux22.com/image/660425/%E6%82%A8%E5%8F%AF%E4%BB%A5%E9%85%8D%E7%BD%AE%E6%AF%8F%E4%B8%AA%E7%BD%91%E7%BB%9C%E7%9A%84%20SSH%20%E8%AE%BE%E7%BD%AE%E5%90%97%EF%BC%9F.png)
我说的是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
命令直接从配置的远程读取。
看来我还得配置工作/家庭遥控器 :(