> Языковая редактура этого перевода продолжается. Если фрагмент неясен, сверьтесь с [английским оригиналом](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 hэш, устройство/инод, UID, GID, полные биты разрешения, время изменения/изменения наносекунд и все прочитаемые расширенные атрибуты. Ядро проверяет хэш и расшифровывает жесткий UTF-8, сохраняя BOM. Каждый документ получает непрозрачный `editId`, очерченный своим идентификатором subin, term session и сервера. 2. Непривилегированная операция по подготовке решает вопрос о подтвержденном счете Shome from `pwd.getpwuid(os.getuid())`, создаёт `$HOME/ch-j-sm/` с режимом `0700` и создает частный эксклюзивный журнал восстановления. Небезопасный дом, симлинк или рабочее пространство, принадлежащее другому счету, не принимается. 3. Загрузить файл скрытых, случайных 128-bit `.tmp` через SFTP Эксклюзивное создание (`wx`), режим `0600` и шестьдесят второй канал/время загрузки. Журнал содержит цель, первоначальную исходную основу и ожидаемый рабочий гашх; в нем отсутствуют полномочия. 4. **One SSH Exec выполняет всю доработку **, факультативно через Существующий исполнитель судебных решений. Помощник надежно открывает и хватает частный рабочий экземпляр и смывает его. Он запирает оригинальную впадину, проверяет исходную основу, создает эксклюзивный файл назначения рядом с целью, пишет все контенты, применяет и проверяет метаданные, проверяет оригинал снова и сбрасывает замену. 5. То же самое направление `os.replace` атомно заменяет цель. Родитель каталог смывается, а окончательный путь, хеш, впадина и метаданные проверяются. Оригинальный путь остается открытым до замены. Рабочие файлы никогда не перемещаются через файловые системы и никогда не удаляются после завершения. 6. После того, как Kore получает проверенный успех, отдельная очистка снова проверяет финал до удаления рабочего файла и журнала. Неисправность очистки до сих пор подтверждает сохранение `recoveryAvailable: true`. Неудачная загрузка, неисправная судо, коллизия, ошибка в метаданных или неудачная замена сохраняют оригинальный и любой сфабрикованный материал. Неполные загрузки определяются как таковые и не могут быть взысканы в качестве полного отредактированного документа. Потеря связи SSH, отсутствие статуса выхода, таймеры и неожиданные окончательные результаты сообщаются как **undown**. Замкнутые в ключевые блоки другие, за исключением неопределенного документа; автоматической замены не существует. ## Метаданные, привилегии и границы безопасности Помощник сохраняет и проверяет UID, GID и все пропуски POSIX, включая исполнимые, сетчатые, стержневые и липкие биты. Он воспроизводит Linux расширенные атрибуты байт, включая POSIX ACL, возможности и знаки SELinux. Содержание собственности и файла устанавливается перед атрибутами защиты, поскольку записи/шоу могут очистить возможности или специальные биты разрешения. Наследственные атрибуты места назначения, которые отсутствуют в оригинале, удаляются. Время изменения отражает новую запись и не копируется из оригинала. Нечитаемый или нерепрезентабельный атрибут прерывает операцию; метаданные не опускаются безмолвно. Подписи IMA/EVM прямо отвергаются, поскольку копирование содержания/подписи, привязанные к неприкосновенности, могут их аннулировать. Отклоняются ссылки на цель или домашний путь, крепкие файлы и нерегулярные файлы. Не используется резервная запись SFTP. Обычные заказные сбережения используются как счет SSH. Защищенные сбережения требуют эксплицитного `{ sudo: true }`; пароль sudo является факультативным для без пароля sudo. Пароли проверяются и передаются только на канале Stdin, никогда не входя в команду, журнал, рабочий файл, логарифм или удаленная ошибка. В сеансах SSH используется существующий прямой исполнитель корневого кода. Неудачное разрешение оставляет оригинал и рабочий экземпляр нетронутым. Все сэкономленные как корень (прямой корень SSH или sudo) также отклоняют целевые каталоги/пастора, принадлежащие другим аккаунтам или подлежащие заказу, либо имеющие доступ к ACL, вместо того чтобы доверять привилегированному имени, контролируемому другим счетом. Стационарный помощник работает с `python3 -I -B`: он игнорирует пользовательские траектории Python, рабочий каталог и пакеты пользователей сайта и не пишет байткода. Путьи и аргументы JSON подсказываются в Kor. Плугины никогда не получают произвольное SSH exec или SFTP ручки. По-прежнему используются существующие песчаные коробки, CSP, разрешения на выдачу манифестов, проверка с помощью ключа и проверка обновления. ## Плугин API и дальнейшая интеграция Монако **ВЭ отдельно распределяется по Монако/руководителю компании UI отсутствует в этой выписке. Его интеграция UI, sudo быстрая, грязная купюрная обработка и перевод не могут быть реализованы или испытаны здесь. ** Связанный источник мешка - это хэш & shell bigin. Не было изобретено никаких альтернативных источников данных для менеджера файлов. Существующие методы остаются в наличии. Методы/варианты добавления клетчатки подвергаются воздействию предварительно загруженного и проверенного разрешения времени работы: ```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` по-прежнему отвергает отказ в отношении существующих лейбинов; `saveText` возвращает структурированный конверт `{ ok, value/error }`, потому что Electron сбрасывает свои свойства на отклоненные объекты. Наследие, состоящее из трех аргументов `writeText`, может использовать исходную основу одного открытого документа. Множественные живые документы для одного и того же пути требуют `editId`; двусмысленные звонки наследства не срабатывают, вместо того чтобы выбирать исходную основу другого документа. Плугинс должен выпустить неиспользованные ручки. Внешний UI должен немедленно показывать сбережения, держать буферы грязными в случае отказа, предлагать судо только после отказа разрешения/обоснования, демонстрировать конфликты без перезаписи и предлагать возмещение после потери связи или неизвестного результата. Он должен перевести эти штаты на чешский, немецкий и английский языки. Предлагаемая копия: | 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 | ## Определения лакокрасочной деятельности и жизненный цикл **Ping** — это запоздалый ответ, представленный фактическим клиентом ICMP на ПУ, используемый SSH. Мысль асинхронизирует платформу с фиксированным массивом аргументации без требования запуска панелей или администратора. Linux, macOS (включая `ping6`) и Windows отбираются отдельно. Заблокированный ICMP, отсутствующий активируемый, временной выход, недействительный вывод или только верхний ответ Windows, например `<1ms` производят недоступное значение, а не изобретенное число. **SSH RT** — монотонный `performance.now()` продолжительность установленного запроса `true` по существующему удостоверенному клиенту SSH. Она включает в себя установку каналов, обработку серверов и доставку ответов; она не является чисто сетевой РТТ или SSH продолжительностью ввода в эксплуатацию. Это различие разъясняется в переведённом инструменте показателей. Мониторинг начинается, как только терминал подключается. Протесты проводятся одновременно и асинхронно с пятисекундным временным отсрочкой запроса/процесса. Следующая выборка запланирована на 12 секунд после завершения предыдущей выборки, что позволяет избежать дублирования. Отключает ICMP, очищает таймеры, отменяется до завершения работы SSH и очищает стоимость. Проверки документов не позволяют ранеему подключению опубликовать их после повторного подключения. Неисправность ICMP никогда не изменяет состояние соединения SSH. Прогулки в пределах существующей полезной нагрузки `state` / `ssh:state` IPC: ```js latency: { pingMs: 24.1, sshRttMs: 31.25, measuredAt: "…" } ``` Недоступные номера `null`. В компактном терминальном показателе используются миллисекунды, локальный недоступный текст и маркировка чешского /German/English. Он прячется при отключении. Дополнительных возможностей для выполнения операций по производству осколков или запроса на создание ИУК не потребовалось. ## Проверка и оперативные пределы - Запустить `app/`: `npm ci`, затем `npm test`. - Окончательные местные результаты: **179 испытания; 163 Прошёл, 0 не удалось, 16 пропущено**. Все пропуски , это дела с файловой системой Linux на этом сервере macOS. `npm ci`, Python systaphic compilation и `git diff --check` успешно завершены. - Эти тесты охватывают Seapers/ Recovery, sudo протокол и редактирование пароля, Реальная оболочка POSIX цитирует враждебные пути, конфликты, загрузки, неудачную очистку, неопределенные результаты, параллельные документы, разрешения IPC и цикл запоздалого жизненного цикла. - Linux испытания файловой системы проводят отправку в пункт въезда Python с использованием частного устройства Проверки в базе данных: право собственности /mode/xattrs, POSIX ACLs, симлинки/жесткие ссылки, FIFOs, ошибки загрузки и метаданных, отказы в замене, целевые расы, неизвестные результаты после замены и восстановление. Настройка системных файлов использует `/dev/shm` и другую файловую систему, когда она доступна. Эти испытания не проводятся на устройствах, не относящихся к Linux; отсутствие оборудования ACL/отдельных файловых систем явно пропущено. - Дополнительная работа Linux GitHub Actions содержит полный номер и повторяет файловую систему случаи как корень. Этот рабочий документ не был отправлен с этого рабочего дерева. - Местное подтверждение было на macOS. Синтаксис источника Python был проверен с помощью прямого Командные лайн-инструменты Python можно выполнить. Реальный петлю macOS ICMP-проверка дыма вернула `0.071 ms`. На местном уровне не были опробованы работающие серверы SSH, Windows и Linux. - Удалённое редактирование текста требует Linux и Python 3 с дескриптором-отношением Поддержка файловой системы/xattr. Пропавший переводчик явно не справляется. Это ядро намеренно отказывается от небезопасных метаданных, ссылок и конфигураций каталогов. - Блокировка является консультативным фактором: недействующие процессы все еще могут идти в узком направлении. интервал между последней контрольной проверкой и атомным переименованием. Linux не поставляет общего атомного контент-хэша для сравнения и замены. Проверки выявляют изменения до этого интервала; после этого сохранены рабочие копии, подтверждающие восстановление. - Данные о восстановлении остаются на дистанционном счете до подтверждения факта очистки. Неполный, Спорные и невидимые журналы никогда не выбрасываются безмолвно. Не существует автоматического срока годности файла для восстановления и нет принудительного перезаписи опции. - `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` (новый)