Ошол эле буйрук 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 колдонуу билдирүүсүн жаратат, ал эми чыныгы handshake катасы убакыт белгилерин жана өнөктөш дарегин жаратат. Үчүнчүсү гана туннель маселеси.

Абсолюттук жолдор жана аргумент тизмелери shell саптарынан озуп кетет

Чечилген жолду ачык бериңиз жана shell'ди таптакыр айланып өтүңүз. subprocess.run(["/usr/sbin/openvpn", "--config", config, "--verb", "4"], capture_output=True, text=True, timeout=90) кайтаруу кодун, stdout жана stderr берет, shell'ден файл атын түшүндүрүүнү сурабастан. Конфигурация жолун os.environ["HOME"] же pathlib.Path.home() негизинде куруңуз, ошондо тильданы эч качан ачууга туура келбейт. Чынында shell синтаксиси керек болсо, 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 каталары катары көрүнөт.

Тектеш макалалар