OpenVPN-ek shell-ean funtzionatzen du, baina cron-en huts egiten du: PATH da arrazoia
Shell batetik konektatzen den komando batek huts egin dezake cron edo subprocess pean tunela hasi aurretik. Konpondu bidea, lan-direktorioa eta terminala.
Komando berak shell batetik konektatzen du eta cron pean hiltzen da, beraz ondorio naturala tunela edo ziurtagiria dela errudun pentsatzea da. Sinetsi aurretik begiratu zer duten bi exekuzioek komunean: binarioa, konfigurazioa eta kredentzialak berdinak dira, eta prozesuaren ingurunea soilik aldatu da. Programa aurkitu ere egiten ez denean, TLS arazketa-kopuru handiak ez du laguntzen. Konponbidea bide batean, lan-direktorio batean eta ingurune-aldagai eskukada batean egon ohi da, ez VPN-an.
command -v openvpn funtzionatzen duen shell-ean erantzuna inprimatzen du, eta oso maiz /usr/sbin/openvpn da, cron-ek bere bilaketa-bidean jartzen ez duen direktorioa.
Tunela ez zen inoiz hasi, beraz tunela ez da arazoa
cron-ek abiarazitako lanek ingurune minimala heredatzen dute, normalean PATH=/usr/bin:/bin, eta ez dute kontrol-terminalik. /usr/sbin edo /usr/local/sbin-n instalatutako edozer lista horretatik soilik falta da, eta erregistro-lerroak TLS erro baten ordez openvpn: not found dio. Python-en subprocess beste modu batera huts egiten du: interpretatzailearen prozesuaren ingurunea heredatzen du, cron-ena baino aberatsagoa izan daitekeena, baina oraindik ez du tilda bat zabaltzeko shell-ik. Bi hutsegiteak pakete bakar bat hostetik atera aurretik gertatzen dira.
Haiek bereizteko modu azkarra azken errorea beharrean lehen errorea irakurtzea da. Falta den binario batek shell edo Python salbuespena sortzen du, konfigurazio txar batek OpenVPN erabilera-mezua sortzen du, eta benetako handshake hutsegiteak denbora-markak eta pare-kokapenak sortzen ditu. Hirugarrena soilik da tunel-arazoa.
Bide absolutuek eta argumentu-zerrendek shell kateak gainditzen dituzte
Pasatu ebatzitako bidea modu esplizituan eta saltatu shell-a erabat. subprocess.run(["/usr/sbin/openvpn", "--config", config, "--verb", "4"], capture_output=True, text=True, timeout=90) itzultze-kodea, stdout eta stderr ematen dizkizu shell bati fitxategi-izena interpretatzeko eskatu gabe. Eraiki konfigurazioaren bidea os.environ["HOME"] edo pathlib.Path.home()-tik, tilda bat inoiz zabaldu behar ez dadin. Benetan shell sintaxia behar duzunean, erabili shlex.split, zeren kate bat .split()-rekin zatitzeak huts egiten baitu zuriunea duen edozein bidetan. Irakurri stderr ere, OpenVPN bere hutsegite goiztiar gehienak han idazten baititu.
Arau berdina cron-entzat: lanaren lerroa ez da saioa hasteko shell bat, beraz ezerk ez du zure profila kargatzen eta ezerk ez ditu zure aliasak definitzen.
Zer heredatzen duen crontab-ek benetan
crontab sarrera batek crontab-ek deklaratzen duen ingurunea jasotzen du gehi heredatutako balio lehenetsi batzuk, beraz idatzi bidea oso-osorik edo bildu deia hori egiten duen script batean. Fitxategiaren goiko PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin bezalako lerro batek ohiko instalazio-lekuak estaltzen ditu, eta >> cron.log 2>&1-rekin berbideratzeak egiten du hurrengo hutsegitea irakurgarri. Pasaesaldi batekin babestutako profilak ez du modurik cron pean bere sekretua eskatzeko, ez baitago galdetzeko terminalik. Halako konexioa kredentzialen fitxategi bat irakur dezakeen systemd unitate batean dagokio, ez interaktiboa dela planteatzen duen lan batean.
Bide erlatiboak dira bigarren tranpa. Proba-exekuzioa profila duen karpetatik gertatzen da sarritan, eta cron lana guztiz beste leku batean hasten da, beraz --config office.ovpn han ez dagoen fitxategi batean ebazten da eta mezua falta den tunela baino falta den fitxategi gisa irakurtzen da.
Frogatu ingurunea erauziz
Berriz ere sortu ingurune minimoa zuzenean: env -i PATH=/usr/bin:/bin /usr/sbin/openvpn --config office.ovpn --verb 4. Exekuzio horretatik bide edo terminal kexa bat badator, arazoa VPN-aren gainean dago. Konektatzen bada, gainerako susmagarriak hauek dira: exekutatzen den kontua, hasten den direktorioa eta aurkezten duen kredentziala. Bi emaitzetako edozein hobe da ziurtagirien egiaztatze-txanda bat baino.
Ondoren egin bilgarria auto-txostengilea. Irten iritsitako etapa bakoitzeko egoera bereizi batekin, erregistratu bi fluxuak denbora-markarekin, eta hurrengo hutsegiteak esango dizu bidearen ebazpenean, autentifikazioan edo tunela jada altxatuta zegoela hil zen.
Unitate batek orden egokia ere behar du: Wants=network-online.target gehi After=network-online.target-k bezeroa ez dira hasten helbide edo bide lehenetsi bat existitu aurretik, eta bestela ziurtagiri edo TLS erro gisa azaltzen da, eskuz berrabiaraztean desagertzen direnak.