я говорю о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 -- это позволяет домену с именем 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
Это, вероятно, сработало бы там, где у меня больше контроля над командами и вводом имени хоста, но git push
и pull
команды считываются напрямую с настроенных удаленных серверов.
Похоже, мне придется еще и пульты дистанционного управления на работе и дома настраивать :(