അതേ കമാൻഡ് ഷെല്ലിൽ നിന്ന് കണക്ട് ചെയ്യുന്നു, cron-ന് കീഴിൽ മരിക്കുന്നു, അതിനാൽ ടണലോ സർട്ടിഫിക്കറ്റോ കുറ്റക്കാരനാണെന്ന് കരുതുന്നത് സ്വാഭാവികം. അത് വിശ്വസിക്കുന്നതിന് മുമ്പ് രണ്ട് റണ്ണുകൾക്ക് എന്താണ് പൊതുവായുള്ളതെന്ന് നോക്കുക: ബൈനറി, കോൺഫിഗറേഷൻ, ക്രെഡൻഷ്യലുകൾ എന്നിവ ഒരുപോലെയാണ്, പ്രോസസ്സിന്റെ പരിസ്ഥിതി മാത്രം മാറി. പ്രോഗ്രാം കണ്ടെത്താൻ കഴിയാത്തപ്പോൾ, എത്ര TLS ഡീബഗ്ഗിംഗും സഹായിക്കില്ല. പരിഹാരം സാധാരണയായി ഒരു പാത്തിലും ഒരു വർക്കിംഗ് ഡയറക്ടറിയിലും കുറച്ച് എൻവയോൺമെന്റ് വേരിയബിളുകളിലുമാണ്, VPN-ൽ അല്ല.

പ്രവർത്തിക്കുന്ന ഷെല്ലിൽ command -v openvpn ഉത്തരം അച്ചടിക്കുന്നു, അത് പലപ്പോഴും /usr/sbin/openvpn ആണ്, അതായത് cron തന്റെ തിരയൽ പാത്തിൽ ഇടാത്ത ഡയറക്ടറി.

ടണൽ ഒരിക്കലും തുടങ്ങിയില്ല, അതിനാൽ ടണൽ പ്രശ്നമല്ല

cron ആരംഭിക്കുന്ന ജോലികൾ കുറഞ്ഞ പരിസ്ഥിതി പാരമ്പര്യമായി സ്വീകരിക്കുന്നു, സാധാരണയായി PATH=/usr/bin:/bin, നിയന്ത്രണ ടെർമിനലും ലഭിക്കുന്നില്ല. /usr/sbin അല്ലെങ്കിൽ /usr/local/sbin-ൽ ഇൻസ്റ്റാൾ ചെയ്തതെല്ലാം ആ പട്ടികയിൽ ഇല്ല, ലോഗ് വരി TLS പിശകിന് പകരം openvpn: not found എന്ന് വായിക്കുന്നു. Python-ന്റെ subprocess മറ്റൊരു രീതിയിൽ പരാജയപ്പെടുന്നു: അത് ഇന്റർപ്രെട്ടർ പ്രോസസ്സിന്റെ പരിസ്ഥിതി പാരമ്പര്യമായി സ്വീകരിക്കുന്നു, അത് cron-നേക്കാൾ സമൃദ്ധമായിരിക്കാം, പക്ഷേ ടിൽഡ വികസിപ്പിക്കാൻ ഇപ്പോഴും ഷെൽ ഇല്ല. രണ്ട് പരാജയങ്ങളും ഒരു പാക്കറ്റ് പോലും ഹോസ്റ്റ് വിടുന്നതിന് മുമ്പ് സംഭവിക്കുന്നു.

അവയെ വേർതിരിക്കാനുള്ള വേഗമാർഗം അവസാന പിശകിന് പകരം ആദ്യ പിശക് വായിക്കുകയാണ്. ഇല്ലാത്ത ബൈനറി ഷെൽ അല്ലെങ്കിൽ Python എക്സെപ്ഷൻ നൽകുന്നു, മോശം കോൺഫിഗറേഷൻ OpenVPN ഉപയോഗ സന്ദേശം നൽകുന്നു, യഥാർത്ഥ ഹാൻഡ്ഷേക്ക് പരാജയം സമയ മുദ്രകളും പിയർ വിലാസങ്ങളും നൽകുന്നു. മൂന്നാമത്തേത് മാത്രമാണ് ടണൽ പ്രശ്നം.

കേവല പാത്തുകളും ആർഗ്യുമെന്റ് പട്ടികകളും ഷെൽ സ്ട്രിംഗുകളെ തോൽപ്പിക്കുന്നു

പരിഹരിച്ച പാത്ത് വ്യക്തമായി നൽകി ഷെൽ പൂർണ്ണമായി ഒഴിവാക്കുക. subprocess.run(["/usr/sbin/openvpn", "--config", config, "--verb", "4"], capture_output=True, text=True, timeout=90) ഫയൽനാമം വ്യാഖ്യാനിക്കാൻ ഷെൽ-നോട് ആവശ്യപ്പെടാതെ റിട്ടേൺ കോഡും stdout-ഉം stderr-ഉം നൽകുന്നു. കോൺഫിഗറേഷന്റെ പാത്ത് os.environ["HOME"] അല്ലെങ്കിൽ pathlib.Path.home()-ൽ നിന്ന് നിർമ്മിക്കുക, ടിൽഡ വികസിപ്പിക്കേണ്ട ആവശ്യം ഒഴിവാക്കാൻ. ശരിക്കും ഷെൽ സിന്റാക്സ് വേണ്ടിവരുമ്പോൾ shlex.split ഉപയോഗിക്കുക, കാരണം .split() ഉപയോഗിച്ച് സ്ട്രിംഗ് വിഭജിക്കുന്നത് സ്പേസ് ഉള്ള ഏത് പാത്തിലും പൊട്ടും. stderr-ഉം വായിക്കുക, കാരണം OpenVPN അതിന്റെ മിക്ക ആദ്യകാല പരാജയങ്ങളും അവിടെയാണ് എഴുതുന്നത്.

അതേ നിയമം cron-നും ബാധകമാണ്: ജോലിയുടെ വരി ലോഗിൻ ഷെൽ അല്ല, അതിനാൽ ഒന്നും നിങ്ങളുടെ പ്രൊഫൈൽ ലോഡ് ചെയ്യുന്നില്ല, ഒന്നും നിങ്ങളുടെ അലിയാസുകൾ നിർവചിക്കുന്നുമില്ല.

crontab യഥാർത്ഥത്തിൽ എന്താണ് പാരമ്പര്യമായി സ്വീകരിക്കുന്നത്

crontab എൻട്രിക്ക് crontab പ്രഖ്യാപിക്കുന്ന പരിസ്ഥിതിയും കുറച്ച് പാരമ്പര്യ സ്ഥിരസ്ഥിതികളും ലഭിക്കുന്നു, അതിനാൽ പാത്ത് പൂർണ്ണമായി എഴുതുക അല്ലെങ്കിൽ അത് ചെയ്യുന്ന ഒരു സ്ക്രിപ്റ്റിൽ കോള് പൊതിയുക. ഫയലിന്റെ മുകളിൽ PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin പോലെയുള്ള ഒരു വരി സാധാരണ ഇൻസ്റ്റാൾ സ്ഥലങ്ങൾ ഉൾക്കൊള്ളുന്നു, >> cron.log 2>&1 ഉപയോഗിച്ചുള്ള റീഡയറക്ഷൻ ആണ് അടുത്ത പരാജയത്തെ വായിക്കാവുന്നതാക്കുന്നത്. പാസ്ഫ്രേസ് സംരക്ഷിത പ്രൊഫൈലിന് cron-ന് കീഴിൽ തന്റെ രഹസ്യം ചോദിക്കാൻ വഴിയില്ല, കാരണം ചോദിക്കാൻ ടെർമിനൽ ഇല്ല. അത്തരം കണക്ഷൻ ക്രെഡൻഷ്യൽ ഫയൽ വായിക്കാൻ കഴിയുന്ന systemd യൂണിറ്റിലാണ് വേണ്ടത്, സ്വയം ഇന്ററാക്ടീവ് എന്ന് നടിക്കുന്ന ജോലിയിലല്ല.

ആപേക്ഷിക പാത്തുകളാണ് രണ്ടാമത്തെ കെണി. പരീക്ഷണ റൺ പലപ്പോഴും പ്രൊഫൈൽ ഉള്ള ഫോൾഡറിൽ നിന്നാണ്, cron ജോലി തീർത്തും വേറെയൊരിടത്ത് തുടങ്ങുന്നു, അതിനാൽ --config office.ovpn അവിടെ ഇല്ലാത്ത ഫയലിലേക്ക് പരിഹരിക്കപ്പെടുന്നു, സന്ദേശം കാണാത്ത ടണലിന് പകരം കാണാത്ത ഫയൽ എന്ന് വായിക്കപ്പെടുന്നു.

പരിസ്ഥിതി ഊരിമാറ്റി അത് തെളിയിക്കുക

കുറഞ്ഞ പരിസ്ഥിതി നേരിട്ട് പുനർനിർമ്മിക്കുക: env -i PATH=/usr/bin:/bin /usr/sbin/openvpn --config office.ovpn --verb 4. ആ റണ്ണിൽ നിന്ന് പാത്തിനെക്കുറിച്ചോ ടെർമിനലിനെക്കുറിച്ചോ ഒരു പരാതി വന്നാൽ പ്രശ്നം VPN-ന് മുകളിലാണ്. അത് കണക്ട് ചെയ്യുന്നുവെങ്കിൽ, ബാക്കിയുള്ള സംശയിക്കുന്നവർ അത് പ്രവർത്തിക്കുന്ന അക്കൗണ്ടും തുടങ്ങുന്ന ഡയറക്ടറിയും അത് അവതരിപ്പിക്കുന്ന ക്രെഡൻഷ്യലും ആണ്. രണ്ട് ഫലങ്ങളിൽ ഏതും സർട്ടിഫിക്കറ്റ് പരിശോധനയുടെ മറ്റൊരു റൗണ്ടിനേക്കാൾ നല്ലതാണ്.

തുടർന്ന് റാപ്പർ സ്വയം റിപ്പോർട്ട് ചെയ്യുന്നതാക്കുക. എത്തിയ ഓരോ ഘട്ടത്തിനും വേറിട്ട സ്റ്റാറ്റസുമായി പുറത്തുകടക്കുക, രണ്ട് സ്ട്രീമുകളും സമയ മുദ്രയോടെ ലോഗ് ചെയ്യുക, അടുത്ത പരാജയം അത് പാത്ത് പരിഹാരത്തിലോ ഓതന്റിക്കേഷനിലോ ടണൽ ഇതിനകം മുകളിലായിരുന്ന ശേഷമോ മരിച്ചുവെന്ന് പറയും.

യൂണിറ്റിന് ശരിയായ ക്രമവും വേണം: Wants=network-online.target ഒപ്പം After=network-online.target വിലാസമോ ഡിഫോൾട്ട് റൂട്ടോ ഉണ്ടാകുന്നതിന് മുമ്പ് ക്ലയന്റ് തുടങ്ങുന്നത് തടയുന്നു, അല്ലെങ്കിൽ അത് സർട്ടിഫിക്കറ്റ് അല്ലെങ്കിൽ TLS പിശകുകളായി പ്രത്യക്ഷപ്പെടും, കൈകൊണ്ട് റീസ്റ്റാർട്ട് ചെയ്യുമ്പോൾ അവ മായും.

അനുബന്ധ ലേഖനങ്ങൾ