Hook VPN, który eksportuje punkt końcowy API, zmienia środowisko uruchamianych przez siebie procesów, a nie terminala, który był już otwarty, gdy tunel się podniósł. Właśnie ta jedna różnica wyjaśnia większość zgłoszeń „narzędzie nadal wywołuje publiczny punkt końcowy”. Istnieją dwa realne miejsca na to ustawienie, a wybór zależy od tego, kto je wykorzystuje i jak często się zmienia. Porównaj je, zanim dodasz kolejny skrypt startowy.

Dwa miejsca, w których ustawienie może żyć

Pierwsza opcja to prefiks samego polecenia: wartość istnieje tylko dla tego jednego wywołania i znika wraz z nim. Druga to eksport wewnątrz hooka połączenia, który dociera do każdego procesu uruchomionego przez hook po tym momencie. Różnią się zasięgiem i czasem życia, a nie składnią, i ta różnica rozstrzyga większość awarii.

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

Tabela sprawia, że hook wygląda tanio, i ukrywa prawdziwy rachunek: wybiera prywatny punkt końcowy także dla poleceń niemających nic wspólnego z zadaniem. Czytaj każdy wiersz jako ograniczenie, nie jako preferencję. Jeśli punkt końcowy zmienia się z zadaniem na zadanie, prefiks wygrywa precyzją, choć kosztuje jedno naciśnięcie klawisza.

Dlaczego hook nie może dotrzeć do już otwartej powłoki

Zmienne środowiskowe są przekazywane procesowi w chwili tworzenia obrazu procesu. Powłoka uruchomiona przed połączeniem zachowuje otrzymaną kopię, a eksport wykonany wewnątrz hooka nie jest rozgłaszaniem do każdego procesu na maszynie. Dziedziczą go tylko własne procesy potomne hooka. Procesy potomne powłoki biorą to, co powłoka ma w chwili ich startu, i dlatego to samo polecenie może działać w jednym terminalu, a w innym zawieść.

To samo dotyczy edytora graficznego. Jego host rozszerzeń, wbudowany terminal i serwer języka w tle zostały rozwidlone przy starcie i trzymają własne kopie. Ponowne otwarcie folderu nie restartuje tych procesów potomnych, więc dodane ustawienie nadal nigdy nie dociera.

Najtańszy test to wypisać zmienną z miejsca, które zawodzi, a nie z powłoki, która działa. Jeśli zawodzący proces wystartował przed tunelem, eksport nie miał żadnej szansy.

Forma dla pojedynczego polecenia, wypisana

Prefiks utrzymuje wybór widocznym w poleceniu, które go używa, co pomaga, gdy punkt końcowy zmienia się między zadaniami:

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

Polecenie jest tylko przykładem: my-work-tool to symbol zastępczy, a INTERNAL_API nie jest standardem VPN, więc wstaw udokumentowane ustawienie programu, który naprawdę uruchamiasz, oraz swój zatwierdzony host. Nie umieszczaj tokenu ani hasła w tej samej linii, bo trafiają do historii powłoki.

Gdy kilka poleceń należy do jednego zadania, krótki sprawdzony skrypt opakowujący ustawia zmienne, a następnie je uruchamia. Dzięki temu zostaje jedna definicja, a wartość nie staje się globalna dla każdego przyszłego polecenia w terminalu.

Przeładuj, uruchom ponownie albo zostaw

Dla narzędzia, które już działa, wybierz jego własne przeładowanie lub profil obszaru roboczego, jeśli je ma. W przeciwnym razie zapisz pracę i uruchom ponownie komponent, który czyta ustawienie, a bywa nim serwer języka, nie okno edytora. Ponowne uruchomienie okna i założenie, że procesy potomne poszły za nim, to właśnie powód, dla którego przeładowanie wygląda, jakby nie działało.

Rozłączenie to osobna decyzja. Wstrzymanie, zamknięcie lub ponowne połączenie należą do aplikacji, a zmienna punktu końcowego tego nie kontroluje. Traktuj zmienną jako konfigurację wybierającą adres, a nie jako regułę mówiącą, jaki ruch sieciowy wolno potem wykorzystać, i obie sprawy pozostają rozdzielne.

Powiązane artykuły