Η εγκατάσταση του OpenVPN αποτυγχάνει επειδή το gpg του Git κερδίζει στο PATH
Το Git for Windows φέρνει το δικό του gpg.exe και η σειρά του PATH καθορίζει ποιο θα εκτελέσει ο εγκαταστάτης του OpenVPN. Ελέγξτε με where.exe και μετά αναδιατάξτε αντί να διαγράψετε.
Μια εγκατάσταση OpenVPN που πεθαίνει κάτω από το Chocolatey με σφάλμα υπογραφής ή κλειδιού συνήθως δεν είναι πρόβλημα λήψης. Το πακέτο εκτελεί ένα βήμα επαλήθευσης που καλεί το gpg, και τα Windows επιλύουν αυτό το γυμνό όνομα μέσω του PATH. Αν το Git for Windows εγκαταστάθηκε πρώτο, το ενσωματωμένο gpg.exe του βρίσκεται μπροστά από την έκδοση GnuPG που περιμένει το OpenVPN, και το λάθος πρόγραμμα απαντά στην κλήση. Το σφάλμα που βλέπετε είναι ό,τι αποφάσισε να παραπονεθεί εκείνο το άλλο πρόγραμμα, γι’ αυτό δεν αναφέρει ποτέ την πραγματική αιτία.
Η σειρά του PATH καθορίζει ποιο gpg εκτελείται
Τα Windows δεν έχουν κεντρικό μητρώο ονομάτων εκτελέσιμων. Όταν μια διεργασία ζητά το gpg χωρίς πλήρη διαδρομή, ο φορτωτής διατρέχει τις καταχωρίσεις του PATH με σειρά και εκτελεί την πρώτη αντιστοίχιση. Το Git for Windows παρέχει μια ελάχιστη έκδοση GnuPG μέσα στον κατάλογό του usr/bin ώστε να λειτουργούν οι υπογεγραμμένες υποβολές, και ο εγκαταστάτης του συνήθως τοποθετεί αυτόν τον κατάλογο κοντά στην αρχή του PATH του χρήστη.
Το GnuPG εγκαθίσταται στον δικό του κατάλογο, συνήθως C:\Program Files (x86)\GNU\GnuPG\pub, και αυτή η καταχώριση μπορεί να είναι πιο κάτω στη λίστα ή να λείπει εντελώς από το PATH του χρήστη. Τα δύο προγράμματα μοιράζονται ένα όνομα και μεγάλο μέρος της επιφάνειας γραμμής εντολών, αλλά όχι την κατάστασή τους: η έκδοση του Git ψάχνει κλειδοθήκη αλλού, μπορεί να είναι διαφορετική έκδοση και μπορεί να μην δέχεται τις επιλογές που περνά ο εγκαταστάτης. Αυτή η αναντιστοιχία εμφανίζεται ως σφάλμα υπογραφής ή κλειδιού, το οποίο είναι μια ειλικρινής αναφορά για το τι είδε το λάθος εκτελέσιμο. Τίποτα στο μήνυμα δεν δείχνει τον φορτωτή, γιατί ο φορτωτής έκανε ακριβώς αυτό που του είπαν.
Γιατί το κέλυφος από το οποίο ξεκινάτε καθορίζει το αποτέλεσμα
Ο κανόνας κληρονομικότητας είναι το κομμάτι που αξίζει να εσωτερικεύσετε. Μια θυγατρική διεργασία παίρνει το περιβάλλον του κελύφους που την ξεκίνησε, οπότε η σειρά που μετρά είναι η σειρά τη στιγμή που ξεκινά το Chocolatey, όχι η σειρά αφού τη διορθώσετε.
Γι’ αυτό η επεξεργασία του PATH σε ένα παράθυρο ρυθμίσεων και η εκ νέου εκτέλεση της εγκατάστασης στο ίδιο τερματικό συχνά δεν αλλάζει τίποτα: το τερματικό κράτησε το παλιό περιβάλλον. Ξεκινήστε ένα νέο κέλυφος μετά από κάθε αλλαγή και επιβεβαιώστε με το where.exe gpg σε αυτό το νέο κέλυφος πριν δοκιμάσετε ξανά. Γι’ αυτό επίσης μια καταχώριση σε επίπεδο μηχανήματος μπορεί να νικήσει μια αλλαγή σε επίπεδο χρήστη, αφού ορισμένοι εγκαταστάτες προσθέτουν στην αρχή του PATH του μηχανήματος και οι καταχωρίσεις μηχανήματος αξιολογούνται πριν από τις καταχωρίσεις χρήστη. Αν και τα δύο επίπεδα περιέχουν διαδρομή GnuPG, αποφασίστε ποια συντηρείτε πραγματικά.
Διόρθωση πρώτη: αναδιατάξτε τις καταχωρίσεις
Η ακριβής διόρθωση είναι να κερδίσει ο επιθυμητός κατάλογος GnuPG. Ανοίξτε τις μεταβλητές περιβάλλοντος για τον χρήστη, επεξεργαστείτε το Path και μετακινήστε τον κατάλογο pub του GnuPG πάνω από τις καταχωρίσεις του Git. Μετά ανοίξτε ένα νέο παράθυρο PowerShell, γιατί αυτό που εκτελείται κρατά ακόμα την παλιά λίστα.
Η εναλλακτική είναι ένα προσωρινό καθαρό περιβάλλον για την εγκατάσταση: αφαιρέστε τις καταχωρίσεις του Git, ανοίξτε ένα νέο κέλυφος, εκτελέστε το choco install openvpn και μετά επαναφέρετέ τις.
Και οι δύο προσεγγίσεις λειτουργούν για τον ίδιο λόγο, και η δεύτερη είναι ασφαλής μόνο αν όντως επαναφέρετε τις καταχωρίσεις. Η αφαίρεση του usr/bin του Git από το PATH σπάει μόνιμα τις υπογεγραμμένες υποβολές, και το επόμενο εργαλείο που περιμένει ένα λειτουργικό gpg αποτυγχάνει με δικό του μήνυμα που δεν έχει καμία σχέση με το OpenVPN. Αν ακολουθήσετε την προσωρινή διαδρομή, κρατήστε την αρχική τιμή του Path στο δελτίο ώστε η επαναφορά να είναι επικόλληση και όχι ανακατασκευή. Η τακτοποίηση των καταχωρίσεων είναι η διαρκής διόρθωση, ενώ η διαγραφή τους είναι μια παράκαμψη με ημερομηνία λήξης.
Επαληθεύστε και μετά επαναφέρετέ το
Επαληθεύστε πριν και μετά στο ίδιο περιβάλλον χρήστη που θα χρησιμοποιήσει το Chocolatey. Το where.exe gpg απαριθμεί κάθε αντιστοίχιση με σειρά επίλυσης, οπότε η πρώτη γραμμή είναι αυτή που θα εκτελεστεί· το Get-Command gpg -All δίνει την ίδια απάντηση με περισσότερες λεπτομέρειες στο PowerShell. Μετά το gpg --version επιβεβαιώνει ποια έκδοση απάντησε.
Αν το where.exe εξακολουθεί να απαριθμεί πρώτο το αντίγραφο του Git, η αναδιάταξη δεν έφτασε σε εκείνη τη συνεδρία και καμία επανεγκατάσταση δεν θα βοηθήσει. Ελέγξτε και το PATH του μηχανήματος και του χρήστη με το [Environment]::GetEnvironmentVariable('Path','Machine') και την ίδια κλήση με το 'User', γιατί η αποτελεσματική λίστα συντίθεται από τα δύο. Μετά από μια επιτυχημένη εγκατάσταση, ελέγξτε ξανά με το openvpn --version και ξεκινήστε την υπηρεσία ή το GUI μία φορά, αφού ένα πακέτο μπορεί να εγκατασταθεί καθαρά και να αφήσει υπηρεσία που δεν ξεκινά.
Αν ένα σωστά διατεταγμένο PATH εξακολουθεί να αποτυγχάνει, η υπόλοιπη μεταβλητή είναι η έκδοση του πακέτου. Ένα καρφιτσωμένο πακέτο Chocolatey μπορεί να περιμένει συγκεκριμένη έκδοση GnuPG ή διαδρομή εγκατάστασης που δεν έχει το μηχάνημά σας.
Διαβάστε το δικό του αρχείο καταγραφής του πακέτου πριν αλλάξετε οτιδήποτε άλλο. Το C:\ProgramData\chocolatey\logs\chocolatey.log καταγράφει τη γραμμή εντολών που απέτυχε και τον κατάλογο από τον οποίο εκτελέστηκε, κάτι που σας λέει αν η αποτυχημένη κλήση ήταν έλεγχος υπογραφής, εξαγωγή ή σενάριο μετά την εγκατάσταση. Αυτή η διάκριση καθορίζει αν εξακολουθείτε να αποσφαλματώνετε το gpg.
Η συνήθεια που αποτρέπει την επανάληψη είναι να αντιμετωπίζετε το PATH ως κοινόχρηστη κατάσταση με τεκμηριωμένη σειρά και όχι ως τσάντα με καταλόγους. Όταν εγκαθιστάτε ένα εργαλείο που φέρνει ένα κοινό όνομα εκτελέσιμου, ελέγξτε τι επισκιάζει στο επόμενο κέλυφος που θα ανοίξετε. Μετά γράψτε τη σειρά στην οποία καταλήξατε, γιατί ο επόμενος εγκαταστάτης θα προσθέσει σε αυτήν και ο επόμενος άνθρωπος θα αναρωτιέται γιατί ένας έλεγχος υπογραφής αποτυγχάνει σε μηχάνημα όπου τίποτα δεν άλλαξε. Ένα where.exe πριν την εγκατάσταση γλιτώνει όλο τον κύκλο.