OpenVPN qabıqda işləyir, cron altında uğursuz olur: səbəb PATH-dir
Qabıqdan qoşulan əmr cron və ya subprocess altında tunel başlamazdan əvvəl uğursuz ola bilər. Yolu, iş qovluğunu və terminalı düzəldin.
Eyni əmr qabıqdan qoşulur və cron altında ölür, ona görə də təbii nəticə tunelin və ya sertifikatın günahkar olmasıdır. Buna inanmazdan əvvəl iki işə baxın ki, onların nəyi ortaq olduğunu görəsiniz: binar fayl, konfiqurasiya və etimad məlumatları eynidir, yalnız proses mühiti dəyişib. Proqram heç tapılmayanda TLS sazlamağın heç bir miqdarı kömək etmir. Düzəliş adətən yolda, iş qovluğunda və bir ovuc mühit dəyişənində olur, VPN-də deyil.
command -v openvpn işləyən qabıqda cavabı çap edir və bu çox vaxt /usr/sbin/openvpn olur, yəni cron-un axtarış yoluna qoymadığı qovluq.
Tunel heç başlamadı, deməli problem tunel deyil
cron tərəfindən başladılan işlər minimal mühiti miras alır, adətən PATH=/usr/bin:/bin, və idarəedici terminal almır. /usr/sbin və ya /usr/local/sbin içində quraşdırılan hər şey o siyahıda sadəcə yoxdur və jurnal sətri TLS xətası əvəzinə openvpn: not found yazır. Python-un subprocess fərqli uğursuz olur: o, interpretator prosesinin mühitini miras alır, bu cron-dan zəngin ola bilər, amma tilda işarəsini genişləndirəcək qabıq hələ də yoxdur. Hər iki uğursuzluq bir paket hostdan çıxmazdan əvvəl baş verir.
Onları ayırmağın sürətli yolu sonuncu deyil, ilk xətanı oxumaqdır. Çatışmayan binar fayl qabıq və ya Python istisnası verir, pis konfiqurasiya OpenVPN istifadə mesajı verir, əsl handshake uğursuzluğu isə vaxt damğaları və peer ünvanları verir. Yalnız üçüncüsü tunel problemidir.
Mütləq yollar və arqument siyahıları qabıq sətirlərindən üstündür
Həll olunmuş yolu açıq şəkildə ötürün və qabığı tamamilə atlayın. subprocess.run(["/usr/sbin/openvpn", "--config", config, "--verb", "4"], capture_output=True, text=True, timeout=90) sizə qaytarma kodu, stdout və stderr verir, fayl adını şərh etmək üçün qabıqdan istifadə etmədən. Konfiqurasiya yolunu os.environ["HOME"] və ya pathlib.Path.home() əsasında qurun, belə ki, tilda işarəsi heç vaxt genişləndirilməsin. Həqiqətən qabıq sintaksisinə ehtiyacınız olduqda shlex.split istifadə edin, çünki sətri .split() ilə bölmək boşluq olan istənilən yolda pozulur. stderr-i də oxuyun, çünki OpenVPN erkən uğursuzluqlarının çoxunu oraya yazır.
Eyni qayda cron üçün də keçərlidir: iş sətri login qabığı deyil, ona görə heç nə profilinizi yükləmir və heç nə aliaslarınızı təyin etmir.
crontab əslində nəyi miras alır
crontab girişi crontab-ın elan etdiyi mühiti üstəgəl bir neçə miras qalmış defoltu alır, ona görə yolu açıq yazın və ya çağırışı bunu edən skriptə bükün. Faylın başındakı PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin kimi bir sətir adi quraşdırma yerlərini əhatə edir və >> cron.log 2>&1 ilə yönləndirmə növbəti uğursuzluğu oxunaqlı edən şeydir. Parol ifadəsi ilə qorunan profilin cron altında sirrini soruşmağın yolu yoxdur, çünki soruşacaq terminal yoxdur. Belə bir əlaqə etimad faylını oxuya bilən systemd vahidinə aiddir, özünü interaktiv kimi göstərən işə deyil.
Nisbi yollar ikinci tələdir. Sınaq işi çox vaxt profili saxlayan qovluqdan baş verir, cron işi isə tamamilə başqa yerdən başlayır, buna görə --config office.ovpn olmayan fayla çevrilir və mesaj itkin tunel deyil, itkin fayl kimi oxunur.
Mühiti soyutmaqla sübut edin
Minimal mühiti birbaşa təkrar yaradın: env -i PATH=/usr/bin:/bin /usr/sbin/openvpn --config office.ovpn --verb 4. Bu işdən gələn yol və ya terminal şikayəti problemin VPN-dən yuxarıda olduğunu bildirir. Əgər qoşulursa, qalan şübhəlilər onun altında işlədiyi hesab, başladığı qovluq və təqdim etdiyi etimad məlumatıdır. Hər iki nəticə sertifikat yoxlamasının növbəti raundundan yaxşıdır.
Sonra wrapper-i özünü hesabat verən edin. Çatdığı hər mərhələ üçün ayrı statusla çıxın, hər iki axını vaxt damğası ilə qeyd edin və növbəti uğursuzluq sizə onun yolun həllində, autentifikasiyada, yoxsa tunel artıq qalxmışkən öldüyünü deyəcək.
Vahid həm də düzgün sıralamaya ehtiyac duyur: Wants=network-online.target üstəgəl After=network-online.target müştərini ünvan və ya defolt marşrut yaranmazdan əvvəl başlamaqdan saxlayır; əks halda bu, əl ilə yenidən başlatmada yox olan sertifikat və ya TLS xətaları kimi üzə çıxır.