Skript, ki zažene odjemalca VPN ponudnika, visi, dokler ne poteče čas, in dnevnik kaže, da odjemalec zahteva potrditveno kodo, ki je nihče ni vnesel. Geslo je bilo poslano, zato je očiten sklep, da je geslo napačno. Ni. Zahteva po kodi je ločen pogovor na ločenem kanalu in vaš skript ga ni nikoli odprl.

Opravite pet preverjanj spodaj po vrsti. Ustavite se pri prvem, ki ne uspe, ker vsak naslednji korak predpostavlja, da prejšnji veljajo.

Preverjanje 1: ali odjemalec sploh bere standardni vhod?

Preizkusite, preden napišete kakršno koli avtomatizacijo: pošljite odjemalcu lažno skrivnost po cevi in poglejte, kaj se zgodi. Če izpiše svojo zahtevo in nato čaka, cevi ne bere.

Mnogi odjemalci odprejo terminalsko napravo neposredno ali zavrnejo sprejem skrivnosti iz toka, ki ni terminal, da zablodela cev ne more izpustiti gesla. OpenVPN je dokumentirana izjema, ker --auth-user-pass sprejme pot do datoteke. Odjemalci ponudnikov, ki zahtevajo enkratno kodo, običajno nimajo enakovredne možnosti in njihova zahteva čaka na terminal, ki ga vaš skript ni nikoli zagotovil.

Preverjanje 2: ima podrejeni proces terminal?

pty dodeli terminal otroku, kar zahteve spremeni v berljiv izhod, na katerega lahko odgovarjate po vrsti.

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)

Nizi zahtev zgoraj so ponazoritveni; kopirajte natančno besedilo, ki ga izpiše vaš odjemalec, vključno z velikimi in malimi črkami ter ločili. Vsako pričakovanje ima časovno omejitev, zaprt otrok pa sproži izjemo, namesto da bi vrnil stanje, zato zaporedje ovijte in konec datoteke obravnavajte kot neuspeh. Bodite pozorni, česa ta blok ne naredi: otrok umre s skriptom, ker pty ni mehanizem za odklop in je disown vgrajeni ukaz lupine, ki ne doseže procesa, ki ga je ustvaril vaš skript.

Preverjanje 3: ali obstaja podprt neinteraktivni vnos?

Struženje zaslona se zlomi ob posodobitvah odjemalca, zato najprej poiščite dokumentirano možnost.

Preglejte izpis pomoči za možnost žetona ali enkratne kode in preverite, ali storitev sprejme kodo, dodano polju gesla. Kjer odjemalec bere datoteko poverilnic, mu dajte datoteko namesto zahteve:

openvpn --config office.ovpn --auth-user-pass <(printf "%s\n%s\n" "$USER_NAME" "$PASSWORD")

Zamenjava procesov da odjemalcu berljivo pot v sistemih, ki ponujajo /dev/fd. Skrivnost ostaja z vidika odjemalca skrivnost, zato jo držite stran od dnevnikov, zgodovine lupine in seznamov procesov. Če odjemalec zavrne /dev/fd ali pot do poverilnic odpre več kot enkrat, napišite pravo datoteko s strogimi dovoljenji in jo izbrišite v istem skriptu.

Preverjanje 4: bo tunel preživel skript?

Privzeto tunel umre s svojim nadrejenim, kar je nasprotje tega, kar potrebuje zagonski skript.

disown -h pomaga le, kadar ste odjemalca zagnali kot opravilo lupine, ker ureja tabelo opravil te lupine in ne doseže procesa, ki ga je vaš skript zagnal prek pty. Upravitelj storitev je boljši dom za vse, kar se mora znova povezati brez nadzora, ker znova zažene odjemalca in zabeleži, zakaj je umrl. V vsakem primeru po vsaki ponovni povezavi pričakujte novo kodo: enkratni žeton se porabi ob prvi uspešni overitvi.

Opazujte, kaj sudo naredi z zaporedjem. Poziv za geslo sudo ni poziv VPN in odgovarjanje nanj z geslom VPN je najpogostejši način, da sicer pravilen vrstni red pričakovanj vseeno spodleti.

Preverjanje 5: ali naj bo koda osebe v skriptu?

To je preverjanje, ki ga ljudje preskočijo. Žeton pripada osebi, tunel, ki se mora dvigniti po urniku, pa stroju.

Če se mora opravilo znova povezati brez nadzora, vprašajte, ali lahko strojno potrdilo ali servisni račun nadomesti interaktivno prijavo. Avtomatizacija nečije enkratne kode spremeni drugi dejavnik v shranjeno skrivnost, kar je sprememba politike in ne udobje za skripte. Kjer storitev podpira oboje, izberite poverilnico, ki ustreza temu, kako opravilo v resnici teče. Odgovor zapišite, ker bo naslednja oseba vprašala, zakaj skript drži žeton.

Kako izgleda delujoč skript

Skript izpiše korak, do katerega je prišel, nikoli skrivnosti, in ob vsakem neuspešnem pričakovanju konča z neničelno kodo.

Preizkusite ga tako, da ga namerno pokvarite: napačno geslo, napačna skupina, potekel žeton. Vsaka napaka bi se morala ustaviti na imenovanem koraku, ne pa viseti. Nato ga enkrat zaženite proti pravi storitvi in preverite tunel od zunaj skripta, ne od znotraj.

Sorodni članki