Sama skipun tengist úr skel og deyr undir cron, svo eðlileg ályktun er að göngin eða skírteinið sé sek um það. Horfðu á hvað keyrslurnar tvær eiga sameiginlegt áður en þú trúir því: tvíundin, stillingin og auðkennin eru eins, og aðeins umhverfi ferlisins breyttist. Þegar forritið finnst ekki einu sinni hjálpar engin TLS kembiforritun. Lagfæringin liggur venjulega í slóð, vinnumöppu og handfylli af umhverfisbreytum, ekki í VPN-inu.

command -v openvpn í skelinni sem virkar prentar svarið, og það er mjög oft /usr/sbin/openvpn, mappa sem cron setur ekki á leitarslóð sína.

Göngin byrjuðu aldrei, svo göngin eru ekki vandamálið

Verk sem cron ræsir erfa lágmarksumhverfi, venjulega PATH=/usr/bin:/bin, og enga stjórnflugstöð. Allt sem er uppsett í /usr/sbin eða /usr/local/sbin vantar einfaldlega af þeim lista, og logglinan segir openvpn: not found í stað TLS-villu. Python subprocess bregst öðruvísi: það erfir umhverfi túlkunarferlisins, sem getur verið ríkulegra en cron en hefur samt enga skel til að víkka tilda. Bæði mistökin eiga sér stað áður en eitt pakka yfirgefur hýsilinn.

Skjót leið til að greina þau er að lesa fyrstu villuna í stað þeirrar síðustu. Vantar tvíund gefur skel- eða Python-undantekningu, slæm stilling gefur notkunarboð OpenVPN, og raunverulegt handabandsmistök gefur tímastimpla og jafningjaföng. Aðeins þriðja er gangnamál.

Algildar slóðir og frumbreytulistar vinna á skeljastrengjum

Gefðu upp leystu slóðina skýrt og slepptu skelinni alveg. subprocess.run(["/usr/sbin/openvpn", "--config", config, "--verb", "4"], capture_output=True, text=True, timeout=90) gefur þér afturkóða, stdout og stderr án þess að biðja skel um að túlka skráarnafn. Byggðu stillingarslóðina úr os.environ["HOME"] eða pathlib.Path.home(), svo aldrei þurfi að víkka tilda. Þegar þú þarft virkilega skeljarsetningu skaltu nota shlex.split, því að kljúfa streng með .split() brotnar á hverri slóð sem inniheldur bil. Lestu líka stderr, því OpenVPN skrifar flest snemmmistök sín þangað.

Sama regla gildir um cron: verklinan er ekki innskráningarskel, svo ekkert hleður prófílnum þínum og ekkert skilgreinir samheiti þín.

Hvað crontab erfir í raun

crontab-færsla fær það umhverfi sem crontab lýsir yfir auk nokkurra arfinna sjálfgefna gilda, svo skrifaðu slóðina út eða vefðu kallið í skriftu sem gerir það. Lína eins og PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin efst í skránni nær yfir venjulega uppsetningarstaði, og endurbeining með >> cron.log 2>&1 er það sem gerir næstu mistök læsileg. Prófíll varinn með lykilsetningu hefur enga leið til að biðja um leyndarmálið sitt undir cron, þar sem engin flugstöð er til að spyrja í. Slik tenging á heima í systemd-einingu sem getur lesið auðkennisskrá, ekki í verki sem þykist vera gagnvirkt.

Afstæðar slóðir eru önnur gildran. Prófun keyrir oft úr möppunni sem geymir prófílinn, og cron-verk byrjar allt annars staðar, svo --config office.ovpn leysist í skrá sem er ekki þar og skilaboðin lesast sem skrá sem vantar frekar en göng sem vantar.

Sannaðu það með að afklæða umhverfið

Endurgerðu lágmarksumhverfið beint: env -i PATH=/usr/bin:/bin /usr/sbin/openvpn --config office.ovpn --verb 4. Kvörtun um slóð eða flugstöð úr þeirri keyrslu þýðir að vandamálið situr fyrir ofan VPN-ið. Ef það tengist eru eftir grunsamlegir reikningurinn sem það keyrir undir, mappan sem það byrjar í og auðkennið sem það leggur fram. Hvort sem er er betra en enn ein umferð af skírteinaprófun.

Gerðu síðan umbúðirnar sjálfsskýrandi. Farðu út með sérstöðu fyrir hvert stig sem það náði, skráðu báða strauma með tímastimpli, og næstu mistök segja þér hvort það dó við slóðarleysingu, við auðkenningu eða eftir að göngin voru þegar uppi.

Eining þarf líka rétta röð: Wants=network-online.target ásamt After=network-online.target koma í veg fyrir að biðlarinn byrji áður en til er vistfang eða sjálfgefin leið, sem annars kemur fram sem skírteina- eða TLS-villur sem hverfa við handvirka endurræsingu.

Tengdir greinar