Я хочу получить доступ к своей домашней машине с моего ноутбука из дома или офиса. В офисе я должен использовать шлюз. Для этого я добавил запись proxycommand
в мой файл .ssh/config
который отлично работает из офиса. Однако, если я хочу использовать это из дома, я не хочу зависеть от служебного шлюза. Есть ли способ автоматизировать это?
1 ответ
И да и нет.
Во-первых, нет. Вы ничего не можете поместить в файл ~/.ssh/config, который будет активировать различные настройки в зависимости от внешних факторов, например, от того, в какой сети вы находитесь, или от того, существует ли файл и т.д. Конфигурационный файл SSH является статическим файлом.
Теперь да. Вы можете "взломать" что-то. Вероятно, это не будет невероятно красиво, но это может сработать.
Посмотрите, как работает ProxyCommand. Он выполняет командную строку и подставляет в определенные строки стиль printf. В этой командной строке вы можете указать свой логин. Например, у вас может быть что-то вроде этого на вашем ноутбуке для использования в офисе:
host athome
ProxyCommand ssh -x -a -q gateway nc athome.dyndns.org 22
Команда запускает команду ssh
которая подключается к gateway
а на этом сервере запускает netcat
для подключения к вашему фактическому месту назначения. Что ж, вместо запуска ssh вы можете использовать скрипт оболочки. Например, с этим в вашем файле .ssh/config
:
host athome
ProxyCommand bin/customconnect athome.dyndns.org
Вы можете создать скрипт ~/bin/customconnect
:
#!/bin/sh
if /sbin/ifconfig -a | grep -q 'inet 192\.168\.'; then
nc $1 22
else
ssh -x -a -q gateway nc $1 22
fi
Затем, если ваша сеть дома начинается с 192.168
а ваша сеть в офисе - нет, соответствующая команда ProxyCommand будет выбрана сценарием.
Если вам нужны другие динамические функции, такие как выбор другого имени хоста в зависимости от сети, вы, очевидно, можете добавить это и в сценарий.
Обратите внимание, что это решение не без каких-либо затрат. Обычно SSH запускает вашу ProxyCommand напрямую. Если вы используете это решение, для каждого соединения будет задействован дополнительный процесс, так как ssh запускает оболочку, которая, в свою очередь, запускает другой процесс.