Ustawienia narzędzia VPN: środowisko przy starcie czy eksport w hooku?
Hook uruchamia własne procesy potomne, a nie powłokę, którą już otworzyłeś. Środowisko przy starcie trzyma prywatny punkt końcowy tylko w tym jednym poleceniu, które go potrzebuje.
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.
| 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 |
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.