Sama komento yhdistää kuoresta ja kuolee cronin alla, joten luonnollinen johtopäätös on, että tunneli tai varmenne on syyllinen. Katso, mitä kahdella ajolla on yhteistä, ennen kuin uskot sitä: binääri, kokoonpano ja tunnistetiedot ovat identtiset, ja vain prosessin ympäristö muuttui. Kun ohjelmaa ei edes löydetä, mikään määrä TLS-vianetsintää ei auta. Korjaus on yleensä polussa, työhakemistossa ja kourallisessa ympäristömuuttujia, ei VPN:ssä.

command -v openvpn toimivassa kuoressa tulostaa vastauksen, ja se on hyvin usein /usr/sbin/openvpn, hakemisto, jota cron ei laita hakupolulleen.

Tunneli ei koskaan käynnistynyt, joten tunneli ei ole ongelma

Cronin käynnistämät työt perivät minimaalisen ympäristön, tavallisesti PATH=/usr/bin:/bin, eikä ohjaavaa päätettä. Kaikki hakemistoon /usr/sbin tai /usr/local/sbin asennettu yksinkertaisesti puuttuu tältä listalta, ja lokirivi lukee openvpn: not found TLS-virheen sijaan. Pythonin subprocess epäonnistuu toisin: se perii tulkkiprosessin ympäristön, joka voi olla cronin ympäristöä rikkaampi mutta jolla ei silti ole kuorta tilde-merkin laajentamiseen. Molemmat epäonnistumiset tapahtuvat ennen kuin yksikään paketti lähtee isännästä.

Nopea tapa erottaa ne on lukea ensimmäinen virhe viimeisen sijaan. Puuttuva binääri tuottaa kuori- tai Python-poikkeuksen, huono kokoonpano tuottaa OpenVPN:n käyttöviestin ja todellinen kättelyvirhe tuottaa aikaleimat ja vastapuolen osoitteet. Vain kolmas on tunneliongelma.

Absoluuttiset polut ja argumenttilistat voittavat kuorimerkkijonot

Anna ratkaistu polku eksplisiittisesti ja ohita kuori kokonaan. subprocess.run(["/usr/sbin/openvpn", "--config", config, "--verb", "4"], capture_output=True, text=True, timeout=90) antaa paluukoodin, stdoutin ja stderrin ilman, että kuorta pyydetään tulkitsemaan tiedostonimeä. Rakenna kokoonpanon polku os.environ["HOME"] tai pathlib.Path.home() pohjalta, jotta tilde-merkkiä ei koskaan tarvitse laajentaa. Kun todella tarvitset kuorisyntaksia, käytä shlex.split, koska merkkijonon jakaminen .split() avulla hajoaa jokaisella polulla, jossa on välilyönti. Lue myös stderr, sillä OpenVPN kirjoittaa sinne suurimman osan varhaisista epäonnistumisistaan.

Sama sääntö koskee cronia: työrivi ei ole kirjautumiskuori, joten mikään ei lataa profiiliasi eikä mikään määrittele aliaksiasi.

Mitä crontab todella perii

Crontab-merkintä saa sen ympäristön, jonka crontab julistaa, plus muutaman perityn oletusarvon, joten kirjoita polku auki tai kääri kutsu skriptiin, joka tekee sen. Rivi kuten PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin tiedoston alussa kattaa tavalliset asennuspaikat, ja uudelleenohjaus >> cron.log 2>&1 avulla on se, mikä tekee seuraavasta epäonnistumisesta luettavan. Salalauseella suojatulla profiililla ei ole cronin alla mitään tapaa kysyä salaisuuttaan, koska kysymiseen ei ole päätettä. Tällainen yhteys kuuluu systemd-yksikköön, joka voi lukea tunnistetiedostoa, ei työhön, joka teeskentelee olevansa interaktiivinen.

Suhteelliset polut ovat toinen ansa. Testiajo tapahtuu usein kansiosta, jossa profiili on, ja cron-työ käynnistyy aivan muualla, joten --config office.ovpn ratkeaa tiedostoksi, jota siellä ei ole, ja viesti luetaan puuttuvana tiedostona eikä puuttuvana tunnelina.

Todista se riisumalla ympäristö

Toista minimaalinen ympäristö suoraan: env -i PATH=/usr/bin:/bin /usr/sbin/openvpn --config office.ovpn --verb 4. Polku- tai päätevalitus siitä ajosta tarkoittaa, että ongelma istuu VPN:n yläpuolella. Jos se yhdistää, jäljellä olevat epäillyt ovat tili, jonka alla se pyörii, hakemisto, josta se käynnistyy, ja tunnistetieto, jonka se esittää. Kumpi tahansa tulos on parempi kuin vielä yksi varmenteen tarkistuskierros.

Tee sitten kääreestä itsestään raportoiva. Poistu erillisellä tilalla jokaisesta saavutetusta vaiheesta, kirjaa molemmat virrat aikaleimalla, ja seuraava epäonnistuminen kertoo, kuoliko se polun ratkaisuun, todennukseen vai sen jälkeen, kun tunneli oli jo ylhäällä.

Yksikkö tarvitsee myös oikean järjestyksen: Wants=network-online.target plus After=network-online.target estävät asiakasta käynnistymästä ennen kuin osoite tai oletusreitti on olemassa, mikä muuten ilmenee varmenne- tai TLS-virheinä, jotka katoavat manuaalisessa uudelleenkäynnistyksessä.

Aiheeseen liittyvät artikkelit