您可以配置每个网络的 SSH 设置吗?

您可以配置每个网络的 SSH 设置吗?

我说的是ssh_config(5)。我想知道您是否可以根据当前连接的网络定义配置部分或文件。

我在考虑这样的情况:公司防火墙封锁了端口 22,但您的家庭网络却没有封锁。因此,您有此配置,但从技术上讲,在家中这是不必要的。

Host github.com
  Hostname ssh.github.com
  Port 443

我确信这不是最有趣的场景,但我希望你能明白我的意思。

答案1

我已通过拥有多个由 DHCP 提供的域命名的配置和一个默认配置作为后备来解决这个问题,例如~/.ssh/config.abc,对于两个域和,加上默认配置。如果您想知道为什么默认配置中~/.ssh/config.xyz带有冒号——这允许名为的域。~/.ssh/config:defaultabcxyzdefault

然后有一个小脚本~/.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

这可能会在我对命令和输入主机名有更多的控制权的情况下起作用,但是 gitpushpull命令直接从配置的远程读取。

看来我还得配置工作/家庭遥控器 :(

相关内容