Nejauša OpenVPN izvēle systemd: kāpēc ExecStart neizdodas
systemd nav čaula, tāpēc sajaukta kopija ExecStart iekšienē mirst. Pārvietojiet izvēli uz ExecStartPre vai ļaujiet OpenVPN pašam izvēlēties serveri.
Četrdesmit .ovpn failu vienai valstij ierodas no pakalpojumu sniedzēja, un plāns šķiet acīmredzams: nokopēt nejaušu savā vietā un pēc tam palaist tuneli. Ja to raksta kā cauruļvadu ExecStart iekšienē, šis plāns mirst palaišanas laikā ar statusa kodu, kas neko neizskaidro. Vienības fails nav skripts, un labojums ir vai nu skaidri iesaistīt čaulu, vai pilnībā pārtraukt failu izvēli.
Simptoms: vienība, kas palaižas un tūlīt mirst
Statuss rāda, ka pakalpojums neizdevās sekundes daļā, un žurnāla rinda nosauc komandu, ko neviena čaula nekad nebūtu saņēmusi. Par tuneli nekas neparādās, jo tunelis tā arī neiesākās.
Precīzas komandrindas nolasīšana no žurnāla ir ātrākais veids, kā to apstiprināt. systemd atkārto to, ko izpildīja, un virkne rādīs cauruļvada rakstzīmes kā burtiskus argumentus, nevis kā operatorus.
Kāpēc ExecStart nevar izpildīt cauruļvadu
systemd pats sadala komandrindu, piemēro savus pēdiņu un mainīgo aizstāšanas noteikumus un pēc tam izpilda rezultātu tieši. Caurules, pāradresācija, čaulas veiktā glob paplašināšana un komandu aizstāšana vienkārši nav daļa no šīs gramatikas. Tas ir dizaina lēmums, nevis izlaidums: vienība deklaratīvi pasaka, ko palaist, un čaulas loģika pieder skriptam, ko vienība izsauc. Abi labojumi izriet no tā, un neviens no tiem neprasa piešķirt vienībai vairāk privilēģiju.
Tas arī izskaidro maldinošo izejas kodu. Pirmais arguments tiek uzskatīts par bināro failu, tāpēc nepareiza rinda neizdodas, pirms sāk darboties jebkura jūsu loģikas daļa.
Veiciet izvēli ExecStartPre
Tiešais labojums ir sagatavošanas solis, kas skaidri izsauc čaulu un patur izvēli un palaišanu tajā pašā vienībā, lai vienā radušās kļūmes dēļ otrs nepaliktu darbojamies viens.
[Service]
Type=notify
ExecStartPre=/bin/bash -c "ls /etc/openvpn/profiles/au* | shuf -n 1 | xargs -r -I{} cp -f {} /etc/openvpn/%i.conf"
ExecStart=/usr/sbin/openvpn --config /etc/openvpn/%i.conf
Trīs detaļas izšķir, vai tas izturēs saskari ar īstu mašīnu. Nosaukšana ir pirmās lamatas: systemd aizstāj %i jau vienības parsēšanas laikā, ilgi pirms bash palaišanas, tāpēc specifikatoram jāatrodas ārpus vienkāršajām pēdiņām. xargs -r neļauj cp palaist bez argumenta, kad glob neatbilst nekam. Un neizdevies sagatavošanas solis aptur vienību, un tas ir pareizais iznākums: sākt ar vakardienas konfigurāciju ir sliktāk nekā nesākt. Nejauša izvēle, kas vienmēr ņem to pašu failu, parasti nav neveiksme. Pārbaudiet, vai kopēto failu nepārraksta pakotnes atjauninājums, vai glob neatbilst tikai vienam novecojušam ierakstam.
Vai ļaujiet OpenVPN izvēlēties galapunktu
OpenVPN jau var turēt vairākus galapunktus vienā profilā un nejauši izvēlēties starp tiem, kas pilnībā izņem čaulu, kopēšanu un rakstīšanas tiesības no palaišanas ceļa.
client
remote-random
<connection>
remote au1.example.net 1194 udp
</connection>
<connection>
remote au2.example.net 1194 udp
</connection>
Šī forma patur servera izvēli pakalpojumu sniedzēja rakstītajā failā, tāpēc rotācija, kas pārdēvē failus, nesalauž vienību. Tā arī padara kandidātu sarakstu auditējamu, kā glob pār mapi nekad nav. Sajaukšana joprojām ir savā vietā, kad profili atšķiras vairāk nekā ar galapunktu: dažādi sertifikāti, dažādas maršrutēšanas direktīvas, dažāda šifrēšanas politika. Tādā gadījumā izvēle ir starp veselām konfigurācijām, un čaulas solis ir godīgais veids, kā to izteikt.
Nolasiet atpakaļ instanci un failu, ko tā izmantoja
Pirms atkļūdojat tās saturu, apstipriniet, kura vienība patiešām darbojas. Iepakotais meta pakalpojums un veidne ir infrastruktūra; vienības, kas atbilst jūsu failiem, ir instances, kas nosauktas to vārdā.
systemctl list-units 'openvpn*'
systemctl cat [email protected]
journalctl -u openvpn@au -n 30 --no-pager
Instance, kuras iespējošanu neviens neatceras, parasti ved pie pakotnes direktorijā apmaldījušās konfigurācijas faila. Izslēdziet tieši šo nosaukto instanci, nevis veidni, citādi nākamais pakotnes atjauninājums to atgriezīs. Pēc izmaiņām palaidiet vienību un nolasiet komandrindu, ko ziņo žurnāls, un pēc tam apstipriniet konfigurācijas ceļu, ko tā patiešām atvēra. Šī viena pārbaude atšķir strādājošu nejaušu izvēli no pakalpojuma, kas klusībā atkal izmanto pagājušā mēneša failu.