Mae olrhain yn ymddangos pan fydd gorchymyn rheoli VPN yn dechrau, a’r reddf gyntaf yw gosod Python gwahanol neu bwyntio rhagosodiad y system i rywle arall. Mae’r reddf honno’n cymysgu dau amgylchedd rhedeg nad oes ganddynt ddim i’w wneud â’i gilydd. Mae un yn perthyn i’r system weithredu a’i hofferau pecyn; mae’r llall yn perthyn i ba bynnag brosiect rydych yn ei adeiladu. Newid yr un cyntaf i fodloni’r ail yw’r ffordd y mae desg sy’n gweithio yn colli ei rheolwr pecynnau.

Y gymhariaeth sy’n werth ei gwneud yw rhwng y gydran a fethodd mewn gwirionedd a’r amgylchedd rhedeg y mae gennych hawl i’w newid. Bron byth ydynt yr un gwrthrych.

Dau gwestiwn Python sy’n edrych fel un

Y cwestiwn cyntaf yw: pa ddehonglydd a redodd y rhaglen a argraffodd yr olrhain? Yr ail yw: pa ddehonglydd y dylai fy mhrosiect ei ddefnyddio? Maent yn edrych yn union yr un fath mewn terfynell oherwydd atebir y ddau drwy deipio python3, ac mae ganddynt wahanol berchnogion, gwahanol lwybrau uwchraddio a gwahanol radiws effaith.

Mae offeryn system yn rhwym i’r dehonglydd a ddaeth gyda’i ddosbarthiad, ynghyd â’r modiwlau crynhoi a adeiladwyd yn erbyn ABI y dehonglydd hwnnw. Mae prosiect yn rhwym i ba bynnag amgylchedd a grëwch ar ei gyfer. Mae symud rhagosodiad y system yn newid yr un cyntaf ar gyfer pob offeryn ar y peiriant ar unwaith; mae creu amgylchedd yn newid yr ail ar gyfer un cyfeiriadur.

Dim ond un o’r gweithredoedd hynny y gellir ei wrthdroi mewn munud. Nid yr un cyntaf yw hi.

Pa gydran a gynhyrchodd y gwall

Darllenwch linell gyntaf yr olrhain a’r ffeil weithredadwy a gynhyrchodd hi cyn darllen unrhyw beth arall. Mae’r blaen llinell orchymyn, y gwasanaeth breintiedig a’r bondiadau API yn ddarnau ar wahân, a dim ond rhai ohonynt sy’n Python o gwbl.

command -v openvpn3
head -n 1 "$(command -v openvpn3)"
dpkg -S "$(command -v openvpn3)" 2>/dev/null
systemctl status openvpn3-service-client --no-pager

Mae llinell gyntaf sgript yn enwi’r dehonglydd y bydd yn ei ddefnyddio, a dyna’r dehonglydd y daeth yr olrhain ohono. Mae’r ymholiad pecyn yn dweud wrthych pwy sy’n berchen ar y ffeil, sy’n penderfynu pwy ganiateir i’w newid. Mae statws y gwasanaeth yn ateb cwestiwn hollol wahanol: a yw’r ôl-ben breintiedig sy’n sefydlu sesiynau mewn gwirionedd yn rhedeg.

Mae gwall mewnforio modiwl, gwrthodiad actifadu D-Bus a chredensial wedi’i gwrthod yn dri cham gwahanol. Mae gwall mewnforio yn digwydd cyn bod unrhyw sesiwn yn bodoli, felly ni fydd unrhyw ffurfweddiad VPN yn ei drwsio, ac ni fydd gwasanaeth sy’n gweithio yn ei drwsio chwaith. Rhestru’r neges yn un o’r tri cham hynny yw’r gwir gam cyntaf.

Beth all amgylchedd prosiect ei drwsio a beth na all

Mae amgylchedd prosiect yn datrys problem prosiect: yr union fersiynau o lyfrgelloedd y mae un rhaglen eu hangen, wedi’u hynysu oddi wrth bopeth arall. Mae hynny’n ddefnyddiol iawn, a dyma’r offeryn cywir pan fo’r rhaglen sy’n methu yn sgript sy’n eiddo i chi.

uv run --python 3.11 app.py
python3 -c 'import openvpn3; print(openvpn3.__file__)'

Mae’r ail orchymyn yn dangos pa gopi o’r bondiadau y gall dehonglydd penodol ei weld, sef y ffordd gyflymaf i wahaniaethu pecyn coll oddi wrth un wedi’i orchuddio. Rheswch ef gyda’r dehonglydd y mae’r sgript sy’n methu yn ei ddefnyddio, nid gyda un gwahanol sy’n digwydd gweithio.

Yr hyn na all amgylchedd prosiect ei wneud yw trwsio blaen sydd wedi’i becynnu gan y dosbarthiad. Adeiladwyd dibyniaethau’r rhaglen honno ar gyfer y dehonglydd a ddewisodd y rheolwr pecynnau, ac mae ei rhedeg o fewn amgylchedd eich prosiect naill ai’n methu neu’n cynhyrchu cymysgedd nad oes neb yn ei gefnogi. Mae chwistrellu llwybrau iddo â newidyn amgylchedd yr un camgymeriad gyda chamau ychwanegol: rydych wedi newid beth mae’r offeryn yn ei lwytho heb newid yr hyn y cafodd ei brofi yn ei erbyn. Mae’r cyfnewid hwnnw’n edrych fel trwsiad am yn union gyhyd ag y mae’n ei gymryd i daro’r mewnforiad nesaf.

Pam mae ailgyfeirio dehonglydd y system yn fagl

Mae newid y dehonglydd rhagosodedig yn denu sylw oherwydd ei fod yn ymddangos yn trwsio’r olrhain ag un gorchymyn. Mae hefyd yn torri’r dybiaeth yr adeiladwyd pob offeryn Python pecyn ar y gwesteiwr arni, ac mae’r methiannau’n ymddangos yn ddiweddarach ac mewn mannau digyswllt.

Cynlluniwyd mecanweithiau dewis amgen i newid rhwng gweithrediadau cyfwerth, nid i osod iaith fwy newydd o dan fodiwlau crynhoi hŷn. Adeiledir estyniadau crynhoi ar gyfer ABI penodol, felly gall modiwl a fewnforiwyd ddoe fethu â llwytho heddiw heb i unrhyw becyn gael ei dynnu.

Mae trap enwi hefyd yn y cyngor y mae pobl yn dod o hyd iddo. Nid oes gan y gorchymyn python heb fersiwn un ystyr cyffredinol ar draws dosbarthiadau ac amgylcheddau, ac mae ei drin fel cyfystyr sefydlog ar gyfer prif fersiwn penodol yn cynhyrchu trwsiadau sy’n gweithio dim ond ar y peiriant lle cawsant eu hysgrifennu. Darllenwch bolisi’r system sydd o’ch blaen yn hytrach na’r un yn y blogbost.

Profion derbyn ar wahân

Mae dau brawf i fod ar y diwedd, ac nid yw pasio un yn dweud dim am y llall. Y cyntaf yw bod y gorchymyn cleient a gefnogir yn gweithio gyda’r dehonglydd y cafodd ei becynnu ar ei gyfer. Yr ail yw bod y gwasanaeth breintiedig yn sefydlu sesiwn ac mae’r twnnel yn cario traffig.

openvpn3 sessions-list
openvpn3-service-client --help 2>/dev/null | head -n 3
ip -4 addr show tun0

Cadwch ffordd annibynnol i’r peiriant wrth weithio, yn enwedig os mai’r VPN sy’n cario’ch unig fynediad gweinyddol. Mae newid i ddehonglydd system yn union y math yna o olygiad a all dynnu’r fynediad hwnnw hanner y ffordd.

Os mai modiwl coll ar gyfer offeryn system yw’r methiant, y cywiriad yw gweithrediad pecyn drwy’r llif gwaith a gefnogir. Os mai gwrthdaro fersiynau yn eich prosiect eich hun yw’r methiant, y cywiriad yw amgylchedd. Dewis rhwng y ddau hynny yw’r penderfyniad cyfan, ac fe’i pennir gan ba raglen a argraffodd yr olrhain.

Erthyglau cysylltiedig