Настройки VPN-инструмента: окружение при запуске или экспорт в хуке?
Хук запускает собственные дочерние процессы, а не оболочку, которую вы уже открыли. Окружение при запуске держит приватную конечную точку только в той единственной команде, которой она нужна.
VPN-хук, экспортирующий конечную точку API, меняет окружение запускаемых им процессов, а не того терминала, который был уже открыт к моменту поднятия туннеля. Именно это единственное различие объясняет большинство сообщений «инструмент всё ещё обращается к публичной конечной точке». Есть два рабочих места для настройки, и выбор зависит от того, кто её использует и как часто она меняется. Сравните их, прежде чем добавлять ещё один стартовый скрипт.
Два места, где настройка может жить
Первый вариант — префикс в самой команде: значение существует только для этого одного вызова и исчезает вместе с ним. Второй — экспорт внутри хука подключения, который доходит до каждого процесса, запущенного хуком после этого момента. Они различаются охватом и временем жизни, а не синтаксисом, и именно это различие решает большинство сбоев.
| Property | Prefix on the command | Export from the hook |
|---|---|---|
| Who receives it | That invocation only | Children the hook starts |
| Lifetime | Until the process exits | Until the hook's own session ends |
| Leakage | Scoped to one command | Applies to later commands in that session |
| Repeat cost | Every invocation | Once per connection |
| Works for an open editor | No, unless the editor is started with it | No |
Таблица делает хук дешёвым на вид и скрывает настоящий счёт: он выбирает приватную конечную точку и для команд, не имеющих отношения к задаче. Читайте каждую строку как ограничение, а не как предпочтение. Если конечная точка меняется от задачи к задаче, префикс выигрывает в точности, даже если стоит одного нажатия клавиши.
Почему хук не может достучаться до уже открытой оболочки
Переменные окружения передаются процессу в момент создания образа процесса. Оболочка, запущенная до подключения, сохраняет полученную копию, а экспорт, выполненный внутри хука, не является широковещательной рассылкой всем процессам машины. Его наследуют только собственные дочерние процессы хука. Дочерние процессы оболочки берут то, что оболочка держит в момент их запуска, и поэтому одна и та же команда может работать в одном терминале и не работать в другом.
То же самое относится к графическому редактору. Его хост расширений, встроенный терминал и фоновый языковой сервер ответвились при запуске и держат собственные копии. Повторное открытие папки не обязательно перезапускает эти дочерние процессы, поэтому добавленная настройка так и не доходит.
Самый дешёвый тест — вывести переменную из того места, где происходит сбой, а не из оболочки, которая работает. Если сбойный процесс запустился до туннеля, у экспорта не было ни единого шанса.
Форма для отдельной команды, выписанная
Префикс оставляет выбор видимым в той команде, которая его использует, и это помогает, когда конечная точка меняется между задачами:
env INTERNAL_API='https://internal-api.example.net:8443' my-work-tool
Команда приведена только для примера: my-work-tool — это заполнитель, а INTERNAL_API не является стандартом VPN, поэтому подставьте документированную настройку программы, которую вы действительно запускаете, и свой утверждённый хост. Не размещайте токен или пароль в той же строке, потому что они попадают в историю оболочки.
Когда несколько команд относятся к одной задаче, короткий проверенный скрипт-обёртка задаёт переменные, а затем запускает их. Так остаётся единственное определение, и значение не становится глобальным для каждой будущей команды в терминале.
Перезагрузите, перезапустите или оставьте как есть
Для уже работающего инструмента предпочитайте его собственную перезагрузку или профиль рабочей области, если он есть. Иначе сохраните работу и перезапустите компонент, читающий настройку, а это часто языковой сервер, а не окно редактора. Перезапуск окна с предположением, что дочерние процессы последовали за ним, — именно то, из-за чего перезагрузка выглядит неработающей.
Отключение — отдельное решение. Пауза, закрытие или повторное подключение относятся к приложению, и переменная конечной точки ими не управляет. Относитесь к переменной как к конфигурации, выбирающей адрес, а не как к правилу о том, какой сетевой трафик допустим потом, и эти две задачи остаются разделимыми.