E njëjta komandë lidhet nga një shell dhe vdes nën cron, prandaj përfundimi i natyrshëm është se fajtor është tuneli ose certifikata. Para se ta besoni këtë, shikoni çfarë kanë të përbashkët dy ekzekutimet: binari, konfigurimi dhe kredencialet janë identike, dhe ka ndryshuar vetëm mjedisi i procesit. Kur programi as nuk gjendet, asnjë sasi e korrigjimit të TLS nuk ndihmon. Rregullimi zakonisht ndodhet në një shteg, një drejtori pune dhe një grusht variablash mjedisi, jo në VPN.

command -v openvpn në shell-in që punon printon përgjigjen, dhe shumë shpesh është /usr/sbin/openvpn, një drejtori që cron nuk e vendos në shtegun e tij të kërkimit.

Tuneli nuk nisi kurrë, ndaj tuneli nuk është problemi

Punët që nis cron trashëgojnë një mjedis minimal, zakonisht PATH=/usr/bin:/bin, dhe asnjë terminal kontrolli. Çdo gjë e instaluar në /usr/sbin ose /usr/local/sbin thjesht mungon në atë listë, dhe rreshti i regjistrit lexon openvpn: not found në vend të një gabimi TLS. subprocess e Python dështon ndryshe: trashëgon mjedisin e procesit të interpretuesit, i cili mund të jetë më i pasur se ai i cron, por ende nuk ka një shell që të zgjerojë një tilde. Të dyja dështimet ndodhin përpara se një paketë e vetme të largohet nga hosti.

Një mënyrë e shpejtë për t'i dalluar është të lexoni gabimin e parë në vend të të fundit. Një binar që mungon prodhon një përjashtim shell ose Python, një konfigurim i keq prodhon një mesazh përdorimi të OpenVPN, dhe një dështim i vërtetë shtrëngimi duarsh prodhon vulat kohore dhe adresat e palëve. Vetëm i treti është problem tuneli.

Shtigjet absolute dhe listat e argumenteve mundin vargjet e shell

Kalo shtegun e zgjidhur në mënyrë eksplicite dhe anashkalo shell-in plotësisht. subprocess.run(["/usr/sbin/openvpn", "--config", config, "--verb", "4"], capture_output=True, text=True, timeout=90) ju jep një kod kthimi, stdout dhe stderr pa i kërkuar një shell të interpretojë një emër skedari. Ndërto shtegun e konfigurimit nga os.environ["HOME"] ose pathlib.Path.home(), që një tilde të mos duhet të zgjerohet kurrë. Kur ju nevojitet vërtet sintaksa e shell, përdorni shlex.split, sepse ndarja e një vargu me .split() prishet në çdo shteg që përmban një hapësirë. Lexoni edhe stderr, pasi OpenVPN shkruan atje shumicën e dështimeve të tij të hershme.

I njëjti rregull vlen për cron: rreshti i punës nuk është shell hyrjeje, kështu që asgjë nuk ngarkon profilin tuaj dhe asgjë nuk përcakton pseudonimet tuaja.

Çfarë trashëgon në të vërtetë një crontab

Një zë në crontab merr mjedisin që deklaron crontab-i plus disa vlera të parazgjedhura të trashëguara, prandaj shkruani shtegun plotësisht ose mbështillni thirrjen në një skript që e bën këtë. Një rresht si PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin në krye të skedarit mbulon vendet e zakonshme të instalimit, dhe ridrejtimi me >> cron.log 2>&1 është ajo që e bën të lexueshëm dështimin tjetër. Një profil i mbrojtur me frazë kalimi nuk ka si të kërkojë sekretin e tij nën cron, pasi nuk ekziston terminal për të pyetur. Një lidhje e tillë i përket një njësie systemd që mund të lexojë një skedar kredencialesh, jo një pune që shtiret si interaktive.

Shtigjet relative janë kurthi i dytë. Një provë shpesh bëhet nga dosja që mban profilin, dhe një punë cron nis diku krejt tjetër, prandaj --config office.ovpn zgjidhet në një skedar që nuk është aty dhe mesazhi lexohet si skedar që mungon dhe jo si tunel që mungon.

Provojeni duke e zhveshur mjedisin

Riprodhoni mjedisin minimal drejtpërdrejt: env -i PATH=/usr/bin:/bin /usr/sbin/openvpn --config office.ovpn --verb 4. Një ankesë për shteg ose terminal nga ai ekzekutim do të thotë që problemi qëndron mbi VPN. Nëse lidhet, të dyshuarit e mbetur janë llogaria nën të cilën punon, drejtoria ku nis dhe kredenciali që paraqet. Secili prej dy rezultateve është më i mirë se një raund tjetër kontrolli certifikatash.

Pastaj bëjeni mbështjellësin vetë-raportues. Dilni me një status të veçantë për çdo fazë që arriti, regjistroni të dy rrjedhat me vulë kohore, dhe dështimi tjetër do t'ju thotë nëse vdiq në zgjidhjen e shtegut, në vërtetim apo pasi tuneli ishte tashmë lart.

Një njësi ka nevojë edhe për rendin e duhur: Wants=network-online.target plus After=network-online.target e mbajnë klientin të mos nisë përpara se të ekzistojë një adresë ose një rrugë e parazgjedhur, gjë që përndryshe shfaqet si gabime certifikate ose TLS që zhduken në një rinisje manuale.

Artikuj të ngjashëm