CH-J Server Managerspráva serverů přes SSH
Menu

Vzdálené ukládání editorů a monitorování latencí

Stáhnout soubor

Jazyková revize tohoto překladu probíhá. Při nejasnostech porovnejte anglický originál.

Kořenové příčiny

Předchozí editor nahrál svůj pracovní soubor do mateřského adresáře cíle, který často nelze zapsat prostřednictvím účtu SSH pod /etc nebo /var . Přejmenování SFTP nedodává autorizovanou cestu sudo, základní kontrolu konfliktu, ověření bezpečnostních metadat nebo spolehlivé přepsání sémantik. Jeho chybový manipulátor smazal dočasnou kopii, odstranění materiálu pro obnovu i když dokončení bylo nejisté.

Stav relace dříve exponován pouze stav spojení. Nebylo zjištěno žádné ICMP nebo ověřeno SSH měření odezvy krmení indikátor terminálu.

Uložit protokol

  1. Fixní pomocnice SSH otevře pravidelný, jedno-linkový soubor pomocí popisné relace provoz a O_NOFOLLOW pro každou součást cesty. Zachycuje obsah, SHA-256 hash, zařízení/inode, UID, GID, kompletní autorizační bity, nanosekundové modifikace/změnové časy a všechny čitelné rozšířené atributy. Jádro ověřuje hash a dekóduje přísné UTF-8, zachování BOM. Každý dokument dostane neprůhledný editId , rozprostřený do svého pluginu, koncové relace a server identity.
  2. Neprivilegovaná přípravná operace řeší ověřený účet domov přes pwd.getpwuid(os.getuid()) , vytváří $HOME/ch-j-sm/ s režimem 0700 a vytváří soukromý, exkluzivní rekuperační časopis. Nebezpečný domov, symlink pracovní prostor nebo pracovní prostor vlastněný jiným účtem je odmítnut.
  3. Core nahrává skrytý, náhodný 128-bit .tmp pracovní soubor přes SFTP s exkluzivní tvorba ( wx ), režim 0600 a timeout 60-sekundový kanál/upload. Časopis obsahuje cíl, původní výchozí a očekávaný pracovní hash; neobsahuje žádné pověření.
  4. One SSH exec provádí kompletní finalizaci , volitelně prostřednictvím existující vykonavatel sudo. Pomocník se bezpečně otevře a pošle soukromou pracovní kopii a spláchne ji. Zamkne původní inodu, zkontroluje její výchozí hodnotu, vytvoří exkluzivní cílový soubor vedle cíle, zapíše veškerý obsah, použije a ověří metadata, znovu zkontroluje originál a nahradí.
  5. Stejný směr os.replace atomicky nahrazuje cíl. Rodič adresář je spláchnut a konečná cesta, hash, inode a metadata jsou ověřeny. Původní cesta zůstává k dispozici až do nahrazení. Pracovní soubor se nikdy nepřenáší přes souborové systémy a není nikdy odstraněn finalizací.
  6. Poté, co Core obdrží ověřený úspěch, samostatný úklid překontroluje finále obsah a bezpečnostní metadata před odstraněním pracovního souboru a deníku. Selhání čištění stále hlásí potvrzené uložení pomocí recoveryAvailable: true .

Neúspěšné nahrávání, neúspěšné sudo, konflikt, chyba metadat nebo neúspěšná výměna si ponechá původní a jakýkoliv zinscenovaný materiál. Neúplné nahrávky jsou identifikovány jako takové a nelze je obnovit jako kompletní editovaný dokument. Ztracená komunikace SSH, chybějící výstupní stav, timeouty a nečekané výsledky finalizace jsou hlášeny jako un known nikdy tak jako uloženy. Jádro blokuje další uložení na nejistém dokumentu; není automatická náhrada retry.

Metadata, výsady a bezpečnostní hranice

Pomocník uchovává a ověřuje UID, GID a všechny POSIX přípustné bity včetně spustitelných, setuidních, setgidních a lepivých bitů. Reprodukuje rozšířené atributy Linux pro byte, včetně POSIX ACLs, kapacit a SELinux etikety. Vlastnictví a obsah souboru jsou nastaveny před bezpečnostními atributy, protože zápisy / šachy mohou vymazat možnosti nebo speciální oprávnění bitů. Zděděné atributy místa určení, které chybí na originálu, jsou odstraněny. Čas úpravy odráží nový zápis a není zkopírován z originálu.

Nečitelný nebo nereprezentovatelný atribut operaci přeruší; metadata nejsou tiše upuštěna. Podpisy IMA/EVM jsou výslovně zamítnuty, protože kopírování podpisů integrity s obsahem/inodem by je zneplatnilo. Symlinks v cílové nebo domovské cestě, pevně vázané soubory a nepravidelné soubory jsou odmítnuty. Nepoužívá se žádné místo nebo slabší SFTP přepsání zálohy.

Běžně zapisovatelné ukládá běžet jako účet SSH. Chráněné uložení vyžaduje explicitní { sudo: true } ; heslo sudo je volitelné pro bezheslo sudo. Hesla jsou validována a předávána pouze na kanálu stdin, nikdy uvnitř příkazu, deníku, pracovního souboru, loggeru nebo vzdálené chyby. Root SSH relace používají stávající přímý kořenový vykonavatel. Neúspěšné oprávnění zanechá původní a pracovní kopii neporušenou. Všechny ukládá jako root (direct root SSH nebo sudo) také odmítnout cílové adresáře / předky vlastněné nebo zapisovatelné jinými účty, nebo mít přístup ACL, spíše než věřit privilegované jméno směrované jiným účtem.

Fixní pomocník běží se python3 -I -B : ignoruje cesty uživatele Python, pracovní adresář a balíčky uživatelských stránek a píše bez bytecode. Trasy a JSON argumenty jsou shell-citovány v Core. Pluginy nikdy nedostávají libovolné SSH exec nebo SFTP rukojeti. Stávající pískoviště, CSP, zjevná oprávnění, ověření klíčů a ověřování aktualizací zůstávají v provozu.

Plugin API a zbývající integrace Monaka

** Samostatně distribuovaný Monako/File Manager UI chybí. Jeho UI integrace, sudo pohotovost, špinavý-buffer manipulace a překlady nebylo možné implementovat ani testovat zde.** Sdružený plugin zdroj je Hash & Checksum plugin. Žádný náhradní zdroj File Manager nebyl vynalezen.

Stávající metody zůstávají k dispozici. Metody/ opce doplňkové látky jsou vystaveny přednaložením pískem a runtime kontrolovaným oprávněním:

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.

Při kontrole cíle je třeba navýšit metody zpětného získávání volitelný konečný argument { sudo: true, sudoPassword } . Uchovávají si ověřený pracovní prostor uživatele, i když je sudo proveden. Časopisy přežijí restart aplikace a SSH se znovu připojí; zotavení nikdy automaticky neopakuje finalizaci. Prohlédněte si znovuobnovený buffer proti nově otevřenému cíli, než ho výslovně uložíte.

Stráže files.read čtou, kontrolují a řídí. Stráže files.write šetří a obnovuje čištění. writeText stále odmítá selhání stávajících pluginů; saveText vrací strukturovaný obálku { ok, value/error } , protože Electron upouští vlastní vlastnosti na odmítnutých objektech chyby. Dřívější tříargument writeText může využít základní hodnoty jediného otevřeného dokumentu. Více živých dokumentů pro stejnou cestu vyžaduje editId ; nejednoznačné starší hovory selhávají bezpečně místo výběru výchozí hodnoty jiného dokumentu. Pluginy by měly uvolnit nepoužité kliky.

Externí UI musí okamžitě zobrazit uložení, udržovat buffery špinavé při selhání, nabízet sudo pouze po selhání oprávnění/autentikace, ukázat konflikty bez přepsání a nabídnout zotavení po ztrátě spojení nebo neznámý výsledek. Musí tyto státy přeložit v češtině, němčině a angličtině. Doporučená kopie stavu:

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

Definice kluznosti a životní cyklus

Ping je latence nahlášená aktuální klientskou stranou ICMP echo odpovědí na vyřešenou IP použitou SSH. Jádro vyvolá ping platformy spustitelný asynchronně s pevným polem argumentu, bez požadavku na spuštění shellu nebo administrátora. Argumenty Linux, macOS (včetně ping6 ) a Windows se vybírají samostatně. Zablokovaná ICMP, chybějící spustitelný počítač, timeout, neplatný výstup nebo odpověď pouze na horní hranici Windows, jako je <1ms vytváří nedostupnou hodnotu, nikoli vynalezené číslo.

SSH RTT je monotonický performance.now() trvání pevné true exec žádosti o stávající ověřený SSH klient. Zahrnuje nastavení kanálů, zpracování serveru a doručení odpovědí; nejedná se o čistou síť RTT nebo SSH přihlašovací dobu. Přeložené indikátorové tooltip vysvětluje toto rozlišení.

Sledování začne, jakmile se terminál připojí. Sondy běží souběžně a synchronně, s pětisekundovým timeoutem požadavku/procesu. Další vzorek je naplánován dvanáct sekund po dokončení předchozího vzorku, což zabraňuje překrytí. Odpojení přeruší ICMP, vymaže časovače, zruší práci SSH a vymaže hodnoty. Kontrola totožnosti záznamu brání zveřejnění předchozího spojení po opětovném připojení. Selhání ICMP nikdy nemění stav spojení SSH.

Latency cestuje do existující události state / ssh:state IPC:

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

Nedostupná čísla jsou null . Kompaktní terminálový indikátor používá milisekundy, lokalizovaný nedostupný text a Czech/German/English etikety. Schovává se na odpojení. Nebylo zapotřebí žádné další provedení rendereru nebo IPC požadavku.

Validace a provozní limity

Uživatel si vyžádal zachovat změny ve stávajícím pracovním stromu, v současné době feature/hash-checksum-plugin ; nebyl proveden žádný přepínač větve nebo nepříbuzný úklid.

Soubory změněny pro tento úkol