CH-J ToolsZarządzanie serwerem przez SSH
Menu

Monitorowanie zdalnego edytora oszczędności i latencji

Pobierz plik PDF

Trwa korekta językowa tego tłumaczenia. W razie wątpliwości porównaj z angielskim oryginałem.

Przyczyny korzeniowe

Poprzedni edytor przenieśł swój plik roboczy do katalogu docelowego, który często nie może być napisany przez SSH rachunek na /etc lub /var. SFTP nazwisko nazwy nie podało autoryzowanej ścieżki sudo, kontrola konfliktów, weryfikacja metadanych bezpieczeństwa lub niezawodne nadpisywanie semantyki. Jego obsługa obsługiwacza błędów usunęła tymczasową kopię, usunęła materiał odzyskiwania nawet po niepewnym zakończeniu.

Status sesji wcześniej naświetlał tylko stan połączenia. Nie było żadnego ICMP ani uwierzytelnionego SSH pomiar odpowiedzi na podłożenie wskaźnika końcowego.

Zapisz protokół

  1. Ustalony plik pomocniczy SSH otwiera regularny plik jednolitej linki przy użyciu deskryptor-relatywnego operacje i O_NOFOLLOW dla każdego elementu ścieżki. Zapisuje zawartość. SHA-256 hash, urządzenie/inode, UID, GID, kompletne bity zezwolenia, nanosekundowe modyfikacje/czasy zmian i wszystkie rozszerzone atrybuty. Podstawa potwierdza hasz i dekoduje ścisły UTF-8, zachowując BOM. Każdy dokument jest nieprzezroczysty editId, rozszerzony do wtyczki, sesji terminalowej i tożsamości serwera.
  2. Operacja przygotowawcza nieprzywilegowana rozwiązuje uwierzytelnione konto dom przez pwd.getpwuid(os.getuid()), tworzy $HOME/ch-j-sm/ z trybem 0700, i tworzy prywatny, ekskluzywny czasopismo odzyskiwania. Niebezpieczny dom, symboliczny obszar roboczy lub praca robocza należąca do innego konta zostaje odrzucony.
  3. Wysyłanie rdzenia ukryte, losowe 128- bit .tmp plik roboczy przez SFTP z wyłączne stworzenie (wx), tryb 0600 i sześćdziesiątgodzinny czas przerwy na kanał/załadunek. Czasopismo zawiera docelowy, oryginalny punkt wyjściowy i oczekiwany hash pracy; nie zawiera uwierzytelnienia.
  4. Jeden SSH exec wykonuje całą finalizację, opcjonalnie poprzez istniejący wykonawca sudo. Pomocnik bezpiecznie otwiera i hases prywatną kopię roboczą i uwalnia ją. Zamyka oryginalne inode, sprawdza jego podstawę odniesienia, tworzy wyłączny plik docelowy obok celu, pisze wszystkie zawartości, stosuje i potwierdza metadane, sprawdza oryginał ponownie, i splaszuje wymianę.
  5. Ten sam katalog os.replace atomowo zastępuje cel. Rodzic katalog jest spłukany, a ostateczna ścieżka, hash, inode i metadane są sprawdzane. Oryginalna ścieżka pozostaje dostępna do czasu zastąpienia. Plik roboczy nigdy nie jest przemieszczany w pliki plików i nigdy nie jest usuwany przez finalizację.
  6. Po uzyskaniu zweryfikowanego sukcesu, oddzielne czyszczenie ponownie sprawdza finał zawartość i metadane bezpieczeństwa przed usunięciem pliku roboczego i dziennika. Niepowodzenie wyczyszczenia wciąż zgłasza potwierdzone zapisywanie z recoveryAvailable: true.

Niepowodzenie wysyłania, nieudanego sudo, konfliktu, błędu metadanych lub niepowodzenia zastąpienia zachowuje oryginalny i dowolny scenariusz. Niekompletne przesyłki są zidentyfikowane jako takie i nie mogą być odzyskane jako kompletny edytowany dokument. Zgubione SSH komunikacja, brak statusu wyjścia, limity czasowe i nieoczekiwane wyniki finalizacji są zgłaszane jako nieznany, nigdy tak uratowano. Zablokowanie drugiego zapisu na niepewnym dokumencie; nie ma automatycznego powtórzania.

Metadane, przywileje i granice bezpieczeństwa

Pomocnik zachowuje i sprawdza UID, GID i wszystkie bity zezwolenia POSIX, w tym wykonywane, setuid, setgid i lepkie bity. Reprodukuje rozszerzony atrybut Linux bajt dla bajtu, w tym POSIX ACL, możliwości i etykiety SELinux. Właściwość i zawartość pliku są ustawione przed atrybutami bezpieczeństwa, ponieważ pisanie/chownia może oczyścić możliwości lub specjalne bity zezwolenia. Usuwane są dziedziczne cechy docelowe, które nie występują w oryginału. Czas modyfikacji odzwierciedla nowy zapis i nie jest skopiowany z oryginału.

Atrybut nieprzeczytany lub niereprezentabilny przerywa operację; metadane nie są cicho usunięte. Podpisy IMA/EVM są wyraźnie odrzucone, ponieważ kopiowanie zawartości/inode-wiązane podpisy integralności unieważniłyby je. Odrzuca się powiązania w ścieżce docelowej lub domowej, twardo powiązane pliki i nieregularne pliki. Brak miejsca lub słabszy SFTP Wykorzystywane jest zamienne zastąpienie.

Zwyczajne zapisywanie oszczędza jako SSH konto. Ochrona oszczędności wymaga wyraźnie { sudo: true }; hasło sudo jest opcjonalne dla sudo bez hasła. Hasła są zweryfikowane i przekazywane tylko na kanale stdin, nigdy nie znajdującym się w poleceniu, dzienniku, pliku roboczym, logerze lub błędzie zdalnym. Sesje root SSH używają istniejącego bezpośredniego wykonującego root. Nieudane zezwolenie pozostawia oryginalny i roboczy egzemplarz nietknięty. Wszystkie zapisy wykonywane jako root (bezpośredni root SSH lub sudo) odrzucają również katalogi docelowe/wyznaczniki posiadane lub zapisywane przez inne konta, lub przenoszące ACL dostęp, zamiast uwierzyć uprzywilejowanej nazwie ścieżki kontrolowanej przez inne konto.

Stabilny pomocnik działa z python3 -I -B: ignoruje ścieżki użytkownika Python, katalog roboczy i pakiety witryny użytkownika i nie pisze żadnego bajtowego kodu. Ścieżki i JSON Argumenty są cytowane w Core. Wtyczki nigdy nie otrzymują arbitralnego SSH exec lub SFTP Uchwyty. Istniejąca piaskowoda, CSP, uprawnienia manifestowe, weryfikacja klucza hosta i certyfikacja aktualizacji pozostają w trakcie eksploatacji.

Plugin API oraz pozostała integracja Monaco

Oddzielnie rozproszony UI Monaco/File Manager jest nieobecny w tym wymeldowaniu. Integracja UI, sudo szybkie, brudny-buffer obsługa i tłumaczenia nie mogły zostać wdrożone lub testowane tutaj. Źródłem wtyczki pakowanego jest wtyczka Hash & Checksum. Nie wymyślono źródła zastępczego menedżera plików.

Dostępne są istniejące metody. Metody/opcje dodatku są narażone przez wstępne obciążenie z piaskownikiem i czas trwania sprawdzony zezwoleniem:

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.

Metody odzyskiwania akceptują opcjonalne ostateczne { sudo: true, sudoPassword } argumenty podczas inspekcji celu wymagają podniesienia. Zachowują one uwierzytelnioną pracę użytkownika, nawet po wykonaniu przez sudo. Dzienniki przetrwają restartowanie aplikacji i SSH ponowne połączenie; odzyskanie nigdy automatycznie nie powtarza finalizacji. Przegląd odzyskanego bufora w stosunku do świeżie otwartego celu przed jego wyraźnym zachowaniem.

files.read strażnicy czytają, kontrolują i uwalniają. files.write Strażnicy oszczędzają i odzyskują oczyszczenie. writeText nadal odrzuca w przypadku awarii dla istniejących wtyczek; saveText zwraca ustrukturyzowany { ok, value/error } koperta Electron wyrzuca właściwości własny na odrzucone obiekty Błąd. Trzy-argumenty dziedzictwa writeText może korzystać z wartości wyjściowej pojedynczego otwartego dokumentu. Wiele dokumentów na żywo dla tej samej ścieżki wymaga editId; Dwuznakie połączenia z dziedzictwem nie są bezpieczne zamiast wybierania podstawowych zasad innego dokumentu. Wtyczki powinny uwolnić niewykorzystane uchwyty.

Zewnętrzny interfejs interfejsu musi natychmiast wyświetlać zapisywanie, utrzymać bufory brudne przy awarii, oferować sudo tylko po niepowodzeniach zezwolenia/autentyfikacji, pokazywać konflikty bez przepisywania i oferować odzyskanie po utracie połączenia lub nieznanym wyniku. Musi to przetłumaczyć te państwa po czesku, niemieckim i angielskim. Zasugerowana kopia stanu:

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

Definicje łatelności i cyklu życia

Ping jest latencją zgłoszoną przez rzeczywistą odpowiedź ICMP na echo klienta na rozwiązane IP używane przez SSH. Podstawa wywołuje platformę pingu asynchronnie z ustaloną tablicą argumentów, bez wymagania uruchomienia pokoła lub administratora. Linux, macOS (w tym ping6) oraz Windows argumenty są wybierane oddzielnie. Blokowany ICMP, brak wykonania, limit czasu, nieprawidłowe wyjście lub tylko górne wiązanie Windows odpowiedź, jak np. <1ms produkuje niedostępną wartość, a nie wymyśloną liczbę.

SSH RTT jest monotoniczne performance.now() czas trwania stałego true Wykonywanie wniosku w sprawie istniejącego uwierzytelnionego SSH Klient. Obejmuje ustawienie kanału, przetwarzanie serwera i dostarczenie odpowiedzi; nie jest to czysta sieć RTT lub SSH czas trwania logowania. Przetłumaczone podpowiedź wskaźnika wyjaśnia to rozróżnienie.

Monitorowanie rozpoczyna się od momentu połączenia terminala. Soby działają równocześnie i asynchronicznie, z pięciosekundowym czasem czasu zapytania/procesu. Następna próbka jest zaplanowana 12 sekund po zakończeniu poprzedniej próbki, zapobiegając nakładaniu się. Odłączanie przerwań ICMP, oczyszcza czasomierze, anuluje oczekiwanie SSH praca i oczyszczanie wartości. Kontrole tożsamości rejestracyjnej uniemożliwiają opublikowanie wcześniejszych połączeń po połączeniu. Niepowodzenie ICMP nigdy nie zmienia się SSH stan połączenia.

Łatency podróżują wewnątrz istniejącego state zdarzenie / ssh:state Ładunek IPC:

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

Niedostępne są liczby null. Wskaźnik kompaktowy wykorzystuje milisekundy, lokalizowany niedostępny tekst i czeski/German/English etykiet. Ukrywa się przy rozłączeniu. Nie wymagano dodatkowej zdolności wykonania wytwarzacza lub żądania IPC.

Limity weryfikacji i operacyjnych

Użytkownik żądał zachowania zmian w istniejącym drzewie roboczym, obecnie feature/hash-checksum-plugin; nie wykonano przełącznika oddziału ani niepowiązanego sprzątania.

Pliki zmienione dla tego zadania