Wéi een VPN-Login automatiséiert, deen op en Tokencode waart
En CLI-VPN-Client, deen an engem Terminal freet, blockéiert e Skript, dat nëmmen e Passwuert duerch eng Pipe schéckt. Maacht dës fënnef Kontrollen, ier Dir op expect zréckgräift.
E Skript, dat en Anbieter-VPN-Client start, hänkt bis den Timeout kënnt, an de Log weist, datt de Client en Iwwerpréiwungscode freet, deen keen agetippt huet. D'Passwuert war geliwwert, also ass de offensichtleche Schluss, datt d'Passwuert falsch ass. Et ass net. D'Code-Ufro ass eng separat Konversatioun op engem separate Kanal, an Äert Skript huet se ni opgemaach.
Maacht déi fënnef Kontrollen hei ënnen an der Rei. Bleift bei der éischter stoen, déi feelt, well all spéidere Schrëtt unhëlt, datt déi vireg halen.
Kontroll 1: liest de Client iwwerhaapt Standardinput?
Test et, ier Dir eng Automatiséierung schreift: schéckt en Dummy-Geheimnis duerch eng Pipe an de Client a kuckt, wat geschitt. Wann en seng Ufro dréckt an dann waart, liest en d'Pipe net.
Vill Clienten opmaachen d'Terminalgerät direkt, oder refuséieren e Geheimnis aus engem Stroum ze huelen, deen keen Terminal ass, sou datt eng verierrt Pipe kee Passwuert ka lecken. OpenVPN ass déi dokumentéiert Ausnam, well --auth-user-pass en Dateipfad hëlt. Anbieter-Cliente mat enger Ufro fir een Eenmolcode hunn normalerweis keng gläichwäerteg Optioun, an hir Ufro waart op en Terminal, deen Äert Skript ni geliwwert huet.
Kontroll 2: huet de Kandprozess en Terminal?
Eng pty deelt dem Kand en Terminal zou, wat d'Ufroen an liesbaren Output verwandelt, op deen Dir an der Rei äntwere kënnt.
import pexpect
child = pexpect.spawn("openconnect vpn.example.net", encoding="utf-8", timeout=30)
child.expect("GROUP:")
child.sendline("staff")
child.expect("USERNAME:")
child.sendline("alice")
child.expect("PASSWORD:")
child.sendline(PASSWORD)
child.expect("Connected as", timeout=60)D'Ufro-Strengen hei uewen sinn illustrativ; kopéiert de genauen Text, deen Äre Client dréckt, och Grouss- a Klengschreiwung an Zeechensetzung. All Erwaardung huet en Timeout, an e zouene Kand werft eng Ausnam amplaz e Status zréckzeginn, also wéckelt d'Sequenz a behandelt d'Enn vun der Datei als Feeler. Notéiert, wat dëse Block net mécht: d'Kand stierft mam Skript, well eng pty kee Loslésungsmechanismus ass an disown e Shell-Builtin ass, deen e Prozess, deen Äert Skript gestart huet, net erreecht.
Kontroll 3: gëtt et en ënnerstëtzten net-interaktiven Input?
D'Ofschrappe vum Bildschierm brécht bei Client-Updates, also sicht fir d'éischt no enger dokumentéierter Optioun.
Kuckt den Hëllefs-Output no enger Token- oder Eenmolcode-Optioun, a kontrolléiert, ob den Déngscht de Code unhëlt, deen un d'Passwuertfeld ugehaange gëtt. Wou de Client eng Umeldungsdatei liest, gitt him d'Datei amplaz enger Ufro:
openvpn --config office.ovpn --auth-user-pass <(printf "%s\n%s\n" "$USER_NAME" "$PASSWORD")Prozesssubstitutioun gëtt dem Client e liesbaren Pad op Systemer, déi /dev/fd ubidden. D'Geheimnis bleift aus der Siicht vum Client e Geheimnis, also haalt et aus Loggen, Shell-Historique a Prozesslëschten eraus. Wann de Client /dev/fd refuséiert oder den Umeldungspad méi wéi eng Kéier opmécht, schreift eng richteg Datei mat strenge Rechter a läscht se am selwechte Skript.
Kontroll 4: iwwerlieft den Tunnel d'Skript?
Standardméisseg stierft den Tunnel mat sengem Elterendeel, wat d'Géigendeel vun deem ass, wat en Startskript brauch.
disown -h hëlleft nëmmen, wann Dir de Client als Shell-Job gestart hutt, well et d'Jobtabell vun där Shell ännert an e Prozess, deen Äert Skript duerch eng pty gestart huet, net erreecht. En Déngschtmanager ass dat besser Doheem fir alles, wat ouni Iwwerwaachung nei verbannen muss, well en de Client nei startet a festhält, firwat en gestuerwen ass. Op alle Fall sollt Dir no all Neiverbindung en neie Code erwaarden: en Eenmoltoken gëtt vun der éischter erfollegräicher Authentifikatioun verbraucht.
Kuckt, wat sudo mat der Sequenz mécht. Eng sudo-Passwuertufro ass net d'Ufro vum VPN, an se mat dem VPN-Passwuert ze beäntweren ass deen heefegste Wee, wéi eng soss korrekt Erwaardungsreihenfolg awer feelt.
Kontroll 5: soll de Code vun enger Persoun an engem Skript sinn?
Dëst ass d'Kontroll, déi d'Leit iwwersprangen. En Token gehéiert enger Persoun, während en Tunnel, deen no Zäitplang erop muss, der Maschinn gehéiert.
Wann eng Aufgab ouni Iwwerwaachung nei verbannen muss, freet, ob e Maschinnzertifikat oder e Déngschtkonto deen interaktiven Login ersetze kann. D'Automatiséierung vum Eenmolcode vun engem mécht aus engem zweete Faktor en gespäicherte Geheimnis, wat eng Richtlinn ännert an net eng Komfortverbesserung fir Skripten ass. Wou den Déngscht béides ënnerstëtzt, wielt déi Umeldung, déi dozou passt, wéi d'Aufgab tatsächlech leeft. Schreift d'Äntwert op, well déi nächst Persoun freet, firwat d'Skript en Token hält.
Wéi eng funktionéierend Skript ausgesäit
D'Skript dréckt de Schrëtt, deen se erreecht huet, ni d'Geheimnis, an et geet mat engem Net-Null-Code eraus, wann eng Erwaardung feelt.
Test et, andeems Dir et bewosst ëmbrécht: falscht Passwuert, falsch Grupp, ofgelafenen Token. All Feeler sollt op engem genannte Schrëtt stoppen amplaz ze hänken. Da laaft et eng Kéier géint den echte Déngscht a kontrolléiert den Tunnel vun ausserhalb vum Skript, net vu bannen.