OpenVPN hufanya kazi kwenye shell lakini hushindwa chini ya cron: tatizo ni PATH
Amri inayounganisha kutoka kwenye shell inaweza kushindwa chini ya cron au subprocess kabla ya handaki kuanza. Rekebisha njia, folda ya kazi na terminali.
Amri hiyo hiyo inaunganisha kutoka kwenye shell na kufa chini ya cron, kwa hiyo hitimisho la kawaida ni kwamba handaki au cheti ndicho chenye lawama. Kabla ya kuamini hilo, angalia kile ambacho utekelezaji wawili wanashiriki: faili ya binary, usanidi na vitambulisho ni sawa, na ni mazingira ya mchakato pekee yaliyobadilika. Wakati programu haipatikani hata, hakuna kiasi cha utatuzi wa TLS kinachosaidia. Marekebisho kwa kawaida huwa katika njia, folda ya kazi na visanduku vichache vya mazingira, si kwenye VPN.
command -v openvpn kwenye shell inayofanya kazi huchapisha jibu, na mara nyingi huwa /usr/sbin/openvpn, folda ambayo cron haiweki kwenye njia yake ya utafutaji.
Handaki hakilianza kamwe, kwa hiyo handaki si tatizo
Kazi zinazoanzishwa na cron hurithi mazingira madogo, kwa kawaida PATH=/usr/bin:/bin, na hazipati terminali ya udhibiti. Kila kitu kilichosakinishwa kwenye /usr/sbin au /usr/local/sbin hakipo kabisa kwenye orodha hiyo, na mstari wa kumbukumbu husoma openvpn: not found badala ya hitilafu ya TLS. subprocess ya Python hushindwa kwa namna nyingine: hurithi mazingira ya mchakato wa mkalimani, ambayo yanaweza kuwa tajiri zaidi kuliko ya cron lakini bado hayana shell ya kupanua tilde. Hitilafu zote mbili hutokea kabla pakiti moja kuondoka kwenye mwenyeji.
Njia ya haraka ya kuzitofautisha ni kusoma hitilafu ya kwanza badala ya ya mwisho. Binary inayokosekana hutoa hitilafu ya shell au Python, usanidi mbovu hutoa ujumbe wa matumizi wa OpenVPN, na kushindwa halisi kwa makubaliano ya mkono hutoa mihuri ya muda na anwani za wenzake. Ya tatu pekee ndiyo tatizo la handaki.
Njia kamili na orodha za hoja hushinda nyuzi za shell
Pitisha njia iliyotatuliwa kwa uwazi na ruka shell kabisa. subprocess.run(["/usr/sbin/openvpn", "--config", config, "--verb", "4"], capture_output=True, text=True, timeout=90) hukupa msimbo wa kurudi, stdout na stderr bila kuomba shell kutafsiri jina la faili. Jenga njia ya usanidi kutoka os.environ["HOME"] au pathlib.Path.home(), ili tilde isilazimike kupanuliwa kamwe. Unapohitaji kweli sintaksia ya shell, tumia shlex.split, kwa sababu kugawanya mfuatano kwa .split() huvunjika kwenye njia yoyote iliyo na nafasi. Soma pia stderr, kwa sababu OpenVPN huandika huko hitilafu zake nyingi za mwanzo.
Kanuni hiyo hiyo inatumika kwa cron: mstari wa kazi si shell ya kuingia, kwa hiyo hakuna kinachopakia profaili yako na hakuna kinachofafanua lakabu zako.
Kile crontab hurithi kwa kweli
Ingizo la crontab hupata mazingira ambayo crontab hutangaza pamoja na chaguo-msingi vichache vilivyorithiwa, kwa hiyo andika njia yote au funga wito ndani ya skripti inayofanya hivyo. Mstari kama PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin juu ya faili hufunika maeneo ya kawaida ya usakinishaji, na uelekezaji upya kwa >> cron.log 2>&1 ndicho kinachofanya hitilafu inayofuata isomeke. Profaili iliyolindwa kwa kifungu cha siri haina njia ya kuomba siri yake chini ya cron, kwa kuwa hakuna terminali ya kuuliza. Muunganisho kama huo unapaswa kuwa katika kitengo cha systemd kinachoweza kusoma faili ya vitambulisho, si katika kazi inayojifanya kuwa ya mwingiliano.
Njia zinazohusiana ni mtego wa pili. Jaribio mara nyingi hufanyika kutoka folda iliyo na profaili, na kazi ya cron huanza mahali pengine kabisa, kwa hiyo --config office.ovpn hutatuliwa kuwa faili ambayo haipo na ujumbe husomwa kama faili inayokosekana badala ya handaki inayokosekana.
Thibitisha kwa kuvua mazingira
Zalisha mazingira madogo moja kwa moja: env -i PATH=/usr/bin:/bin /usr/sbin/openvpn --config office.ovpn --verb 4. Malalamiko kuhusu njia au terminali kutoka utekelezaji huo yanamaanisha tatizo liko juu ya VPN. Ikiwa inaunganisha, washukiwa waliobaki ni akaunti inayoendesha, folda inayoanzia na kitambulisho kinachowasilisha. Yoyote ya matokeo mawili ni bora kuliko duru nyingine ya ukaguzi wa vyeti.
Kisha fanya kifuniko kijiripoti chenyewe. Toka na hali tofauti kwa kila hatua iliyofikiwa, rekodi mitiririko yote miwili na muhuri wa muda, na hitilafu inayofuata itakuambia kama ilikufa kwenye utatuzi wa njia, kwenye uthibitishaji, au baada ya handaki kuwa tayari juu.
Kitengo pia kinahitaji mpangilio sahihi: Wants=network-online.target pamoja na After=network-online.target huzuia mteja kuanza kabla anwani au njia chaguo-msingi haipo, jambo ambalo vinginevyo huonekana kama hitilafu za cheti au TLS zinazotoweka unapoanzisha upya kwa mkono.