Az OpenVPN fut a shellben, de a cron alatt elbukik: a PATH a hibás
Egy parancs, amely shellből csatlakozik, a cron vagy a subprocess alatt elbukhat, mielőtt az alagút elindul. Javítsa az útvonalat, a munkakönyvtárat és a terminált.
Ugyanaz a parancs shellből csatlakozik és a cron alatt meghal, így a természetes következtetés az, hogy az alagút vagy a tanúsítvány a hibás. Mielőtt ezt elhinné, nézze meg, mi közös a két futásban: a bináris, a konfiguráció és a hitelesítő adatok azonosak, és csak a folyamat környezete változott. Amikor a programot még csak nem is találja meg, semmilyen mennyiségű TLS-hibakeresés nem segít. A javítás általában egy útvonalban, egy munkakönyvtárban és néhány környezeti változóban van, nem a VPN-ben.
command -v openvpn a működő shellben kiírja a választ, és ez nagyon gyakran /usr/sbin/openvpn, egy olyan könyvtár, amelyet a cron nem tesz rá a keresési útvonalára.
Az alagút soha nem indult el, tehát nem az alagút a probléma
A cron által indított feladatok minimális környezetet örökölnek, hagyományosan PATH=/usr/bin:/bin, és nem kapnak vezérlő terminált. Minden, ami a /usr/sbin vagy a /usr/local/sbin alatt van telepítve, egyszerűen hiányzik abból a listából, és a naplósor TLS-hiba helyett openvpn: not found-t ír. A Python subprocess-ja másként bukik el: az értelmező folyamatának környezetét örökli, amely gazdagabb lehet a cronénál, de még mindig nincs shellje a tilde kifejtéséhez. Mindkét hiba azelőtt történik, hogy egyetlen csomag elhagyná a gazdagépet.
Gyors módja a megkülönböztetésüknek, ha az első hibát olvassa az utolsó helyett. A hiányzó bináris shell- vagy Python-kivételt okoz, a rossz konfiguráció az OpenVPN használati üzenetét adja, az igazi kézfogási hiba pedig időbélyegeket és partner-címeket ad. Csak a harmadik alagútprobléma.
Az abszolút útvonalak és argumentumlisták legyőzik a shell-sztringeket
Adja át a feloldott útvonalat kifejezetten, és hagyja ki teljesen a shellt. subprocess.run(["/usr/sbin/openvpn", "--config", config, "--verb", "4"], capture_output=True, text=True, timeout=90) visszatérési kódot, stdoutot és stderrt ad, anélkül hogy shellt kérne egy fájlnév értelmezésére. A konfiguráció útvonalát a os.environ["HOME"] vagy a pathlib.Path.home() alapján építse fel, hogy a tildét soha ne kelljen kifejteni. Amikor valóban shell-szintaxisra van szüksége, használja a shlex.split-t, mert egy sztring .split()-gyel való felosztása minden szóközt tartalmazó útvonalon eltörik. Olvassa a stderrt is, mert az OpenVPN korai hibáinak többségét oda írja.
Ugyanez a szabály vonatkozik a cronra: a feladatsor nem bejelentkező shell, így semmi nem tölti be a profilját, és semmi nem definiálja az álneveit.
Mit örököl valójában egy crontab
Egy crontab-bejegyzés azt a környezetet kapja, amelyet a crontab deklarál, plusz néhány örökölt alapértelmezést, ezért írja ki az útvonalat, vagy csomagolja a hívást egy szkriptbe, amely ezt megteszi. Egy olyan sor, mint a PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin a fájl elején, lefedi a szokásos telepítési helyeket, és a >> cron.log 2>&1-mal való átirányítás az, ami a következő hibát olvashatóvá teszi. A jelszóval védett profil a cron alatt nem tudja megkérdezni a titkát, mivel nincs terminál, ahol kérdezhetne. Egy ilyen kapcsolat olyan systemd-egységbe való, amely tud hitelesítő fájlt olvasni, nem olyan feladatba, amely interaktívnak tetteti magát.
A relatív útvonalak a második csapda. A tesztfutás gyakran abból a mappából történik, amelyben a profil van, a cron-feladat pedig egészen máshol indul, ezért a --config office.ovpn olyan fájlra oldódik fel, amely nincs ott, és az üzenet hiányzó fájlként olvasható, nem hiányzó alagútként.
Bizonyítsa a környezet lecsupaszításával
Állítsa elő a minimális környezetet közvetlenül: env -i PATH=/usr/bin:/bin /usr/sbin/openvpn --config office.ovpn --verb 4. Ha abból a futásból útvonal- vagy terminálpanasz jön, a probléma a VPN fölött ül. Ha csatlakozik, a maradék gyanúsított az a fiók, amely alatt fut, a könyvtár, ahonnan indul, és a hitelesítő adat, amelyet bemutat. A két eredmény bármelyike jobb, mint a tanúsítványok ellenőrzésének még egy köre.
Ezután tegye a burkolót önmagát jelentővé. Minden elért szakaszhoz külön állapottal lépjen ki, naplózza mindkét adatfolyamot időbélyeggel, és a következő hiba megmondja, hogy az útvonal feloldásánál, a hitelesítésnél vagy azután halt-e meg, hogy az alagút már fent volt.
Az egységnek helyes sorrendre is szüksége van: a Wants=network-online.target plusz a After=network-online.target megakadályozza, hogy a kliens elinduljon, mielőtt létezne egy cím vagy alapértelmezett útvonal, ami különben tanúsítvány- vagy TLS-hibaként jelenik meg, amelyek kézi újraindításnál eltűnnek.