VPN zerbitzuak EXEC-en huts egiten du: alderatu unit, binarioa eta sudoers
EXEC urratsean huts egiteak systemd-k binarioa abiarazi ezin izan duela esan nahi du. Alderatu unit-en bidea, instalatutako bidea eta sudoers baimena ezer aldatu aurretik.
Atzo tunela funtzionatzen zuen, eta gaur goizean unit hilda dago journal-ean Failed at step EXEC spawning /usr/local/bin/vpnclient agertuta. Kredentzialak, ibilbideak eta kontua ez dira inoiz esaldi horretan sartzen. systemd-k ExecStart bide batera ebatzi zuen, kernel-ari exekutatzeko eskatu zion eta kernel-ak uko egin zion, gehienetan bide horretan ezer ez dagoelako edo fitxategia ez delako exekutagarria. Akatsa fitxategi eta argv arazo gisa tratatu, analizatutako komandoak kontrakoa frogatu arte.
Zergatik egiten du huts EXEC-ek autentifikazioa hasi aurretik
systemd-k ez du ExecStart shell baten bidez exekutatzen. Fork bat egiten du, lerrotik argumentu-bektore bat eraikitzen du eta execve deitzen du lehen elementuan. Deialdi horrek huts egiten badu, zerbitzua ez da inoiz VPN bezeroaren beraren koderaino iristen, beraz profilaren edizioak edo kredentzialen egiaztapenak ezin du lagundu.
Egoera-kodeak familia hau ohiko erorketetatik bereizten du. status=203/EXEC-ekin irteten den unit batek ez zuen inoiz prozesurik hasi; abiarazi eta gero status=1 -ekin irteten den unit batek huts egin zezakeen autentifikazioan, DNS-n edo bideratzean. Irakurri kodea bezeroaren loga irakurri aurretik, zeren lehen kasuan bezeroaren loga hutsik egongo baita.
Journalean dagoen bidea systemd-k erabili zuena da, ez nahitaez zuk editatu duzuna. Drop-in fitxategiek eta sorgailuaren irteerak hornitzailearen fitxategia gainidatz dezakete, eta daemon-reload zaharkitu batek lerro zaharra memorian uzten du. Horregatik lehen diagnostikoa systemd-ri galdetzea da zer uste duen komandoa, gogoratzen duzun fitxategia irekitzea baino.
Binarioaren bidea idatzita dagoen hiru leku
Banaketa-pakete batetik, hornitzailearen script batetik eta bertsio-tarball batetik instalatutako VPN bezeroa hiru prefijo ezberdinetan gerta daiteke. Unit-ek, pribilegio-arauak eta instalatzaileak prefijo horietako bana erregistratu zuten, eta akatsa hiruretako bik bat ez egitean agertzen da.
| Record | Common value | How to read it |
|---|---|---|
| Unit or drop-in | /usr/local/bin/vpnclient | systemctl cat vpnclient.service |
| Installed binary | /usr/bin/vpnclient | command -v vpnclient, then ls -l the result |
| Sudoers grant | /opt/vpnclient/bin/vpnclient | sudo grep -r vpnclient /etc/sudoers.d/ |
Desadostasun zehatz batek horrela egiten du: hornitzailearen scriptak /usr/local/bin-n instalatzen du, tarballa /opt-ren azpian deskonprimitu zen, eta unit-ek oraindik aurreko pakete bateko /usr/bin bide zaharra aipatzen du. Fitxategi horietako bakarra dago eta gutxitan da ExecStart-en dagoena.
Erabaki zein bide den kanonikoa fitxategietako edozein aldatu aurretik. Binarioa banaketa-paketearena bada, paketearen bidea da kanonikoa eta unit-ek hura jarraitu behar du. Hornitzailearen scriptarena bada, arau bera aplikatzen zaio hornitzailearen prefijoari. Binarioa prefijoen artean kopiatzeak bi kopia sortzen ditu, hurrengo eguneratzean elkarrengandik aldenduko direnak.
Komatxo arteko komando bat fitxategi-izen bihurtzen denean
Bigarren huts-egoera journal-eko lerro beraren atzean ezkutatzen da. Norbaitek hau unit-en idazten du eta bezeroa abioan zehar konektatuko dela espero du:
ExecStart=/usr/bin/"vpnclient connect office"systemd-k balioa hitzetan zatitzen du, beraz lehen hitza /usr/bin/vpnclient connect office bihurtzen da, komatxoak taldekatzeko sintaxi gisa kenduta. Ondoren kernel-ak izenean zuriuneak dituen fitxategi bat bilatzen du, eta halakorik ez dago. Errorea falta den binario baten berdina da, binarioa instalatuta egon arren.
Onartutako forma exekutagarri erreala da, ondoren argumentu bereiziak, adibidez ExecStart=/usr/bin/vpnclient connect office. Lan-fluxuak benetan hodi bat edo kate bat behar badu, jarri script batean eta deitu scriptari, zeren ExecStart-ek ez baitu &&, ez hodirik, ez glob hedapenik.
Konpondu unit, ez fitxategi-sistema
Konponketa tentagarria espero den bidetik benetako binariorako esteka sinbolikoa da. Funtzionatzen du paketea eguneratu eta estekak ezabatutako fitxategi batera seinalatzen duen arte, edo SELinux etiketa batek helburuarekin bat egiteari uzten dion arte. Hobe da unit drop-in baten bidez editatzea, hornitzailearen fitxategia ukitu gabe gera dadin eta eguneratzeak aurreikusteko modukoak izan daitezen.
Pribilegio-arauak bide berari eta azpikomando berari erantzun behar die. /usr/local/bin/vpnclient-rako sudoers sarrera batek ez du /usr/bin/vpnclient baimetzen, eta edozein argumentu onartzen duen sarrera batek edozein prozesu lokalek tunela birkonfiguratu edo gelditzea ahalbidetzen du. Eman unit-ek behar dituen bi aditzak eta eduki desmuntatzea hortik kanpo, zerbitzua gelditzeak interfazea ixten badu jada.
Hemen ordaintzen du alderaketak: unit-ek, pakete-datu-baseak eta sudoers-ek bide bakarra aipatu beharko lukete. Hori egiten dutenean, EXEC errorea desagertu egiten da berrabiarazi gabe eta binarioaren kopia hirugarren leku batean jarri gabe.
Froga ezazu analizatutako komandoa berrabiarazi aurretik
sudo systemctl daemon-reload
sudo systemctl cat vpnclient.service
systemctl show -p ExecStart vpnclient.service
systemd-analyze verify /etc/systemd/system/vpnclient.service
sudo systemctl restart vpnclient.service
systemctl status vpnclient.service --no-pagersystemctl show irteera erabakigarria da, systemd-k benetan analizatutako argv-a inprimatzen duelako, edozein drop-in barne. systemd-analyze verify-k falta den edo exekutagarria ez den bide bat harrapatzen du berrabiarazi aurretik, eta berrabiarazi ondorengo status komandoak prozesua orain badagoen esaten du.
Unit abiarazi eta gero huts egiten badu, EXEC familia utzi duzu eta bezeroaren beraren errore-kudeaketan sartu zara. Begiratu journal-ean bezeroaren mezua, ez beste execve hutsegite bat. Eduki unit-en diff-a eta sudoers-en diff-a elkarrekin aldaketaren erregistroan, hurrengo eguneratzeak bide zatitua isilpean berriro sar ez dezan.