OpenVPN töötab kestas, aga croni all ebaõnnestub: süüdi on PATH
Käsk, mis kestast ühendub, võib croni või subprocessi all ebaõnnestuda juba enne tunnelit. Parandage tee, töökataloog ja terminal.
Sama käsk ühendub kestast ja sureb croni all, seega loomulik järeldus on, et süüdi on tunnel või sertifikaat. Enne kui seda usud, vaata, mis on kahel käivitusel ühist: binaarfail, konfiguratsioon ja volitused on identsed ning muutus ainult protsessi keskkond. Kui programmi ei leita üldse, ei aita mingi kogus TLS-i silumist. Parandus peitub tavaliselt tees, töökataloogis ja peotäies keskkonnamuutujas, mitte VPN-is.
command -v openvpn töötavas kestas prindib vastuse ja see on väga sageli /usr/sbin/openvpn, kataloog, mida cron oma otsinguteele ei pane.
Tunnel ei alanud kunagi, seega tunnel ei ole probleem
Croni käivitatud tööd pärivad minimaalse keskkonna, tavaliselt PATH=/usr/bin:/bin, ja juhtiva terminali puudumise. Kõik, mis on paigaldatud kausta /usr/sbin või /usr/local/sbin, lihtsalt puudub sellest loendist ja logirida ütleb openvpn: not found TLS-vea asemel. Pythoni subprocess ebaõnnestub teisiti: see pärineb interpretaatori protsessi keskkonna, mis võib olla croni omast rikkalikum, kuid millel pole ikkagi kesta tildemärgi laiendamiseks. Mõlemad vead juhtuvad enne, kui ükski pakett hostist lahkub.
Kiire viis neid eristada on lugeda esimest viga, mitte viimast. Puuduv binaarfail tekitab kesta või Pythoni erindi, halb konfiguratsioon tekitab OpenVPN-i kasutusviisi teate ja tõeline kätlusviga tekitab ajatemplid ja partneri aadressid. Ainult kolmas on tunneli probleem.
Absoluutsed teed ja argumentide loendid löövad kestastringid
Edasta lahendatud tee selgesõnaliselt ja jäta kest täiesti vahele. subprocess.run(["/usr/sbin/openvpn", "--config", config, "--verb", "4"], capture_output=True, text=True, timeout=90) annab sulle tagastuskoodi, stdouti ja stderri, ilma et peaksid kesta paluma failinime tõlgendada. Ehita konfiguratsiooni tee os.environ["HOME"] või pathlib.Path.home() põhjal, et tildemärki ei peaks kunagi laiendama. Kui sul on tõesti vaja kesta süntaksit, kasuta shlex.split, sest stringi jagamine .split() abil katkeb igal teel, mis sisaldab tühikut. Loe ka stderri, sest OpenVPN kirjutab sinna enamiku oma varastest vigadest.
Sama reegel kehtib croni kohta: töörivi ei ole sisselogimiskest, seega miski ei laadi sinu profiili ja miski ei määratle sinu aliaseid.
Mida crontab tegelikult pärineb
crontab-kirje saab selle keskkonna, mille crontab deklareerib, pluss paar päritud vaikeväärtust, seega kirjuta tee välja või mässi kutse skripti, mis seda teeb. Rida nagu PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin faili alguses katab tavalised paigalduskohad ja ümbersuunamine >> cron.log 2>&1 abil on see, mis teeb järgmise vea loetavaks. Paroolifraasiga kaitstud profiilil pole croni all mingit viisi oma saladust küsida, sest küsimiseks pole terminali. Selline ühendus kuulub systemd-üksusesse, mis suudab volitusfaili lugeda, mitte töösse, mis teeskleb interaktiivset.
Relatiivsed teed on teine lõks. Testkäivitus toimub sageli kaustast, kus profiil asub, ja croni töö algab hoopis mujal, seega --config office.ovpn lahendub failiks, mida seal pole, ja teade loetakse puuduva failina, mitte puuduva tunnelina.
Tõesta seda keskkonda koorides
Taasta minimaalne keskkond otse: env -i PATH=/usr/bin:/bin /usr/sbin/openvpn --config office.ovpn --verb 4. Selle käivituse tee- või terminalikaebus tähendab, et probleem asub VPN-ist kõrgemal. Kui see ühendub, on ülejäänud kahtlusalused konto, mille all see töötab, kataloog, kust see algab, ja volitus, mille see esitab. Kumbki tulemus on parem kui veel üks sertifikaadikontrolli ring.
Seejärel tee mähis iseennast raporteerivaks. Välju eraldi staatusega iga saavutatud etapi kohta, logi mõlemad vood ajatempliga ja järgmine viga ütleb, kas see suri tee lahendamisel, autentimisel või pärast seda, kui tunnel oli juba püsti.
Üksus vajab ka õiget järjekorda: Wants=network-online.target pluss After=network-online.target hoiavad kliendi käivitumast enne, kui aadress või vaikimisi marsruut on olemas, mis muidu ilmneb sertifikaadi- või TLS-vigadena, mis käsitsi taaskäivitamisel kaovad.