VPN-хук, экспортирующий конечную точку API, меняет окружение запускаемых им процессов, а не того терминала, который был уже открыт к моменту поднятия туннеля. Именно это единственное различие объясняет большинство сообщений «инструмент всё ещё обращается к публичной конечной точке». Есть два рабочих места для настройки, и выбор зависит от того, кто её использует и как часто она меняется. Сравните их, прежде чем добавлять ещё один стартовый скрипт.

Два места, где настройка может жить

Первый вариант — префикс в самой команде: значение существует только для этого одного вызова и исчезает вместе с ним. Второй — экспорт внутри хука подключения, который доходит до каждого процесса, запущенного хуком после этого момента. Они различаются охватом и временем жизни, а не синтаксисом, и именно это различие решает большинство сбоев.

PropertyPrefix on the commandExport from the hook
Who receives itThat invocation onlyChildren the hook starts
LifetimeUntil the process exitsUntil the hook's own session ends
LeakageScoped to one commandApplies to later commands in that session
Repeat costEvery invocationOnce per connection
Works for an open editorNo, unless the editor is started with itNo

Таблица делает хук дешёвым на вид и скрывает настоящий счёт: он выбирает приватную конечную точку и для команд, не имеющих отношения к задаче. Читайте каждую строку как ограничение, а не как предпочтение. Если конечная точка меняется от задачи к задаче, префикс выигрывает в точности, даже если стоит одного нажатия клавиши.

Почему хук не может достучаться до уже открытой оболочки

Переменные окружения передаются процессу в момент создания образа процесса. Оболочка, запущенная до подключения, сохраняет полученную копию, а экспорт, выполненный внутри хука, не является широковещательной рассылкой всем процессам машины. Его наследуют только собственные дочерние процессы хука. Дочерние процессы оболочки берут то, что оболочка держит в момент их запуска, и поэтому одна и та же команда может работать в одном терминале и не работать в другом.

То же самое относится к графическому редактору. Его хост расширений, встроенный терминал и фоновый языковой сервер ответвились при запуске и держат собственные копии. Повторное открытие папки не обязательно перезапускает эти дочерние процессы, поэтому добавленная настройка так и не доходит.

Самый дешёвый тест — вывести переменную из того места, где происходит сбой, а не из оболочки, которая работает. Если сбойный процесс запустился до туннеля, у экспорта не было ни единого шанса.

Форма для отдельной команды, выписанная

Префикс оставляет выбор видимым в той команде, которая его использует, и это помогает, когда конечная точка меняется между задачами:

env INTERNAL_API='https://internal-api.example.net:8443' my-work-tool

Команда приведена только для примера: my-work-tool — это заполнитель, а INTERNAL_API не является стандартом VPN, поэтому подставьте документированную настройку программы, которую вы действительно запускаете, и свой утверждённый хост. Не размещайте токен или пароль в той же строке, потому что они попадают в историю оболочки.

Когда несколько команд относятся к одной задаче, короткий проверенный скрипт-обёртка задаёт переменные, а затем запускает их. Так остаётся единственное определение, и значение не становится глобальным для каждой будущей команды в терминале.

Перезагрузите, перезапустите или оставьте как есть

Для уже работающего инструмента предпочитайте его собственную перезагрузку или профиль рабочей области, если он есть. Иначе сохраните работу и перезапустите компонент, читающий настройку, а это часто языковой сервер, а не окно редактора. Перезапуск окна с предположением, что дочерние процессы последовали за ним, — именно то, из-за чего перезагрузка выглядит неработающей.

Отключение — отдельное решение. Пауза, закрытие или повторное подключение относятся к приложению, и переменная конечной точки ими не управляет. Относитесь к переменной как к конфигурации, выбирающей адрес, а не как к правилу о том, какой сетевой трафик допустим потом, и эти две задачи остаются разделимыми.

Похожие статьи