Скрипта која покреће VPN клијент добављача виси док не истекне време, а дневник показује да клијент тражи верификациони код који нико није унео. Лозинка је била достављена, па је очигледан закључак да је лозинка погрешна. Није. Захтев за код је одвојен разговор на одвојеном каналу, и ваша скрипта га никада није отворила.

Прођите кроз пет провера испод по реду. Зауставите се на првој која не успе, јер сваки следећи корак претпоставља да претходни важе.

Провера 1: да ли клијент уопште чита стандардни улаз?

Тестирајте пре него што напишете било какву аутоматизацију: пошаљите клијенту лажни тајни податак кроз цев и гледајте шта се дешава. Ако испише свој захтев и затим чека, не чита цев.

Многи клијенти отварају уређај терминала директно, или одбијају да узму тајни податак из тока који није терминал, како залутала цев не би могла да процури лозинку. OpenVPN је документовани изузетак, јер --auth-user-pass прихвата путању до датотеке. Клијенти добављача који траже једнократни код обично немају еквивалентну опцију, и њихов захтев чека терминал који ваша скрипта никада није обезбедила.

Провера 2: да ли дете процес има терминал?

pty додељује терминал детету, што захтеве претвара у читљив излаз на који можете да одговорите по реду.

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)

Низови захтева горе су илустративни; копирајте тачан текст који вашег клијент исписује, укључујући велика и мала слова и интерпункцију. Свако очекивање има временско ограничење, а затворено дете баца изузетак уместо да врати статус, зато обавите низ и третирајте крај датотеке као неуспех. Обратите пажњу шта овај блок не ради: дете умире са скриптом, јер pty није механизам за одвајање, а disown је уграђена наредба шкољке која не може да стигне до процеса који је ваша скрипта створила.

Провера 3: да ли постоји подржан неинтерактивни улаз?

Стругање екрана се квари при надоградњама клијента, зато прво тражите документовану опцију.

Прегледајте излаз помоћи за опцију токена или једнократног кода и проверите да ли услуга прихвата код додат пољу лозинке. Где клијент чита датотеку акредитива, дајте му датотеку уместо захтева:

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

Замена процеса даје клијенту читљиву путању на системима који нуде /dev/fd. Тајни податак је и даље тајан са становишта клијента, зато га држите даље од дневника, историје шкољке и спискова процеса. Ако клијент одбије /dev/fd или путању акредитива отвори више од једном, напишите праву датотеку са строгим дозволама и избришите је у истој скрипти.

Провера 4: да ли ће тунел надживети скрипту?

Подразумевано тунел умире са својим родитељем, што је супротно од онога што је потребно скрипти за подизање.

disown -h помаже само када сте клијента покренули као задатак шкољке, јер уређује табелу задатака те шкољке и не може да стигне до процеса који је ваша скрипта створила преко pty. Менаџер услуга је бољи дом за све што мора поново да се повеже без надзора, јер рестартује клијента и бележи зашто је умро. У сваком случају, очекујте нови код после сваког поновног повезивања: једнократни токен се троши при првој успешној аутентификацији.

Обратите пажњу шта sudo чини са низом. Захтев за лозинку sudo није захтев VPN-а, а одговор на њега лозинком VPN-а најчешћи је начин да иначе исправан редослед очекивања ипак не успе.

Провера 5: да ли код особе треба да буде у скрипти?

Ово је провера коју људи прескачу. Токен припада особи, док тунел који мора да се подигне по распореду припада машини.

Ако задатак мора поново да се повезује без надзора, питајте да ли машински сертификат или сервисни налог могу да замене интерактивну пријаву. Аутоматизација нечијег једнократног кода претвара други фактор у сачувани тајни податак, што је промена политике, а не погодност за скрипте. Где услуга подржава обоје, изаберите акредитив који одговара начину на који задатак заиста ради. Запишите одговор, јер ће следећа особа питати зашто скрипта држи токен.

Како изгледа скрипта која ради

Скрипта исписује корак до којег је стигла, никада тајни податак, и излази са ненултим кодом при сваком неуспелом очекивању.

Тестирајте је намерним кварењем: погрешна лозинка, погрешна група, истекао токен. Сваки неуспех треба да се заустави на именованом кораку уместо да виси. Затим је једном покрените против праве услуге и проверите тунел споља од скрипте, не изнутра.

Повезани чланци