Ista naredba se povezuje iz shella i umire pod cronom, pa je prirodan zaključak da su tunel ili certifikat krivi. Pogledajte šta je dvama pokretanjima zajedničko prije nego što u to povjerujete: binarna datoteka, konfiguracija i vjerodajnice su identične, a promijenilo se samo okruženje procesa. Kada se program ni ne pronađe, nikakvo TLS otklanjanje grešaka ne pomaže. Popravka obično leži u putanji, radnom direktoriju i šaci varijabli okruženja, a ne u VPN-u.

command -v openvpn u shellu koji radi ispiše odgovor, a to je vrlo često /usr/sbin/openvpn, direktorij koji cron ne stavlja na svoju putanju pretraživanja.

Tunel nikada nije krenuo, pa tunel nije problem

Poslovi koje pokreće cron nasljeđuju minimalno okruženje, uobičajeno PATH=/usr/bin:/bin, i bez kontrolnog terminala. Sve što je instalirano u /usr/sbin ili /usr/local/sbin jednostavno nedostaje na tom spisku, a red u dnevniku glasi openvpn: not found umjesto TLS greške. Pythonov subprocess pada drugačije: nasljeđuje okruženje procesa interpretera, koje može biti bogatije od cronovog, ali još uvijek nema shell koji bi raširio tildu. Oba pada se događaju prije nego ijedan paket napusti host.

Brz način da ih razlikujete jest da čitate prvu grešku umjesto posljednje. Nedostajuća binarna datoteka daje izuzetak u shellu ili Pythonu, loša konfiguracija daje OpenVPN poruku o upotrebi, a stvarni neuspjeh rukovanja daje vremenske oznake i adrese peerova. Samo je treći problem tunela.

Apsolutne putanje i liste argumenata pobjeđuju shell stringove

Proslijedite razriješenu putanju izričito i potpuno preskočite shell. subprocess.run(["/usr/sbin/openvpn", "--config", config, "--verb", "4"], capture_output=True, text=True, timeout=90) daje vam povratni kod, stdout i stderr bez traženja da shell tumači naziv datoteke. Gradite putanju konfiguracije iz os.environ["HOME"] ili pathlib.Path.home(), tako da tildu nikada ne treba raširivati. Kada vam istinski treba shell sintaksa, koristite shlex.split, jer dijeljenje stringa s .split() puca na svakoj putanji koja sadrži razmak. Čitajte i stderr, jer OpenVPN tamo zapisuje većinu svojih ranih neuspjeha.

Isto pravilo vrijedi i za cron: linija posla nije login shell, pa ništa ne učitava vaš profil i ništa ne definira vaše aliase.

Šta crontab zapravo nasljeđuje

Unos u crontabu dobija ono okruženje koje crontab deklarira plus nekoliko naslijeđenih zadanih vrijednosti, pa ispišite putanju ili umotajte poziv u skriptu koja to čini. Redak poput PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin na vrhu datoteke pokriva uobičajene lokacije instalacije, a preusmjeravanje s >> cron.log 2>&1 je ono što sljedeći neuspjeh čini čitljivim. Profil zaštićen pristupnom frazom nema načina da pod cronom zatraži svoju tajnu, jer nema terminala na kojem bi pitao. Takva veza pripada systemd jedinici koja može čitati datoteku vjerodajnica, a ne poslu koji se pretvara da je interaktivan.

Relativne putanje su druga zamka. Testno pokretanje često se događa iz mape koja drži profil, a cron posao počinje sasvim drugdje, pa se --config office.ovpn razrješava u datoteku koje nema i poruka se čita kao nedostajuća datoteka, a ne nedostajući tunel.

Dokažite to skidanjem okruženja

Reproducirajte minimalno okruženje izravno: env -i PATH=/usr/bin:/bin /usr/sbin/openvpn --config office.ovpn --verb 4. Pritužba na putanju ili terminal iz tog pokretanja znači da problem sjedi iznad VPN-a. Ako se poveže, preostali sumnjivci su račun pod kojim radi, direktorij u kojem počinje i vjerodajnica koju predstavlja. Bilo koji od dva ishoda bolji je od još jedne runde provjere certifikata.

Zatim učinite omotač samoprijavljujućim. Izađite s različitim statusom za svaku fazu koju je dosegao, zabilježite oba toka s vremenskom oznakom, a sljedeći neuspjeh će vam reći je li umro pri razrješavanju putanje, pri autentifikaciji ili nakon što je tunel već bio podignut.

Jedinici treba i ispravan redoslijed: Wants=network-online.target plus After=network-online.target sprječavaju klijenta da krene prije nego što postoji adresa ili zadana ruta, što se inače pojavljuje kao greške certifikata ili TLS-a koje nestanu pri ručnom ponovnom pokretanju.

Povezani članci