CH-J Toolsserverbeheer over SSH
Menu

Opslaan van editor op afstand en latency monitoring

Bestand downloaden

Deze vertaling wordt taalkundig herzien. Vergelijk onduidelijke passages met het Engelse origineel.

Hoofdoorzaken

De vorige editor heeft zijn werkbestand geüpload naar de oudermap van het doel, die vaak niet door het SSH-account kan worden geschreven onder /etc of /var . SFTP hernaam geleverd geen geautoriseerde sudo pad, baseline conflict check, security metadata verificatie of betrouwbare overschrijven semantiek. De foutafhandeling verwijderde de tijdelijke kopie, het verwijderen van terugwinningsmateriaal zelfs toen de voltooiing was onzeker.

Sessiestatus eerder alleen de verbindingsstatus blootgesteld. Er was geen ICMP of geauthentificeerd SSH-responsmeting die de terminalindicator voedde.

Protocol opslaan

  1. Een vaste SSH-helper opent een normaal, single-link bestand met behulp van descriptor-relatief operaties en O_NOFOLLOW voor elke padcomponent. Het vangt de inhoud, SHA-256 hash, apparaat/inode, UID, GID, volledige toestemming bits, nanosecond wijziging / verandering tijden en alle leesbare uitgebreide attributen. Core controleert de hash en decodeert strikte UTF-8, met behoud van een BOM. Elk document krijgt een ondoorzichtige editId , scoped naar zijn plugin, terminal sessie en server-identiteit.
  2. Een onbevoorrechte voorbereidingsoperatie lost de geauthentiseerde rekening op home via pwd.getpwuid(os.getuid()) , maakt $HOME/ch-j-sm/ met de modus 0700 en creëert een privé, exclusief recovery journaal. Een onveilig huis, symlink werkruimte of een werkplek die eigendom is van een ander account wordt afgewezen.
  3. Core uploadt een verborgen, willekeurige 128-bit .tmp werkbestand via SFTP met exclusieve creatie ( wx ), modus 0600 en een zestig seconden channel/upload timeout. Het journaal bevat het doel, de oorspronkelijke basislijn en de verwachte werkhash; het bevat geen referenties.
  4. One SSH exec voert de volledige afwerking uit, optioneel via het bestaande sudo-uitvoerder. De helper opent en hasht de privé werkkopie veilig en spoelt het door. Het vergrendelt de originele inode, controleert zijn basislijn, creëert een exclusief bestemmingsbestand naast het doel, schrijft alle inhoud, past en controleert metadata, controleert het origineel opnieuw, en spoelt de vervanging.
  5. Een zelfde-directory os.replace vervangt atomair het doel. De ouder directory is doorgespoeld en het laatste pad, hash, inode en metadata worden geverifieerd. Het oorspronkelijke pad blijft tot vervanging beschikbaar. Het werkbestand wordt nooit verplaatst over bestandssystemen en wordt nooit verwijderd door de definitieve versie.
  6. Nadat Core een geverifieerd succes heeft gekregen, controleert een aparte opruiming de finale opnieuw. inhoud en beveiligingsmetadata voordat het werkbestand en het journaal worden verwijderd. Het opruimen is nog steeds een bevestigde opslag met recoveryAvailable: true .

Een mislukte upload, mislukte sudo, conflict, metadatafout of mislukte vervanging houdt het origineel en elk geënsceneerd materiaal. Onvolledige uploads worden als zodanig geïdentificeerd en kunnen niet worden hersteld als een volledig bewerkt document. Verloren SSH communicatie, ontbrekende exit status, time-outs en onverwachte afronding resultaten worden gerapporteerd als unknown , nooit zoals opgeslagen. Core blokkeert een andere opslag op een onzeker document; er is geen automatische vervanging opnieuw proberen.

Metadata, privileges en veiligheidsgrenzen

De helper bewaart en controleert UID, GID en alle POSIX-toestemmingsbits, inclusief uitvoerbare, setuid, setgid en plakkerige bits. Het reproduceert Linux uitgebreide attributen byte voor byte, inclusief POSIX ACLs, mogelijkheden en SELinux labels. Eigenschap en bestandsinhoud worden ingesteld vóór beveiligingsattributen, omdat writes/chown mogelijkheden of speciale toestemming bits kan wissen. Erfde doelattributen die afwezig zijn op het origineel worden verwijderd. De wijzigingstijd weerspiegelt de nieuwe schrijfwijze en wordt niet van het origineel gekopieerd.

Een onleesbaar of niet-representeerbaar attribuut breekt de operatie af; metadata worden niet stil gedropt. IMA/EVM-signaturen worden uitdrukkelijk afgewezen omdat het kopiëren van content/inode-gebonden integriteitshandtekeningen deze ongeldig zou maken. Symlinks in het doel of thuispad, hard-linked bestanden en niet-reguliere bestanden worden afgewezen. Er wordt geen in-place of zwakkere SFTP overschrijven terugval gebruikt.

Gewone beschrijfbare slaat draaien als de SSH-account. Beschermde opslag vereist expliciete { sudo: true } ; een sudo wachtwoord is optioneel voor wachtwoordloze sudo. Wachtwoorden worden gevalideerd en alleen doorgegeven op kanaal stdin, nooit in het commando, journal, werkbestand, logger of remote error. Root SSH sessies gebruiken de bestaande directe root uitvoerder. Foute autorisatie laat het origineel en werkkopie intact. Alle opgeslagen bestanden worden uitgevoerd als root (direct root SSH of sudo) weigeren ook doel directories/ancestors eigendom van of schrijfbaar door andere accounts, of het dragen van een toegang ACL, in plaats van het vertrouwen van een bevoorrechte padnaam gecontroleerd door een ander account.

De vaste helper draait met python3 -I -B : het negeert gebruikerspaden Python, de werkmap en gebruikerssite pakketten, en schrijft geen bytecode. Paden en JSON argumenten zijn shell-geciteerd in Core. Plugins nooit willekeurige SSH exec of SFTP handvatten ontvangen. Bestaande sandbox, CSP, manifeste permissies, host-key verificatie en update verificatie blijven in gebruik.

Plugin API en resterende Monaco integratie

De apart gedistribueerde Monaco/File Manager UI is afwezig in deze kassa. De UI integratie, sudo prompt, vuile-buffer behandeling en vertalingen kon hier niet worden geïmplementeerd of getest. De gebundelde plugin bron is de Hash & Checksum plugin. Er is geen vervangende File Manager bron uitgevonden.

De bestaande methoden blijven beschikbaar. Toevoegingsmiddelmethoden/opties worden blootgesteld aan de voorbelasting en door toestemming gecontroleerde runtime:

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.

Herstelmethoden accepteren een optioneel laatste { sudo: true, sudoPassword } argument wanneer het inspecteren van een doel vereist verhoging. Ze behouden de geauthentiseerde gebruikerswerkruimte zelfs wanneer uitgevoerd via sudo. Journals overleven app herstart en SSH opnieuw verbinden; herstel nooit automatisch herhaalt de afronding. Bekijk een herstelde buffer tegen een nieuw geopend doel voordat expliciet opslaan.

files.read bewakers lezen, inspecteren en loslaten. files.write bewakers bespaart en herstel opruimen. writeText wijst nog steeds af bij falen voor bestaande plugins; saveText geeft een gestructureerde { ok, value/error } -envelop terug omdat Electron aangepaste eigenschappen laat vallen op geweigerde Foutobjecten. Een legacy drie-argument writeText kan de basislijn van een enkel open document gebruiken. Meerdere live-documenten voor hetzelfde pad vereisen editId ; dubbelzinnige legacy-oproepen falen veilig in plaats van het kiezen van de basislijn van een ander document. Plugins moeten ongebruikte handvatten vrijgeven.

De externe UI moet onmiddellijk opslaan, buffers vuil houden bij een storing, sudo alleen aanbieden na toestemming/authenticatie mislukkingen, conflicten tonen zonder overschrijven en herstel bieden na verbinding verlies of een onbekende uitkomst. Het moet deze landen vertalen in het Tsjechisch, Duits en Engels. Voorgestelde staat kopie:

StateCzechGermanEnglish
SavingUkládání…Wird gespeichert…Saving…
ConfirmedUloženoGespeichertSaved
FailureUložení selhaloSpeichern fehlgeschlagenSave failed
Sudo requiredVyžadováno oprávnění sudosudo-Autorisierung erforderlichSudo authorization required
ConflictPůvodní soubor byl změněnOriginaldatei wurde geändertOriginal file changed
DisconnectedSpojení bylo přerušenoVerbindung unterbrochenConnection lost
UnknownVýsledek uložení není známSpeicherergebnis unbekanntSave result unknown
RecoveryObnova je dostupnáWiederherstellung verfügbarRecovery available

Moeitedefinities en levenscyclus

Ping is de latentie die wordt gerapporteerd door een werkelijke client-side ICMP echo antwoord op het opgelost IP gebruikt door SSH. Core roept het platform ping uitvoerbaar asynchroon met een vaste argument array, zonder een shell of beheerder opstarten vereiste. Linux, macOS (inclusief ping6 ) en Windows argumenten worden apart geselecteerd. Geblokkeerde ICMP, een ontbrekend uitvoerbaar programma, een timeout, ongeldige uitvoer of een Windows-antwoord bovengrens zoals <1ms produceren een niet beschikbare waarde, geen uitgevonden getal.

SSH RTT is de monotone performance.now() -duur van een vaste true exec-verzoek over de bestaande geauthentiseerde SSH client. Het omvat kanaal setup, server verwerking en response delivery; het is niet pure netwerk RTT of SSH login duur. De vertaalde indicator tooltip verklaart dit onderscheid.

Monitoring begint zodra de terminal verbinding maakt. De sondes draaien gelijktijdig en asynchroon, met een vijf-seconden verzoek/proces timeout. Het volgende monster is gepland twaalf seconden nadat het vorige monster voltooid, voorkomen overlapping. Ontkoppelt ICMP, ontruimt timers, annuleert lopende SSH werk en clears waarden. Record identiteitscontroles verhinderen dat een voorafgaande verbinding wordt gepubliceerd na het opnieuw verbinden. ICMP-storing verandert nooit de SSH-verbindingstoestand.

Latency reist binnen de bestaande state gebeurtenis / ssh:state IPC payload:

latency: { pingMs: 24.1, sshRttMs: 31.25, measuredAt: "…" }

Niet beschikbare nummers zijn null . De compacte terminal indicator gebruikt milliseconden, gelokaliseerde niet-beschikbare tekst en Czech/German/English labels. Het verbergt zich bij het verbreken van de verbinding. Er was geen extra uitvoermogelijkheid voor renderers of IPC-verzoek nodig.

Validatie- en operationele grenzen

De gebruiker verzocht wijzigingen in de bestaande werkboom te behouden, momenteel feature/hash-checksum-plugin ; er werd geen branch switch of niet-gerelateerde opruiming uitgevoerd.

Bestanden gewijzigd voor deze taak