> Αυτό το μεταφρασμένο κείμενο βρίσκεται υπό γλωσσική αναθεώρηση. Αν κάτι είναι ασαφές, συμβουλευτείτε το [αγγλικό πρωτότυπο](https://www.sm.ch-j.eu/docs/i18n/en/remote-editor-latency.md). # Απομακρυσμένη αποθήκευση και παρακολούθηση καθυστέρησης ## Αιτία ρίζας Ο προηγούμενος επεξεργαστής ανέβασε το αρχείο εργασίας του στον κατάλογο γονέων του στόχου, ο οποίος συχνά δεν μπορεί να γραφτεί από τον λογαριασμό SSH στο `/etc` ή `/var`. Η SFTP μετονομασία δεν παρείχε καμία εγκεκριμένη διαδρομή sudo, αρχικό έλεγχο σύγκρουσης, επαλήθευση μεταδεδομένων ασφαλείας ή αξιόπιστη αντικατάστασή σημασιολογίας. Ο χειριστής λάθους του διέγραψε το προσωρινό αντίγραφο, αφαιρώντας το υλικό ανάκτησης ακόμη και όταν η ολοκλήρωση ήταν αβέβαιη. Κατάσταση συνεδρίας εκτέθηκε προηγουμένως μόνο η κατάσταση σύνδεσης. Δεν υπήρξε μέτρηση της απόκρισης SSH που να τροφοδοτούσε τον τελικό δείκτη. ## Αποθήκευση πρωτοκόλλου 1. Ένας σταθερός βοηθός SSH ανοίγει ένα κανονικό, ενιαίο αρχείο σύνδεσης χρησιμοποιώντας περιγραφέα-σχετικό λειτουργίες και `O_NOFOLLOW` για κάθε συνιστώσα διαδρομής. Συλλαμβάνει το περιεχόμενο, SHA-256 hash, συσκευή/εσωτερικό, UID, GID, πλήρη δικαιώματα bits, νανοδευτερόλεπτο τροποποίηση/αλλαγή χρόνους και όλα τα ευανάγνωστα επεκτεινόμενα χαρακτηριστικά. Ο πυρήνας ελέγχει το hash και αποκωδικοποιεί αυστηρά UTF-8, διατηρώντας ένα BOM. Κάθε έγγραφο παίρνει μια αδιαφανή `editId`, περικλείεται στο plugin του, την τελική συνεδρία και την ταυτότητα του διακομιστή. 2. Μια μη προνομιούχα διαδικασία προετοιμασίας επιλύει το επικυρωμένο λογαριασμό σπίτι μέσω `pwd.getpwuid(os.getuid())`, δημιουργεί `$HOME/ch-j-sm/` με τη λειτουργία `0700` και δημιουργεί ένα ιδιωτικό, αποκλειστικό ημερολόγιο αποκατάστασης. Ένας μη ασφαλής χώρος εργασίας στο σπίτι, ο χώρος εργασίας symlink, ή χώρος εργασίας που ανήκει σε άλλο λογαριασμό απορρίπτεται. 3. Ο πυρήνας ανεβάζει ένα κρυφό, τυχαίο 128- Μπιτ. `.tmp` εργασία αρχείου μέσω SFTP με αποκλειστική δημιουργία (`wx`), λειτουργία `0600` και ένα εξήντα δευτερόλεπτα κανάλι / timeout αποστολής. Το περιοδικό περιέχει τον στόχο, την αρχική βάση και το αναμενόμενο hash εργασίας· δεν περιέχει διαπιστευτήρια. 4. **one SSH exec εκτελεί ολόκληρη την οριστικοποίηση**, προαιρετικά μέσω του Υφιστάμενος εκτελεστής sudo. Ο βοηθός ανοίγει με ασφάλεια και σπρώχνει το ιδιωτικό αντίγραφο εργασίας και το ξεπλένει. Κλειδώνει την αρχική inode, ελέγχει τη γραμμή βάσης του, δημιουργεί ένα αποκλειστικό αρχείο προορισμού δίπλα στο στόχο, γράφει όλο το περιεχόμενο, εφαρμόζει και επαληθεύει τα μεταδεδομένα, ελέγχει το πρωτότυπο ξανά, και ξεπλένει την αντικατάσταση. 5. Μια ίδια σκηνοθεσία `os.replace` αντικαθιστά ατομικά τον στόχο. Ο γονιός Ο κατάλογος είναι ξεπλυμένος και η τελική διαδρομή, hash, inode και τα μεταδεδομένα ελέγχονται. Η αρχική διαδρομή παραμένει διαθέσιμη μέχρι την αντικατάσταση. Το αρχείο εργασίας δεν μετακινείται ποτέ σε όλα τα συστήματα αρχείων και δεν αφαιρείται ποτέ με την οριστικοποίηση. 6. Αφού ο πυρήνας λάβει μια επιβεβαιωμένη επιτυχία, ένα ξεχωριστό καθάρισμα επανελέγχει τον τελικό περιεχόμενο και μεταδεδομένα ασφαλείας πριν την αφαίρεση του αρχείου εργασίας και του περιοδικού. Η αποτυχία καθαρισμού εξακολουθεί να αναφέρει μια επιβεβαιωμένη αποθήκευση με `recoveryAvailable: true`. Ένα αποτυχημένο upload, αποτυχημένο sudo, σύγκρουση, σφάλμα μεταδεδομένα ή αποτυχία αντικατάστασης διατηρεί το αρχικό και οποιοδήποτε standed υλικό. Οι ελλιπείς αποστολές προσδιορίζονται ως τέτοιες και δεν μπορούν να ανακτηθούν ως πλήρες έγγραφο επεξεργασίας. Lost SSH επικοινωνία, λείπει κατάσταση εξόδου, timeouts και απροσδόκητα αποτελέσματα οριστικοποίησης αναφέρονται ως **unnown**, ποτέ τόσο αποθηκευμένο. Ο πυρήνας μπλοκάρει μια άλλη αποθήκευση σε ένα αβέβαιο έγγραφο· δεν υπάρχει αυτόματη επανάληψη αντικατάστασης. ## Μεταδεδομένα, προνόμια και όρια ασφαλείας Ο βοηθός διατηρεί και ελέγχει UID, GID και όλα τα κομμάτια άδειας POSIX, συμπεριλαμβανομένων εκτελέσιμο, setuid, settgid και κολλώδη κομμάτια. Αναπαράγει Linux εκτεταμένες ιδιότητες byte για byte, συμπεριλαμβανομένων POSIX ACLs, δυνατότητες και ετικέτες Selinux. Ιδιοκτησία και περιεχόμενο αρχείων καθορίζονται πριν από τα χαρακτηριστικά ασφαλείας, επειδή γράφει / chown μπορεί να καθαρίσει τις δυνατότητες ή ειδικές άδειες bits. Τα χαρακτηριστικά κληρονομημένου προορισμού που λείπουν στο πρωτότυπο αφαιρούνται. Ο χρόνος τροποποίησης αντανακλά τη νέα γραφή και δεν αντιγράφεται από το πρωτότυπο. Ένα μη ευανάγνωστο ή μη εκπροσωπούμενο χαρακτηριστικό ματαιώνει την λειτουργία· τα μεταδεδομένα δεν πέφτουν σιωπηλά. Οι υπογραφές IMA/EVM απορρίπτονται ρητά, διότι η αντιγραφή των υπογραφών ακεραιότητας που συνδέονται με το περιεχόμενο/εσωτερικές συνδέσεις θα τις ακυρώσει. Συμπλέκτες στην διαδρομή στόχου ή σπιτιού, σκληρά συνδεδεμένα αρχεία και μη κανονικά αρχεία απορρίπτονται. Δεν χρησιμοποιείται επιστροφή εντός της θέσης ή ασθενέστερη SFTP αντικατάσταση. Συνήθης writable αποταμιεύει τρέχει ως SSH λογαριασμό. Προστατευόμενες αποταμιεύσεις απαιτούν ρητή `{ sudo: true }`; ένας κωδικός πρόσβασης sudo είναι προαιρετικός για το sudo χωρίς κωδικό πρόσβασης. Οι κωδικοί πρόσβασης επικυρώνονται και διαβιβάζονται μόνο στο stdin καναλιού, ποτέ μέσα στην εντολή, το ημερολόγιο, το αρχείο εργασίας, logger ή απομακρυσμένο σφάλμα. Οι συνεδρίες Root SSH χρησιμοποιούν τον υφιστάμενο άμεσο εκτελεστή ρίζας. Η αποτυχημένη εξουσιοδότηση αφήνει το πρωτότυπο και το αντίγραφο εργασίας ανέπαφο. Όλες οι αποταμιεύσεις που εκτελούνται ως ρίζα (απευθείας ρίζα SSH ή sudo) απορρίπτουν επίσης τους καταλόγους-στόχους/τους αποστόλους που ανήκουν ή είναι γραμμένα από άλλους λογαριασμούς, ή φέρουν πρόσβαση ACL, αντί να εμπιστεύονται ένα προνομιακό όνομα διαδρομής που ελέγχεται από άλλο λογαριασμό. Ο σταθερός βοηθός τρέχει με `python3 -I -B`: αγνοεί τα μονοπάτια του χρήστη Python, τον κατάλογο εργασίας και τα πακέτα ιστοσελίδας χρηστών, και δεν γράφει bytecode. Τα μονοπάτια και τα επιχειρήματα JSON είναι shell-quoted στο πυρήνα. Τα πρόσθετα δεν λαμβάνουν ποτέ αυθαίρετες λαβές SSH exec ή SFTP. Η υπάρχουσα αμμοθήκη, CSP, οι άδειες εμφάνισης, η επαλήθευση κλειδιού υπολογιστή και η ενημέρωση επαλήθευσης παραμένουν σε χρήση. ## Πρόσθετο API και υπόλοιπη ενσωμάτωση Μονακό **Το ξεχωριστά κατανεμημένο Μονακό/Μάνατζερ Αρχείων UI απουσιάζει από αυτό το ταμείο. Η ενσωμάτωση του UI, η άμεση sudo, βρώμικο-μπουφέρ χειρισμό και μεταφράσεις δεν θα μπορούσε να εφαρμοστεί ή να δοκιμαστεί εδώ.** Η συσκευασμένη πηγή plugin είναι το πρόσθετο Hash & Checksum. Δεν εφευρέθηκε αντικαταστάτης πηγή File Manager. Οι υπάρχουσες μέθοδοι παραμένουν διαθέσιμες. Οι μέθοδοι/επιλογές πρόσθετης ύλης εκτίθενται από το προγευματισμένο με άμμο και το χρόνο λειτουργίας που ελέγχεται με την άδεια: ```js const opened = await chjPlugin.files.readText(sessionId, path); // For a protected read, explicitly pass { sudo: true, sudoPassword }. const result = await chjPlugin.files.saveText(sessionId, path, editor.getValue(), { editId: opened.editId, sudo: true, // Include only after the user authorizes elevation. sudoPassword // Omit for passwordless sudo; never persist this value. }); if (result.ok && result.value.status === "saved") { // Mark this exact submitted editor version as saved. Later edits stay dirty. } else { // Keep the Monaco model dirty. Translate result.error.code/status. // result.error.recoveryId/recoveryPath identify retained working material. } await chjPlugin.files.closeText(opened.editId); const recovery = await chjPlugin.files.listRecovery(sessionId); const copy = await chjPlugin.files.readRecovery(sessionId, recoveryId); // Review copy.status and copy.text; open a fresh document before another save. await chjPlugin.files.cleanupRecovery(sessionId, recoveryId); // Cleanup rejects anything whose target is not currently confirmed. ``` Οι μέθοδοι αποκατάστασης δέχονται ένα προαιρετικό τελικό επιχείρημα `{ sudo: true, sudoPassword }` κατά την επιθεώρηση ενός στόχου απαιτεί ανύψωση. Διατηρούν το χώρο εργασίας του χρήστη ακόμη και όταν εκτελείται μέσω sudo. Περιοδικά επιβιώνουν εφαρμογή επανεκκίνηση και SSH επανασύνδεση; ανάκτηση ποτέ δεν επαναλαμβάνει αυτόματα οριστικοποίηση. Ανασκοπήστε ένα ανακτημένο ρυθμιστικό διάλυμα έναντι ενός πρόσφατα ανοιγμένου στόχου πριν από τη ρητή αποθήκευση του. `files.read` φύλακες διαβάζει, επιθεώρηση και απελευθέρωση λαβής. `files.write` φρουροί αποθηκεύει και καθαρισμό αποκατάστασης. `writeText` εξακολουθεί να απορρίπτει την αποτυχία για τα υπάρχοντα plugins; `saveText` επιστρέφει ένα δομημένο φάκελο `{ ok, value/error }` επειδή Electron ρίχνει προσαρμοσμένες ιδιότητες σε απορριπτόμενα αντικείμενα λάθους. Ένα κληροδοτημένο τρίποδο `writeText` μπορεί να χρησιμοποιήσει τη βάση ενός ενιαίου ανοικτού εγγράφου. Πολλαπλά ζωντανά έγγραφα για την ίδια διαδρομή απαιτούν `editId`; διφορούμενες κληροδοτημένες κλήσεις αποτυγχάνουν με ασφάλεια αντί να επιλέξουν τη γραμμή βάσης ενός άλλου εγγράφου. Τα πρόσθετα πρέπει να απελευθερώνουν τις αχρησιμοποίητες λαβές. Το εξωτερικό UI πρέπει να εμφανίζει την αποθήκευση αμέσως, κρατάτε τις αποταμιεύσεις βρώμικες στην αποτυχία, προσφέρετε sudo μόνο μετά από την άδεια/αποτυχία ταυτοποίησης, δείχνουν συγκρούσεις χωρίς υπεργραφή, και προσφέρουν ανάκτηση μετά την απώλεια σύνδεσης ή ένα άγνωστο αποτέλεσμα. Πρέπει να μεταφράσει αυτά τα κράτη στα τσεχικά, γερμανικά και αγγλικά. Προτεινόμενο αντίγραφο κατάστασης: | State | Czech | German | English | | --- | --- | --- | --- | | Saving | Ukládání… | Wird gespeichert… | Saving… | | Confirmed | Uloženo | Gespeichert | Saved | | Failure | Uložení selhalo | Speichern fehlgeschlagen | Save failed | | Sudo required | Vyžadováno oprávnění sudo | sudo-Autorisierung erforderlich | Sudo authorization required | | Conflict | Původní soubor byl změněn | Originaldatei wurde geändert | Original file changed | | Disconnected | Spojení bylo přerušeno | Verbindung unterbrochen | Connection lost | | Unknown | Výsledek uložení není znám | Speicherergebnis unbekannt | Save result unknown | | Recovery | Obnova je dostupná | Wiederherstellung verfügbar | Recovery available | ## Ορισμός της ευδαιμονίας και κύκλος ζωής **PingName** είναι η καθυστέρηση που έχει αναφερθεί από απάντηση echo της πραγματικής πελατο-πλευρίας της ΜΠΕΠ στην υποβαθμισμένη IP που χρησιμοποιήθηκε από SSH. Ο πυρήνας επικαλείται την πλατφόρμα ping εκτελέσιμη ασύγχρονα με μια σταθερή σειρά επιχειρημάτων, χωρίς απαίτηση εκκίνησης κελύφους ή διαχειριστή. Τα επιχειρήματα Linux, macOS (συμπεριλαμβανομένων των `ping6`) και Windows επιλέγονται ξεχωριστά. Η μπλοκαρισμένη ΜΠΕΡ, ένα μη εκτελέσιμο, ένα χρονικό διάστημα, μια άκυρη έξοδο ή μια απάντηση Windows μόνο για το ανώτερο όριο, όπως η `<1ms`, δεν παράγει καμία τιμή, όχι έναν εφεύρεση αριθμό. **SSH RTT** είναι η μονοτονική `performance.now()` διάρκεια μιας σταθερής `true` exec αίτημα πάνω από την υπάρχουσα επικυρωμένη SSH πελάτη. Περιλαμβάνει εγκατάσταση καναλιών, επεξεργασία διακομιστή και παράδοση απόκρισης· δεν είναι καθαρό δίκτυο RTT ή SSH διάρκεια σύνδεσης. Το μεταφρασμένο εργαλείο δείκτη εξηγεί αυτή τη διάκριση. Η παρακολούθηση ξεκινά μόλις συνδεθεί το τερματικό. Οι ανιχνευτές τρέχουν ταυτόχρονα και ασύγχρονα, με πέντε δευτερόλεπτα χρόνο υποβολής αίτησης/επεξεργασίας. Το επόμενο δείγμα είναι προγραμματισμένο δώδεκα δευτερόλεπτα μετά την ολοκλήρωση του προηγούμενου δείγματος, εμποδίζοντας την επικάλυψη. Αποσυνδέστε ματαιώσεις ICMP, καθαρίζει χρονοδιακόπτες, ακυρώνει εκκρεμείς εργασίες SSH και καθαρίζει τις τιμές. Οι έλεγχοι ταυτότητας καταγραφής εμποδίζουν προηγούμενη σύνδεση από δημοσίευση μετά την επανασύνδεσή τους. Η αποτυχία της ICMP ποτέ δεν αλλάζει την κατάσταση σύνδεσης SSH. Η ευδαιμονία ταξιδεύει μέσα στην υπάρχουσα `state` event / `ssh:state` Ωφέλιμο φορτίο IPC: ```js latency: { pingMs: 24.1, sshRttMs: 31.25, measuredAt: "…" } ``` Μη διαθέσιμοι αριθμοί είναι `null`. Ο συμπαγής τελικός δείκτης χρησιμοποιεί χιλιοστά του δευτερολέπτου, τοπικό μη διαθέσιμο κείμενο και ετικέτες Czech/German/English. Κρύβεται στην αποσύνδεση. Δεν χρειαζόταν πρόσθετη ικανότητα εκτέλεσης του ανιχνευτή ή αίτημα της IPC. ## Επικύρωση και επιχειρησιακά όρια - Εκτέλεση από `app/`: `npm ci`, στη συνέχεια `npm test`. - Τελικό τοπικό αποτέλεσμα: **179 δοκιμές; 163 πέρασε, 0 απέτυχε, 16 skiped**. Όλα τα skips είναι οι υποθέσεις συστήματος αρχείων Linux σε αυτό το macOS οικοδεσπότη. `npm ci`, Python σύνταξη και `git diff --check` ολοκληρώθηκε επιτυχώς. - Το κάλυμμα δοκιμών Core εξοικονομεί/ανακτά, το πρωτόκολλο sudo και τον κωδικό πρόσβασης redaction, πραγματικό κέλυφος POSIX παραθέτοντας εχθρικά μονοπάτια, συγκρούσεις, αναρτήσεις, αποτυχημένος καθαρισμός, αβέβαια αποτελέσματα, ταυτόχρονα έγγραφα, άδειες IPC και κύκλο ζωής καθυστέρησης. - Linux δοκιμές συστήματος αρχείων ασκεί το αποστελλόμενο σημείο εισόδου Python, χρησιμοποιώντας ένα ιδιωτικό Αναζήτηση λογαριασμού δοκιμής-σπίτι: ιδιοκτησία/mode/xattrs, POSIX ACLs, symlinks/hardlinks, FIFOs, αποτυχίες αποστολής και μεταδεδομένα, αποτυχία αντικατάστασης, αγώνες στόχων, άγνωστα αποτελέσματα μετά την αντικατάσταση και ανάκτηση. Το cross-filesystem station χρησιμοποιεί `/dev/shm` και άλλο σύστημα αρχείων όταν είναι διαθέσιμο. Αυτές οι δοκιμές παραλείπουν σε μη-Linux οικοδεσπότες· λείπει ACL/διαχωριζόμενες εγκαταστάσεις αρχείων - Η προσθήκη Linux GitHub Δράσεις εργασία τρέχει την πλήρη σουίτα και επαναλαμβάνει το σύστημα αρχείων περιπτώσεις ως ρίζα. Αυτή η ροή εργασίας δεν έχει αποσταλεί από αυτό το δέντρο εργασίας. - Η τοπική επικύρωση ήταν στο macOS. Η σύνταξη του Πάιθον ελέγχθηκε με την άμεση Εργαλεία εντολών Python εκτελέσιμο. Ένα πραγματικό macOS repoundback έλεγχο καπνού ΜΠΕΡ επέστρεψε `0.071 ms`. Δεν ζωντανή απομακρυσμένη SSH server, Windows runtime, Linux Runtime , Selinux ανάπτυξη ή εξωτερικό Μονακό UI δοκιμάστηκε τοπικά. - Η απομακρυσμένη επεξεργασία κειμένου απαιτεί τώρα Linux και Python 3 με περιγραφέα-σχετικό υποστήριξη συστήματος αρχείων/χατρίδας. Ένας αγνοούμενος διερμηνέας αποτυγχάνει ρητά. Αυτός ο πυρήνας αρνείται εσκεμμένα μη ασφαλή μεταδεδομένα, συνδέσμους και ρυθμίσεις καταλόγου. - Η κλειδαριά είναι συμβουλευτική: οι μη συνεργαζόμενες διαδικασίες μπορούν ακόμα να αγωνιστούν στο στενό διάστημα μεταξύ του τελευταίου ελέγχου βάσης και της ατομικής μετονομασίας. Linux δεν παρέχει γενική ατομική λειτουργία περιεχομένου-hash σύγκρισης-και-replace. Οι έλεγχοι ανιχνεύουν αλλαγές πριν από αυτό το διάστημα· διατηρείται η ανάκτηση υποστήριξης αντιγράφων εργασίας μετά. - Τα δεδομένα ανάκτησης παραμένουν στον απομακρυσμένο λογαριασμό μέχρι επιβεβαίωσης του καθαρισμού. Ανολοκλήρωτο. Τα αντικρουόμενα και ανεπίληπτα περιοδικά ποτέ δεν απορρίπτονται σιωπηλά. Δεν υπάρχει αυτόματη λήξη του αρχείου ανάκτησης και δεν υπάρχει δυνατότητα αναγκαστικής αντικατάστασης. - Η `npm ci` ανέφερε τα ευρήματα ελέγχου εξάρτησης 17 (9 μέτρια, 8 υψηλή). Αυτή η αλλαγή δεν αλλάζει τις εξαρτήσεις ή το μοντέλο εμπίστευσης της εφαρμογής. Ο χρήστης ζήτησε τη διατήρηση των αλλαγών στο υπάρχον δέντρο εργασίας, σήμερα `feature/hash-checksum-plugin`· δεν έγινε διακόπτης τμήματος ή μη συνδεδεμένος καθαρισμός. ## Τα αρχεία άλλαξαν για αυτή την εργασία - `src/main/files/remoteFileService.js` - `src/main/files/remoteEditor.py` (νέα) - `src/main/sessions/sessionManager.js` - `src/main/sessions/latencyMonitor.js` (νέα) - `src/main/plugins/pluginRuntime.js` - `src/preload/pluginPreload.js` - `src/renderer/app.js` - `src/renderer/index.html` - `src/renderer/styles.css` - `src/renderer/i18n.js` - `test/remoteFileService.test.js` - `test/sessionManager.test.js` - `test/pluginRuntime.test.js` - `test/remoteEditor.test.js` (νέα) - `test/remoteEditorProtocol.test.js` (νέα) - `test/remoteEditorLinux.test.js` (νέα) - `test/fixtures/remoteEditorLinux.py` (νέα) - `test/latencyMonitor.test.js` (νέα) - `README.md` - `docs/remote-editor-latency.md` (αυτό το αρχείο) - `../.github/workflows/remote-editor-tests.yml` (νέα)