Aynı komut kabuktan bağlanıyor ve cron altında ölüyor, bu yüzden doğal sonuç tünelin ya da sertifikanın suçlu olduğudur. Buna inanmadan önce iki çalıştırmanın neyi paylaştığına bakın: ikili dosya, yapılandırma ve kimlik bilgileri aynıdır ve yalnızca süreç ortamı değişmiştir. Programın kendisi bulunamadığında hiçbir TLS hata ayıklaması yardımcı olmaz. Düzeltme genellikle bir yolda, bir çalışma dizininde ve bir avuç ortam değişkeninde bulunur, VPN'de değil.

command -v openvpn çalışan kabukta yanıtı yazdırır ve bu çoğu zaman /usr/sbin/openvpn, yani cron'un arama yoluna koymadığı dizindir.

Tünel hiç başlamadı, yani sorun tünel değil

cron tarafından başlatılan işler asgari bir ortamı, geleneksel olarak PATH=/usr/bin:/bin, devralır ve denetleyici terminali olmaz. /usr/sbin veya /usr/local/sbin içine kurulan her şey o listede yoktur ve günlük satırı TLS hatası yerine openvpn: not found yazar. Python'un subprocess farklı biçimde başarısız olur: yorumlayıcı sürecinin ortamını devralır, bu cron'unkinden daha zengin olabilir ama yine de bir tildeyi genişletecek kabuğu yoktur. Her iki hata da tek bir paket ana makineden çıkmadan önce olur.

Bunları ayırmanın hızlı yolu son hatayı değil ilk hatayı okumaktır. Eksik ikili dosya kabuk veya Python istisnası üretir, kötü yapılandırma OpenVPN kullanım iletisi üretir ve gerçek el sıkışma hatası zaman damgaları ve eş adresleri üretir. Yalnızca üçüncüsü tünel sorunudur.

Mutlak yollar ve argüman listeleri kabuk dizgelerini yener

Çözülmüş yolu açıkça geçin ve kabuğu tamamen atlayın. subprocess.run(["/usr/sbin/openvpn", "--config", config, "--verb", "4"], capture_output=True, text=True, timeout=90) size dönüş kodu, stdout ve stderr verir, bir kabuktan dosya adını yorumlamasını istemeden. Yapılandırma yolunu os.environ["HOME"] veya pathlib.Path.home() üzerinden kurun, böylece bir tilde hiç genişletilmek zorunda kalmasın. Gerçekten kabuk sözdizimine ihtiyaç duyduğunuzda shlex.split kullanın, çünkü bir dizgeyi .split() ile bölmek boşluk içeren her yolda kırılır. stderr'i de okuyun, çünkü OpenVPN erken hatalarının çoğunu oraya yazar.

Aynı kural cron için de geçerlidir: iş satırı bir oturum açma kabuğu değildir, bu yüzden hiçbir şey profilinizi yüklemez ve hiçbir şey takma adlarınızı tanımlamaz.

Bir crontab gerçekte neyi devralır

Bir crontab girdisi, crontab'ın bildirdiği ortamı artı birkaç devralınan varsayılanı alır, bu yüzden yolu tam yazın veya çağrıyı bunu yapan bir betiğe sarın. Dosyanın başındaki PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin gibi bir satır olağan kurulum konumlarını kapsar ve >> cron.log 2>&1 ile yönlendirme bir sonraki hatayı okunur kılan şeydir. Parola ifadesiyle korunan bir profilin cron altında sırrını istemenin yolu yoktur, çünkü soracak bir terminal yoktur. Böyle bir bağlantı, kimlik bilgisi dosyasını okuyabilen bir systemd birimine aittir, kendini etkileşimli gibi gösteren bir işe değil.

Göreli yollar ikinci tuzaktır. Bir test çalıştırması çoğu zaman profili barındıran klasörden yapılır ve cron işi tamamen başka bir yerde başlar, bu yüzden --config office.ovpn orada olmayan bir dosyaya çözülür ve ileti eksik tünelden çok eksik dosya olarak okunur.

Ortamı soyarak bunu kanıtlayın

Asgari ortamı doğrudan yeniden üretin: env -i PATH=/usr/bin:/bin /usr/sbin/openvpn --config office.ovpn --verb 4. O çalıştırmadan yol veya terminal şikâyeti gelirse sorun VPN'in üstündedir. Bağlanırsa geriye kalan şüpheliler, altında çalıştığı hesap, başladığı dizin ve sunduğu kimlik bilgisidir. İki sonuçtan herhangi biri bir tur daha sertifika denetiminden iyidir.

Ardından sarmalayıcıyı kendini raporlar hâle getirin. Ulaştığı her aşama için ayrı bir durumla çıkın, iki akışı da zaman damgasıyla günlüğe yazın ve bir sonraki hata size yol çözümünde, kimlik doğrulamada mı yoksa tünel zaten ayaktayken mi öldüğünü söylesin.

Bir birimin doğru sıralamaya da ihtiyacı vardır: Wants=network-online.target ile After=network-online.target istemcinin bir adres veya varsayılan yol oluşmadan başlamasını engeller, aksi hâlde bu, elle yeniden başlatmada kaybolan sertifika veya TLS hataları olarak görünür.

İlgili makaleler