Skripti, joka käynnistää toimittajan VPN-asiakkaan, jumittuu kunnes aikakatkaisu iskee, ja loki näyttää, että asiakas pyytää vahvistuskoodia, jota kukaan ei kirjoittanut. Salasana oli annettu, joten ilmeinen johtopäätös on, että salasana on väärä. Se ei ole. Koodipyyntö on erillinen keskustelu erillisellä kanavalla, eikä skriptisi koskaan avannut sitä.

Käy alla olevat viisi tarkistusta läpi järjestyksessä. Pysähdy ensimmäiseen, joka epäonnistuu, koska jokainen myöhempi vaihe olettaa aiempien pitävän.

Tarkistus 1: lukeeko asiakas ylipäätään vakiosyötettä?

Testaa ennen kuin kirjoitat mitään automaatiota: syötä asiakkaalle vale-salaisuus putken kautta ja katso, mitä tapahtuu. Jos se tulostaa pyyntönsä ja odottaa sitten, se ei lue putkea.

Monet asiakkaat avaavat päätelaitteen suoraan tai kieltäytyvät ottamasta salaisuutta virrasta, joka ei ole päätelaite, jotta harhautunut putki ei voi vuotaa salasanaa. OpenVPN on dokumentoitu poikkeus, koska --auth-user-pass ottaa tiedostopolun. Kertakoodia pyytävillä toimittajien asiakkailla ei yleensä ole vastaavaa valitsinta, ja niiden pyyntö odottaa päätelaitetta, jota skriptisi ei koskaan tarjonnut.

Tarkistus 2: onko lapsiprosessilla päätelaite?

pty varaa päätelaitteen lapselle, mikä muuttaa pyynnöt luettavaksi tulosteeksi, johon voit vastata järjestyksessä.

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)

Yllä olevat pyyntömerkkijonot ovat havainnollistavia; kopioi tarkka teksti, jonka asiakkaasi tulostaa, mukaan lukien kirjainkoko ja välimerkit. Jokaisella odotuksella on aikakatkaisu, ja suljettu lapsi heittää poikkeuksen tilan palauttamisen sijaan, joten kääri sarja ja käsittele tiedoston loppu epäonnistumisena. Huomaa, mitä tämä lohko ei tee: lapsi kuolee skriptin mukana, koska pty ei ole irrotusmekanismi ja disown on kuoren sisäänrakennettu komento, joka ei tavoita prosessia, jonka skriptisi loi.

Tarkistus 3: onko tuettua ei-interaktiivista syötettä?

Näytön raapiminen hajoaa asiakaspäivityksissä, joten etsi ensin dokumentoitu valitsin.

Tarkista ohjetulosteesta tunnus- tai kertakoodivaihtoehto ja tarkista, hyväksyykö palvelu salasanakenttään liitetyn koodin. Kun asiakas lukee tunnistetiedostoa, anna sille tiedosto pyynnön sijaan:

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

Prosessin korvaaminen antaa asiakkaalle luettavan polun järjestelmissä, jotka tarjoavat /dev/fd. Salaisuus on asiakkaan näkökulmasta edelleen salaisuus, joten pidä se poissa lokeista, kuoren historiasta ja prosessilistauksista. Jos asiakas hylkää /dev/fd:n tai avaa tunnistepolun useammin kuin kerran, kirjoita oikea tiedosto rajoittavin oikeuksin ja poista se samassa skriptissä.

Tarkistus 4: elääkö tunneli skriptiä pidempään?

Oletuksena tunneli kuolee vanhempansa mukana, mikä on päinvastaista kuin käynnistysskripti tarvitsee.

disown -h auttaa vain, kun käynnistit asiakkaan kuoren työnä, koska se muokkaa kyseisen kuoren työtaulukkoa eikä tavoita prosessia, jonka skriptisi loi pty:n kautta. Palvelunhallinta on parempi koti kaikelle, jonka on yhdistettävä uudelleen ilman valvontaa, koska se käynnistää asiakkaan uudelleen ja kirjaa, miksi se kuoli. Joka tapauksessa odota uusi koodi jokaisen uudelleenyhdistämisen jälkeen: kertakäyttöinen tunnus kuluu ensimmäisessä onnistuneessa todentamisessa.

Katso, mitä sudo tekee sarjalle. sudon salasanapyyntö ei ole VPN:n pyyntö, ja siihen vastaaminen VPN:n salasanalla on yleisin tapa, jolla muuten oikea odotusjärjestys silti epäonnistuu.

Tarkistus 5: pitäisikö ihmisen koodi olla skriptissä?

Tämä on tarkistus, jonka ihmiset ohittavat. Tunnus kuuluu ihmiselle, kun taas aikataulun mukaan noustava tunneli kuuluu koneelle.

Jos työn on yhdistettävä uudelleen ilman valvontaa, kysy, voivatko konetodistus tai palvelutili korvata interaktiivisen kirjautumisen. Jonkun kertakoodin automatisointi muuttaa toisen tekijän tallennetuksi salaisuudeksi, mikä on käytäntömuutos eikä skriptauksen mukavuus. Kun palvelu tukee molempia, valitse tunniste, joka vastaa sitä, miten työ tosiasiassa ajetaan. Kirjoita vastaus muistiin, koska seuraava henkilö kysyy, miksi skripti pitää tunnusta.

Miltä toimiva skripti näyttää

Skripti tulostaa vaiheen, johon se pääsi, ei koskaan salaisuutta, ja poistuu nollasta poikkeavalla koodilla jokaisesta epäonnistuneesta odotuksesta.

Testaa se rikkomalla se tahallaan: väärä salasana, väärä ryhmä, vanhentunut tunnus. Jokaisen epäonnistumisen pitäisi pysähtyä nimettyyn vaiheeseen eikä jumittua. Aja se sitten kerran oikeaa palvelua vastaan ja tarkista tunneli skriptin ulkopuolelta, ei sen sisältä.

Aiheeseen liittyvät artikkelit