Skrypt rozłączania zwykle zawodzi z jednego powodu: zwraca się do niewłaściwego właściciela. Tunel zarządzany przez społecznościowe OpenVPN GUI należy do sesji tego GUI, tunel uruchomiony przez usługę Windows należy do usługi, a OpenVPN Connect nie należy do żadnego z nich. Przejdź te kontrole po kolei i zatrzymaj się, gdy właściciel jest niejasny. Wysłanie polecenia kill, bo właściciel był niejednoznaczny, to dokładnie ten sposób, w jaki rozłączenie jednego profilu staje się awarią całego obiektu.

Dla połączenia zarządzanego przez GUI użytecznym poleceniem jest wiadomość do GUI, a nie sygnał do openvpn.exe.

Najpierw ustal właściciela

Zobacz, który program faktycznie pokazuje stan połączenia, zanim cokolwiek napiszesz. Ikona w zasobniku systemowym oznacza, że należy do sesji GUI. Wpis usługi oznacza, że należy do usługi. Osobne okno aplikacji z własną listą profili nie oznacza żadnego z nich i obowiązuje w nim jego własny interfejs charakterystyczny dla wersji.

Sprawdź także konto i sesję pulpitu. Nie należy zakładać, że zadanie zaplanowane uruchamiane jako inny użytkownik lub w sesji nieinteraktywnej kontroluje GUI, które widzi zalogowana osoba. Ta niezgodność daje polecenie, które kończy się czysto i niczego nie zmienia, a to najdroższy rodzaj awarii do wytropienia z logu.

Potem wyślij własne rozłączenie właściciela

Gdy GUI jest zainstalowane w ścieżce z przykładu i istnieje profil o nazwie office, całe polecenie to jedna linia:

"C:\Program Files\OpenVPN\bin\openvpn-gui.exe" --command disconnect office

Zastąp je rzeczywistą ścieżką instalacji i dokładną nazwą konfiguracji, łącznie z wielkością liter tak, jak pokazuje je GUI. Dokumentacja poleceń projektu wymienia obsługiwane elementy sterowania GUI, a ten przykład należy wyłącznie do OpenVPN GUI — to nie jest polecenie dla każdej aplikacji mającej OpenVPN w nazwie.

W przypadku tunelu należącego do usługi właściwym sterowaniem jest usługa, a nie plik binarny GUI. Przejrzyj zainstalowaną usługę i profile, którymi zarządza, zanim cokolwiek zatrzymasz, ponieważ zatrzymanie może zrzucić kilka tuneli naraz i nie otrzymasz wyniku dla poszczególnych profili.

Sprawdź, czy nic innego nie pada

GUI dokumentuje także polecenie disconnect_all, a jego zakres jest dokładnie tym, co czyni je złym narzędziem dla skryptu, który ma zatrzymać tylko office. Jeśli kusi cię, by użyć go dla prostoty, zapytaj, co jeszcze jest połączone na tej maszynie i jak użytkownik to zauważy.

taskkill /F /IM openvpn.exe jest gorsze pod dwoma względami. Wybiera procesy po nazwie pliku wykonywalnego i wymusza zakończenie, więc nie wyraża ani nazwy profilu, ani normalnej sekwencji rozłączania właściciela. Nazywanie tego czystym zamknięciem ukrywa oba problemy za jednym kodem wyjścia.

Niezależnie od wybranej drogi sprawdź zasięg wpływu przed zmianą: wylistuj połączone profile, zanotuj, które powinny przetrwać, i sprawdź je ponownie potem.

Potwierdź stan, nie kod wyjścia

Po zażądaniu rozłączenia czytaj stan nazwanego połączenia przez jego właściciela, zamiast ufać wartości zwracanej przez polecenie. Jeśli następny krok po demontażu potrzebuje sieci, poczekaj na tę zmianę stanu z jawnym limitem czasu, zamiast zakładać, że czyszczenie zakończyło się, gdy proces wrócił. Skrypt ścigający się z demontażem będzie zawodził okresowo, a wina spadnie na VPN.

Jeśli stan nigdy się nie zmienia, właściciel prawdopodobnie nie jest tym, do którego się zwróciłeś. Sprawdź ponownie sesję i konto, zanim przejdziesz do mocniejszego polecenia.

Co umieścić w logu

Zapisuj nazwę profilu, właściciela, do którego się zwróciłeś, kontekst uruchomienia oraz wynikowy stan. Nie wylewaj pełnej konfiguracji ani poświadczeń do logu zadania i nie zapisuj wiersza poleceń, jeśli zawiera ścieżkę do pliku z sekretami.

Komunikat o błędzie, który nazywa profil i kontekst, wystarczy, aby następna osoba odtworzyła problem. Log zapisujący tylko ogólny kod wyjścia odsyła ich na początek, i właśnie tam zgadywanie zaczyna się od nowa.

Powiązane artykuły