Jak napisać skrypt logowania AnyConnect w Linuksie i macOS
Binarka vpn czyta odpowiedzi ze standardowego wejścia w kolejności monitów. Zbuduj sekwencję, zacytuj ją raz, trzymaj poza listą procesów i najpierw przetestuj jeden zasób.
Skrypt kończy się zerem, tunel się pojawia, a kolejne uruchomienie jest odrzucane, zanim w ogóle poprosi o hasło. Albo to samo polecenie działa w terminalu, a zawodzi z zaplanowanego zadania z błędem «nie znaleziono zdarzenia», który nie nazywa niczego użytecznego. Oba przypadki to zepsuta rozmowa przez standardowe wejście klienta AnyConnect, a nie awaria sieci. Potraktuj logowanie jako zapisane pytanie i odpowiedź, a błędy staną się przewidywalne i małe.
Dlaczego to samo polecenie zawodzi w skrypcie
Klient czyta swoje odpowiedzi ze standardowego wejścia, po jednej linii na monit, w kolejności, w jakiej brama o nie prosi. Wszystko, co zmienia liczbę monitów, na przykład nowy baner, selektor grupy lub wyzwanie drugiego czynnika, przesuwa każdą późniejszą odpowiedź o jedną linię. Wtedy klient czyta nazwę użytkownika tam, gdzie oczekiwał hasła, i zgłasza błąd, który nie wskazuje na żadne z nich.
Hasło zawierające wykrzyknik dodaje cichszą drugą awarię. W cudzysłowach podwójnych powłoka rozwija je znacznie wcześniej, niż klient cokolwiek zobaczy.
Umieść ładunek w apostrofach, a znak przejdzie nietknięty. To cała poprawka i wyjaśnia całą klasę zgłoszeń, w których te same dane logowania działają przy wpisywaniu, a zawodzą przy zapisie. Sprawdź, co zrobiła powłoka, zanim sprawdzisz bramę: wypisz ładunek przez opakowanie pokazujące dokładne bajty i policz linie. Większość takich dochodzeń kończy się właśnie tam.
Zapisz odpowiedzi w kolejności, w jakiej prosi klient
Uruchom klienta raz interaktywnie i zapisz każdy monit po kolei. Selektor grupy pojawia się tylko wtedy, gdy brama publikuje kilka profili, a monit o baner tylko wtedy, gdy jeden jest skonfigurowany. Plik odpowiedzi musi pasować do bramy, na którą naprawdę wskazujesz, a nie do tej z dokumentacji.
Następnie zbuduj plik z tą dokładną sekwencją, jedna odpowiedź na linię. Indeks grupy to numer, który klient wylicza, a nie pozycja profilu w dokumencie. Przyjmuj baner tylko wtedy, gdy twoja brama go wysyła, i dodaj linię dla każdego dodatkowego pytania, o którym wiadomo, że ta brama je zadaje. Uruchom klienta z flagą nieinteraktywną, aby zużył plik, zamiast czekać na terminal.
connect vpn.lab.example
0
username
password
y
exit/opt/cisco/anyconnect/bin/vpn -s < anyconnect.txtTa sama sekwencja może przyjść przez potok, gdy wolisz nie trzymać pliku na dysku. Zasady cytowania wciąż decydują, czy przetrwa.
Trzymaj dane logowania poza listą procesów
Argument w wierszu poleceń jest czytelny dla każdego lokalnego użytkownika przez cały czas życia procesu, więc hasło należy do pliku lub potoku i nigdy do listy argumentów. Ustaw ten plik jako czytelny tylko dla konta, które uruchamia skrypt, i usuń go po zakończeniu zadania. W macOS binarka zwykle leży w tej samej ścieżce co w Linuksie, ale potwierdź zainstalowaną lokalizację, zamiast ją zakładać. Opakowanie, które sprawdza obie ścieżki, jest krótsze niż raport z incydentu.
printf 'username\npassword\ny\n' | /opt/cisco/anyconnect/bin/vpn -s connect vpn.lab.exampleNie pozwól też skryptowi ponawiać w nieskończoność. Zmieniony baner lub hasło, które wygasło w nocy, zamieniają stały plik odpowiedzi w pętlę ponowień, i to ta pętla blokuje konto.
Ponieważ jeden raz, wypisz własny tekst błędu klienta i zakończ. Zaplanowane zadanie wymaga takiego samego przeglądu tożsamości i dostępności danych logowania jak każde inne zadanie bez nadzoru, bo dane, które cicho wygasają, są nieodróżnialne od awarii o trzeciej nad ranem.
Potwierdź sesję, zanim zaufasz kodowi wyjścia
Stan połączenia dowodzi, że tunel istnieje, i niczego więcej. Przetestuj jeden zasób, który musi być osiągalny przez tunel, zanim skrypt zacznie prawdziwą pracę, a błąd tam traktuj jako inną awarię niż nieudane logowanie. Inaczej będziesz ponawiać całkiem dobre połączenie, które po prostu nie dociera do celu.
Zapytaj klienta o jego stan przed rozłączeniem i po nim, bo nieaktualna sesja może odrzucić kolejne połączenie, podczas gdy skrypt zgłasza sukces.
/opt/cisco/anyconnect/bin/vpn state
/opt/cisco/anyconnect/bin/vpn disconnectZapisuj wynik stanu obok kodu wyjścia, bo sam kod nie potrafi oddzielić odrzuconego logowania od sesji, która nigdy się nie zamknęła. Gdy brama wymaga drugiego czynnika lub interaktywnej zgody, przestań skryptować ten krok i użyj zamiast tego mechanizmu obsługiwanego przez klienta. Stały plik odpowiedzi to wygoda dla danych logowania, które kontrolujesz, a nie sposób obejścia kroku uwierzytelniania, którego nie kontrolujesz. Trzymaj zakres tak wąski, a to pozostanie krótkim skryptem.
Kiedy stały plik odpowiedzi jest złym narzędziem
Drugi czynnik lub monit o zgodę całkowicie niweczą ten wzorzec, a to granica projektu, nie łamigłówka skryptowa. Użyj dowolnego mechanizmu, który klient obsługuje dla tego kroku zamiast zgadywać odpowiedź z góry. Stały plik działa tylko dla danych logowania, które pozostają takie same między uruchomieniami.
Dwa starsze style danych logowania też bywają mylone z AnyConnect. Profil vpnc mówi innym protokołem i chce nazwy grupy jako identyfikatora IPSec, potem wspólnego sekretu grupy, a potem danych twojego konta.
Ponieważ protokoły się różnią, vpnc nie może dotrzeć do bramy, która publikuje tylko profile AnyConnect, a zwykłą otwartą alternatywą dla tej usługi jest openconnect z wybranym protokołem anyconnect. Plik pcf należy do starego klienta Cisco i choć jego host, nazwę grupy i hasło grupy można wprowadzić ponownie w kliencie, który wciąż mówi Cisco IPsec, plik nie przenosi się między klientami. Nietypowy port lub niestandardowy tryb tunelowania zwykle ginie przy tym przeniesieniu. Ustal, który protokół oferuje brama, zanim wybierzesz narzędzie.