Вопрос или проблема
Я хотел бы запустить процесс на удаленном компьютере через SSH и чтобы графический интерфейс этого процесса открылся на одном из дисплеев удаленного компьютера.
Удаленный компьютер работает под управлением Windows (10 или 11)
Пример
Чтобы объяснить, что я имею в виду, вот как это работает на удаленном компьютере с Linux (работающем с xserver):
- Подключитесь к удаленному компьютеру с Linux через SSH
- Установите переменную окружения
$DISPLAY
в значение:0
или любой другой ID дисплея. - Запустите процесс. Теперь процесс появится на экране удаленного компьютера.
Вот полная команда, которую я протестировал на удаленном Ubuntu 22.04 (но она должна работать на любом Linux, работающем с xserver):
ssh <remote_user>@<remote_ip> "export DISPLAY=:0 && gedit"
Моя попытка
В Windows, я могу запустить процесс в Windows удаленно с помощью ssh <remote_user>@<remote_ip> "notepad.exe"
. Однако графический интерфейс окна не появляется на удаленном дисплее.
Я вижу, что процесс появляется в списке задач, так что он выполняется нормально, но графический интерфейс просто не появляется.
Итак, чтобы повторить мой вопрос, как мне сделать так, чтобы он появился?
И чтобы было абсолютно ясно: я не хочу, чтобы графический интерфейс открылся на моем локальном ПК (ПК, с которого я подключаюсь). Я хочу, чтобы он появился на удаленном дисплее (компьютера, к которому я подключаюсь)
Лучший способ, который я нашел, – создать запланированную задачу и вызвать ее, см. https://serverfault.com/a/1160137/30441
Включая фактический ответ из этой ссылки здесь (благодарность Кристиану Димитрову)
Вы можете это сделать. Допустим, вы подключены к удаленной машине через SSH с пользователем ‘office’ и хотите запустить Mozilla Firefox. Сначала нужно создать запланированную задачу:
$User = "office"
$Firefox = New-ScheduledTaskAction -Execute "C:\Program Files\Mozilla Firefox\firefox.exe"
Register-ScheduledTask -TaskName "Firefox" -User $User -Action $Firefox
Затем вы можете выполнить ее, запустив следующую команду:
Start-ScheduledTask -TaskName "Firefox"
Ответ или решение
Подключение к удаленным системам и запуск графических интерфейсов через SSH может оказаться нетривиальной задачей, особенно когда речь идет о системе на базе Windows. В отличие от Linux, где использование X Server позволяет легко перенаправить графические приложения на удаленные дисплеи, Windows требует иного подхода. Рассмотрим, как можно решить данную задачу, используя подход с созданием и запуском запланированной задачи.
Теория
В Linux возможность запуска графического интерфейса происходит благодаря системе X11, которая позволяет задавать переменные окружения, такие как DISPLAY, и перенаправлять вывод на удаленные машины. Это делается путем задания переменной DISPLAY, что позволяет запустить приложение на конкретном экране.
Для Windows системы, к сожалению, такого прямого функционала нет. Когда SSH используется для подключения к Windows, процессы запускаются в контексте среды терминального сервера, которая не привязана к реальному рабочему столу. Это объясняет, почему при удаленном запуске приложения через SSH мы видим процесс в списке, но не видим его графический интерфейс на экране.
Пример
Для демонстрации используем ситуацию, когда необходимо запустить графическое приложение, например, Notepad или Firefox, на удаленной машине с Windows, при этом его интерфейс должен быть видимым на самом удаленном компьютере. Решение состоит в использовании диспетчера задач Windows, который позволяет запускать приложения в реальном пользовательском контексте рабочего стола.
Применение
Шаг 1: Создание запланированной задачи
Для того, чтобы запустить приложение как полноправную часть рабочего стола, необходимо создать запланированную задачу. Это можно сделать с помощью PowerShell:
- Откройте PowerShell на удаленной машине.
-
Создайте действие, которое будет запускать необходимое приложение (Firefox в качестве примера):
$User = "office" # замените на необходимое имя пользователя $Action = New-ScheduledTaskAction -Execute "C:\Program Files\Mozilla Firefox\firefox.exe" Register-ScheduledTask -TaskName "RunFirefox" -User $User -Action $Action
Здесь
-Execute
указывает на полный путь к исполняемому файлу вашего приложения.
Шаг 2: Запуск задачи
После создания задачи достаточно вызвать её запуск через PowerShell или командную строку:
Start-ScheduledTask -TaskName "RunFirefox"
При успешном выполнении GUI приложения будет запущен на экране удаленной машины, а не в контексте терминального окна SSH.
Особенности и уточнения
-
Права доступа: Убедитесь, что учетная запись, от имени которой создается задача, обладает достаточными правами для запуска приложений в интерактивном режиме рабочего стола.
-
Безопасность: Осуществление подобных действий может повысить риски безопасности, так как предполагается автоматический запуск задач с пользовательскими правами. Настоятельно рекомендуется проверять конфиги запланированных задач и управлять правами доступа к используемым приложениям.
Заключение
Данный метод демонстрирует, как можно обойти ограничения Windows в плане отображения графического интерфейса для удаленно запущенных задач. Хотя это может показаться сложнее, чем в Linux-системах, правильная настройка позволяет достичь запланированного результата. Главное — осознание рисков безопасности и поддержание строгого контроля доступа к конфигурациям системы.