OpenVPN shell дээр ажилладаг ч cron дор бүтэлгүйтдэг: шалтгаан нь PATH
Shell-ээс холбогддог команд нь туннель эхлэхээс өмнө cron эсвэл subprocess дор бүтэлгүйтэж болно. Зам, ажлын хавтас болон терминалыг засна уу.
Мөн команд shell-ээс холбогдоод cron дор үхдэг тул туннель эсвэл гэрчилгээ буруутай гэсэн дүгнэлт хийх нь байгалийн юм. Үүнд итгэхээс өмнө хоёр ажиллагааны нийтлэг зүйлийг харна уу: бинарын файл, тохиргоо, нэвтрэх мэдээлэл ижил бөгөөд зөвхөн процессын орчин өөрчлөгдсөн. Программыг олж ч чадахгүй үед TLS-ийн ямар ч хэмжээний дибаг тус болохгүй. Засвар нь ихэвчлэн зам, ажлын хавтас болон цөөн орчны хувьсагчид байдаг, VPN-д биш.
command -v openvpn ажиллаж буй shell дээр хариултыг хэвлэдэг бөгөөд энэ нь ихэвчлэн /usr/sbin/openvpn, өөрөөр хэлбэл cron өөрийн хайлтын замд тавьдаггүй хавтас.
Туннель хэзээ ч эхлээгүй, тиймээс туннель нь асуудал биш
cron-оос эхэлсэн ажлууд хамгийн бага орчныг өвлөн авдаг, ихэвчлэн PATH=/usr/bin:/bin, мөн удирдлагын терминалгүй байдаг. /usr/sbin эсвэл /usr/local/sbin дотор суулгасан бүхэн тэр жагсаалтад огт байхгүй бөгөөд логын мөр TLS алдааны оронд openvpn: not found гэж уншина. Python-ы subprocess өөрөөр бүтэлгүйтдэг: энэ нь тайлбарлагч процессын орчныг өвлөн авдаг бөгөөд cron-оос баялаг байж болох ч тильда тэмдгийг дэлгэх shell хараахан байхгүй. Хоёр бүтэлгүйтэл нь нэг ч багц хостноос гарахаас өмнө тохиолддог.
Тэднийг ялгах хурдан арга бол сүүлчийн биш эхний алдааг унших. Алга болсон бинар нь shell эсвэл Python-ы үл хамаарах зүйл үүсгэдэг, муу тохиргоо нь OpenVPN-ийн хэрэглээний мессеж үүсгэдэг, бодит гар барилтын алдаа нь цагийн тэмдэг болон хосын хаяг үүсгэдэг. Зөвхөн гурав дахь нь туннелийн асуудал.
Абсолют зам болон аргументын жагсаалт shell-ийн мөрнөөс илүү
Шийдсэн замыг тодорхой дамжуулж, shell-ийг бүрэн алгас. subprocess.run(["/usr/sbin/openvpn", "--config", config, "--verb", "4"], capture_output=True, text=True, timeout=90) файлын нэрийг тайлбарлахыг shell-ээс хүсэхгүйгээр буцах код, stdout болон stderr-ийг өгдөг. Тохиргооны замыг os.environ["HOME"] эсвэл pathlib.Path.home()-ээс байгуулж, тильда тэмдгийг хэзээ ч дэлгэх шаардлагагүй болго. Шеллийн синтакс үнэхээр хэрэгтэй үед shlex.split ашигла, учир нь .split()-ээр мөр хуваах нь зай агуулсан аливаа зам дээр эвдэрдэг. stderr-ийг мөн унш, учир нь OpenVPN эрт үеийн алдааныхаа ихэнхийг тэнд бичдэг.
Мөн дүрэм cron-д хамаарна: ажлын мөр нь нэвтрэх shell биш тул юу ч таны профайлыг ачаалахгүй, юу ч таны далд нэрийг тодорхойлохгүй.
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 алдаа болж илэрдэг.