Kiel aŭtomatigi VPN-saluton, kiu atendas ĵetonkodon
Komandlinia VPN-kliento, kiu demandas en terminalo, blokas skripton, kiu nur enpeligas pasvorton. Trapasu ĉi tiujn kvin kontrolojn antaŭ ol vi prenos expect.
Skripto, kiu lanĉas VPN-klienton de vendisto, pendas ĝis la tempolimo, kaj la protokolo montras, ke la kliento petas konfirmkodon, kiun neniu tajpis. La pasvorto estis provizita, do la evidenta konkludo estas, ke la pasvorto malĝustas. Ĝi ne estas. La koda peto estas aparta interparolo sur aparta kanalo, kaj via skripto neniam malfermis ĝin.
Trapasu la kvin kontrolojn sube en ordo. Haltu ĉe la unua, kiu malsukcesas, ĉar ĉiu posta paŝo supozas, ke la antaŭaj validas.
Kontrolo 1: ĉu la kliento entute legas la norman enigon?
Testu antaŭ ol vi skribos ajnan aŭtomatigon: enpelu falsan sekreton en la klienton kaj observu, kio okazas. Se ĝi presas sian peton kaj poste atendas, ĝi ne legas la pelilon.
Multaj klientoj malfermas la terminalan aparaton rekte, aŭ rifuzas preni sekreton el fluo, kiu ne estas terminalo, por ke vaganta pelilo ne povu liki pasvorton. OpenVPN estas la dokumentita escepto, ĉar --auth-user-pass prenas dosiervojon. Klientoj de vendistoj, kiuj petas unufojan kodon, kutime havas neniun ekvivalentan ŝaltilon, kaj ilia peto atendas terminalon, kiun via skripto neniam provizis.
Kontrolo 2: ĉu la ida procezo havas terminalon?
pty atribuas terminalon al la ido, kio transformas petojn en legeblan eligon, kiun vi povas respondi laŭ ordo.
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)La petĉenoj supre estas ilustraj; kopiu la ĝustan tekston, kiun via kliento presas, inkluzive de uskleco kaj interpunkcio. Ĉiu atendo portas tempolimon, kaj fermita ido ĵetas escepton anstataŭ redoni staton, do volvu la sinsekvon kaj traktu dosierfinon kiel malsukceson. Rimarku, kion ĉi tiu bloko ne faras: la ido mortas kun la skripto, ĉar pty ne estas malliga mekanismo kaj disown estas enkonstruita ŝelkomando, kiu ne povas atingi procezon, kiun via skripto kreis.
Kontrolo 3: ĉu ekzistas subtenata neinteraga enigo?
Ekrankratado rompiĝas ĉe klientaj ĝisdatigoj, do serĉu unue dokumentitan ŝaltilon.
Kontrolu la helpanelon por ĵetona aŭ unufoja koda opcio, kaj kontrolu, ĉu la servo akceptas la kodon aldonitan al la pasvorta kampo. Kie la kliento legas akreditilan dosieron, donu al ĝi la dosieron anstataŭ peton:
openvpn --config office.ovpn --auth-user-pass <(printf "%s\n%s\n" "$USER_NAME" "$PASSWORD")Proceza anstataŭigo donas al la kliento legeblan vojon sur sistemoj, kiuj provizas /dev/fd. La sekreto restas sekreto laŭ la vidpunkto de la kliento, do tenu ĝin ekster protokoloj, ŝela historio kaj procezaj listoj. Se la kliento rifuzas /dev/fd aŭ malfermas la akreditan vojon pli ol unufoje, skribu realan dosieron kun limigaj permesoj kaj forigu ĝin en la sama skripto.
Kontrolo 4: ĉu la tunelo postvivos la skripton?
Defaŭlte la tunelo mortas kun sia patro, kio estas la malo de tio, kion bezonas startiga skripto.
disown -h helpas nur kiam vi lanĉis la klienton kiel ŝelan taskon, ĉar ĝi redaktas la taskan tabelon de tiu ŝelo kaj ne povas atingi procezon, kiun via skripto kreis per pty. Servadministrilo estas la pli bona hejmo por ĉio, kio devas rekonektiĝi senprizone, ĉar ĝi restartigas la klienton kaj registras, kial ĝi mortis. Ĉiukaze, atendu novan kodon post ĉiu rekonekto: unufoja ĵetono konsumiĝas per la unua sukcesa aŭtentigo.
Rimarku, kion sudo faras al la sinsekvo. La pasvorta peto de sudo ne estas la peto de la VPN, kaj respondi al ĝi per la VPN-pasvorto estas la plej ofta maniero, kiel alie ĝusta ordo de atendoj tamen malsukcesas.
Kontrolo 5: ĉu la kodo de persono apartenu al skripto?
Ĉi tio estas la kontrolo, kiun homoj preterlasas. Ĵetono apartenas al persono, dum tunelo, kiu devas leviĝi laŭ horaro, apartenas al la maŝino.
Se tasko devas rekonektiĝi senprizone, demandu, ĉu maŝina atestilo aŭ serva konto povas anstataŭi la interagan saluton. Aŭtomatigi ies unufojan kodon transformas duan faktoron en konservitan sekreton, kio estas politika ŝanĝo, ne komforto por skriptoj. Kie la servo subtenas ambaŭ, elektu la akreditilon, kiu kongruas kun tio, kiel la tasko efektive funkcias. Skribu la respondon, ĉar la sekva persono demandos, kial la skripto tenas ĵetonon.
Kiel aspektas funkcianta skripto
La skripto presas la paŝon, kiun ĝi atingis, neniam la sekreton, kaj eliras per ne-nula kodo ĉe ĉiu malsukcesa atendo.
Testu ĝin per intenca rompo: malĝusta pasvorto, malĝusta grupo, eksvalidiĝinta ĵetono. Ĉiu malsukceso devus halti ĉe nomita paŝo anstataŭ pendi. Poste rulu ĝin unufoje kontraŭ la reala servo kaj kontrolu la tunelon de ekster la skripto, ne de interne.