OpenVPN jaħdem f’shell imma jfalli taħt cron: il-PATH huwa l-problema
Kmand li jikkonnettja minn shell jista’ jfalli taħt cron jew subprocess qabel ma jibda t-tunnel. Sejjaħ il-passaġġ, id-direttorju tax-xogħol u t-terminal.
L-istess kmand jikkonnettja minn shell u jmut taħt cron, għalhekk il-konklużjoni naturali hija li t-tunnel jew iċ-ċertifikat huwa ħati. Ħares lejn x’għandhom komuni ż-żewġ ġirjiet qabel ma temmen dan: il-binarju, il-konfigurazzjoni u l-kredenzjali huma identiċi, u nbidel biss l-ambjent tal-proċess. Meta l-programm lanqas biss jinstab, l-ebda ammont ta’ debug TLS ma jgħin. Is-sewwa normalment jinsab fi passaġġ, direttorju tax-xogħol u ftit varjabbli tal-ambjent, mhux fil-VPN.
command -v openvpn fis-shell li taħdem jipprintja t-tweġiba, u ħafna drabi huwa /usr/sbin/openvpn, direttorju li cron ma jqegħdux fil-passaġġ tat-tiftix tiegħu.
It-tunnel qatt ma beda, għalhekk it-tunnel mhuwiex il-problema
Ix-xogħlijiet li jibda cron jirtu ambjent minimu, konvenzjonalment PATH=/usr/bin:/bin, u l-ebda terminal ta’ kontroll. Kull ma hu installat f’/usr/sbin jew /usr/local/sbin sempliċement huwa nieqes minn dik il-lista, u l-linja tal-log taqra openvpn: not found minflok żball TLS. subprocess ta’ Python jfalli b’mod differenti: jiret l-ambjent tal-proċess tal-interpretatur, li jista’ jkun aktar għani minn dak ta’ cron imma għad m’għandux shell biex jespandi tilde. Iż-żewġ fallimenti jseħħu qabel ma pakkett wieħed iħalli l-host.
Mod mgħaġġel biex tiddistingwihom huwa li taqra l-ewwel żball minflok l-aħħar. Binarju nieqes jipproduċi eċċezzjoni ta’ shell jew Python, konfigurazzjoni ħażina tipproduċi messaġġ ta’ użu ta’ OpenVPN, u falliment veru ta’ handshake jipproduċi timbri tal-ħin u indirizzi tal-pari. Biss it-tielet huwa problema tat-tunnel.
Passaġġi assoluti u listi ta’ argumenti jegħlbu l-istringi tas-shell
Għaddi l-passaġġ riżolt b’mod espliċitu u aqbeż is-shell għal kollox. subprocess.run(["/usr/sbin/openvpn", "--config", config, "--verb", "4"], capture_output=True, text=True, timeout=90) jagħtik kodiċi tar-ritorn, stdout u stderr mingħajr ma titlob lis-shell jinterpreta isem ta’ fajl. Ibni l-passaġġ tal-konfigurazzjoni minn os.environ["HOME"] jew pathlib.Path.home(), biex tilde qatt ma jkollha tiġi espansa. Meta tassew għandek bżonn sintassi tas-shell, uża shlex.split, għax il-qsim ta’ string b’.split() jinkiser fuq kull passaġġ li jkun fih spazju. Aqra wkoll stderr, għax OpenVPN jikteb hemm ħafna mill-fallimenti bikrija tiegħu.
L-istess regola tapplika għal cron: il-linja tax-xogħol mhijiex shell tal-login, għalhekk xejn ma jgħabbi l-profil tiegħek u xejn ma jiddefinixxi l-alias tiegħek.
X’jiret crontab fil-verità
Entrata ta’ crontab tirċievi l-ambjent li jiddikjara l-crontab flimkien ma’ ftit valuri prestabbiliti li jintirtu, għalhekk ikteb il-passaġġ kollu jew dawwar is-sejħa fi skript li jagħmel dan. Linja bħal PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin fil-bidu tal-fajl tkopri l-postijiet tas-soltu tal-installazzjoni, u r-ridirezzjoni b’>> cron.log 2>&1 hija dik li tagħmel il-falliment li jmiss tinqara. Profil protett b’passphrase m’għandu l-ebda mod kif jitlob is-sigriet tiegħu taħt cron, għax ma teżistix terminal biex tistaqsi fuqha. Konnessjoni bħal din tappartjeni għal unità systemd li tista’ taqra fajl ta’ kredenzjali, mhux għal xogħol li jippretendi li hu interattiv.
Passaġġi relattivi huma t-tieni nassa. Ġirja ta’ prova spiss issir mill-folder li jżomm il-profil, u xogħol ta’ cron jibda f’post kompletament ieħor, għalhekk --config office.ovpn jiġi riżolt fi fajl li m’hemmx u l-messaġġ jinqara bħala fajl nieqes aktar milli tunnel nieqes.
Ipprova dan billi tneħħi l-ambjent
Irriproduċi l-ambjent minimu direttament: env -i PATH=/usr/bin:/bin /usr/sbin/openvpn --config office.ovpn --verb 4. Ilment dwar il-passaġġ jew it-terminal minn dik il-ġirja jfisser li l-problema qiegħda fuq il-VPN. Jekk jikkonnettja, il-suspettati li jifdal huma l-kont li taħtu jaħdem, id-direttorju li fih jibda u l-kredenzjali li jippreżenta. Kwalunkwe miż-żewġ riżultati huwa aħjar minn dawra oħra ta’ verifika taċ-ċertifikati.
Imbagħad agħmel il-wrapper jirrapporta lilu nnifsu. Oħroġ bi status distint għal kull stadju li wasal għalih, illoggja ż-żewġ flussi b’timbru tal-ħin, u l-falliment li jmiss jgħidlek jekk mietx fir-riżoluzzjoni tal-passaġġ, fl-awtentikazzjoni, jew wara li t-tunnel kien diġà ’l fuq.
Unità għandha bżonn ukoll ordni korretta: Wants=network-online.target flimkien ma’ After=network-online.target iżommu l-klijent milli jibda qabel ma jkun hemm indirizz jew rotta prestabbilita, li xort’oħra jidher bħala żbalji taċ-ċertifikat jew TLS li jisparixxu meta terġa’ tibda manwalment.