Deselde kommando ferbynt út in shell en stjert ûnder cron, dus de natuerlike konklúzje is dat de tunnel of it sertifikaat skuld hat. Sjoch wat de beide runs mienskiplik hawwe foardat jo dat leauwe: it binêre bestân, de konfiguraasje en de bewizen binne identyk, en allinnich de omjouwing fan it proses is feroare. As it programma sels net fûn wurdt, helpt gjin inkelde TLS-ûntfouting. De reparaasje sit meastentiids yn in paad, in wurkmap en in hânfol omjouwingsfariabelen, net yn de VPN.

command -v openvpn yn ’e shell dy’t wurket prints it antwurd, en it is hiel faak /usr/sbin/openvpn, in map dy’t cron net op syn sykpaad set.

De tunnel begûn nea, dus de tunnel is it probleem net

Taken dy’t troch cron start wurde, ervje in minimaal omjouwing, gewoanwei PATH=/usr/bin:/bin, en gjin kontrolearjende terminaal. Alles wat yn /usr/sbin of /usr/local/sbin ynstallearre is, ûntbrekt gewoan yn dy list, en de logrigel lêst openvpn: not found ynstee fan in TLS-flater. Python syn subprocess mislearret oars: it ervet de omjouwing fan it ynterpretearjende proses, dy’t riker wêze kin as dy fan cron mar noch gjin shell hat om in tilde út te wreidzjen. Beide mislearrings barre foardat ien pakket de host ferlit.

In snelle manier om se te ûnderskieden is de earste flater te lêzen ynstee fan de lêste. In ûntbrekkend binêr bestân jout in shell- of Python-útsûndering, in minne konfiguraasje jout in OpenVPN-brûksberjocht, en in echte handshake-flater jout tiidstempels en peer-adressen. Allinnich de tredde is in tunnelprobleem.

Absolute paden en argumintlisten ferslaan shell-strings

Jou it oploste paad eksplisyt en slach de shell hielendal oer. subprocess.run(["/usr/sbin/openvpn", "--config", config, "--verb", "4"], capture_output=True, text=True, timeout=90) jout jo in weromkaad, stdout en stderr sûnder in shell te freegjen in bestânsnamme te ynterpretearjen. Bou it konfiguraasjepaad út os.environ["HOME"] of pathlib.Path.home(), sadat in tilde nea útwreide hoecht te wurden. As jo echt shell-syntaksis nedich hawwe, brûk shlex.split, want in string splitsje mei .split() brekt op elk paad mei in spaasje. Lês ek stderr, om’t OpenVPN dêr de measte fan syn iere flaters skriuwt.

Deselde regel jildt foar cron: de taakrigel is gjin oanmeld-shell, dus neat laadt jo profyl en neat definiearret jo aliasen.

Wat in crontab echt ervet

In crontab-ynfier krijt de omjouwing dy’t de crontab ferklearret plus in pear erfdde standertwearden, dus skriuw it paad út of wikselje de oprop yn in skript dat dat docht. In rigel lykas PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin boppe-oan it bestân dekt de gewoane ynstallaasjeplakken, en trochstjoere mei >> cron.log 2>&1 is wat de folgjende flater lêsber makket. In profyl beskerme mei in wachtwurdsin hat gjin manier om ûnder cron om syn geheim te freegjen, om’t der gjin terminaal is om op te freegjen. Sa’n ferbining heart yn in systemd-ienheid dy’t in bewisbestân lêze kin, net yn in taak dy’t him foardocht as ynteraktyf.

Relative paden binne de twadde falstrik. In testrun bart faak út de map dy’t it profyl hat, en in cron-taak begjint hiel earne oars, dus --config office.ovpn lost op yn in bestân dat der net is en it berjocht wurdt lêzen as in ûntbrekkend bestân ynstee fan in ûntbrekkende tunnel.

Bewiis it troch de omjouwing ôf te stripen

Reprodusearje de minimale omjouwing direkt: env -i PATH=/usr/bin:/bin /usr/sbin/openvpn --config office.ovpn --verb 4. In paad- of terminaalklacht út dy run betsjut dat it probleem boppe de VPN sit. As it ferbynt, binne de oerbleaune fertochten it akkount wêrûnder it draait, de map wêryn it start, en it bewis dat it presintearret. Elk fan de beide resultaten is better as noch in ronde sertifikaatkontrôle.

Meitsje dan de wikkel selsrapportearjend. Einigje mei in aparte status foar elke faze dy’t it berikte, log beide streamen mei in tiidstempel, en de folgjende flater fertelt jo oft it stoar by paadoplossing, by autentikaasje of neidat de tunnel al oan wie.

In ienheid hat ek juste folchoarder nedich: Wants=network-online.target plus After=network-online.target hâlde de klant tsjin om te starten foardat in adres of standertrûte bestiet, wat oars oan it ljocht komt as sertifikaat- of TLS-flaters dy’t by in hânmjittige werstart ferdwine.

Relatearre artikelen