Вопрос или проблема
Я хотел бы запустить графическое приложение на настольном компьютере с Windows 10 через встроенный сервер OpenSSH. Проблема в том, что, похоже, оно не отображает графический интерфейс в правильной сессии пользователя?
Приложение отображается в диспетчере задач, но не рендерится. Я нашел несколько (неуклюжих) обходных путей, которые, как предполагается, работают на Windows 7 и 8, но не совсем то, что работает на Windows 10. Предпочтительно, чтобы это не касалось изменения способа запуска приложения, а изменения того, как SSH-сервер запускает программы.
Я вошел через ssh как пользователь, который также вошел в сеанс рабочего стола на самом компьютере. На Linux вам нужно было бы указать, в каких сессиях X11 приложение должно запускаться, с помощью переменной окружения (например, DISPLAY=:0). Должен ли я делать что-то подобное в Windows, чтобы сказать оболочке, в каком контексте запускать приложение?
Похоже, это не просто
Давайте изобретем еще одно колесо
Сторона сервера
- Прослушивание на порту UDP
- Вызов
ShellExecute(NULL,"open",...)
на полученных пакетах - Способность открывать URL в браузере по умолчанию или запускать графические приложения, например, cmd/Taskmgr/mmc, которые просто всплывают на экране, все Linux_Xorg_SSH_DISPLAY=:0’ish
“Это работает на моем компьютере.”Работает на Microsoft Windows [Версия 10.0.19042.746]- Аутентификация не реализована
- Не проверяется, что содержится в UDP-пакете или является ли он действительным для ShellExecute()
Сторона клиента
- Отправить UDP-пакет для выполнения сервером
- Сохранить IP-адрес сервера, указанный в argv, чтобы вы могли опустить его в следующий раз
Если служба OpenSSH в Windows не запущена, вы можете запустить ее от имени нужного пользователя. Для этого подойдет скрипт запуска.
Создайте ключи SSH пользователя в Windows (обычно вы это делаете):
ssh-keygen
Примите расположение по умолчанию. Я протестировал его без парольной фразы.
Запустите OpenSSH, используя закрытый ключ пользователя в качестве ключа хоста:
start /min %SYSTEMROOT%\System32\OpenSSH\sshd -h %HOMEDRIVE%%HOMEPATH%\.ssh\id_rsa
Вы можете создать однострочный sshd.bat с вышеуказанным и связать его с shell:startup.
Ответ или решение
Запуск GUI приложения через OpenSSH на Windows 10 может показаться сложной задачей, так как стандартная реализация OpenSSH не поддерживает перехват графического контекста, необходимого для отображения интерфейсов GUI в сеансе рабочего стола. Однако, это можно осуществить, следуя нескольким ключевым шагам, о которых мы подробно поговорим.
Основные Шаги
-
Подготовка Окружения SSH
Убедитесь, что на вашем компьютере установлены и правильно настроены сервер OpenSSH и клиент SSH. Вы можете проверить их установку, выполнив командуssh -V
в командной строке. Если она успешно возвращает версию, то сервер установлен, и вы готовы к следующему шагу. -
Настройка SSH Доступа и Ключей
Вам нужно создать SSH ключи для аутентификации. В командной строке выполните следующую команду:ssh-keygen
Принять параметры по умолчанию, включая отсутствие пароля. После этого скопируйте публичный ключ в файл
authorized_keys
пользователя, под которым вы будете входить через SSH. -
Запуск OpenSSH-сервера
Убедитесь, что служба OpenSSH запущена. Вы можете запустить ее через PowerShell или командную строку, используя следующую команду:Start-Service sshd
Для удобства вы можете создать батник, который будет запускать сервер, и добавить его в папку автозагрузки (
shell:startup
). -
Запуск GUI Приложений
Чтобы GUI приложение запустилось корректно, вам нужно будет следовать определенной процедуре, так как Windows не предоставляет простой способ указания сеанса для GUI приложений через SSH.Варианты Решений
-
Использование PowerShell
Воспользуйтесь PowerShell для запуска нужного приложения. Запустите OpenSSH и используйте команду:Start-Process "C:\Path\To\YourApp.exe"
Это должно запустить приложение в вашем активном сеансе рабочего стола.
-
Использование Ntexec
Если у вас возникли трудности с вышеуказанным методом, вы можете рассмотреть использование стороннего инструмента, такого как ntexec. Этот инструмент позволяет запускать GUI приложения через UDP пакеты, что может упростить задачу запуска и управления.
Пример базовой конфигурации для сервера может выглядеть так:
// Слушаем UDP порт и выполняем команду ShellExecute(NULL, "open", "C:\\Path\\To\\YourApp.exe", NULL, NULL, SW_SHOWNORMAL);
Обратите внимание, что эта реализация требует дополнительной защиты и аутентификации для обеспечения безопасности.
-
Заключение
Работа с GUI приложениями через OpenSSH на Windows 10 требует понимания особенностей системы и использования дополнительных инструментов. Использование PowerShell в сочетании с OpenSSH может быть наиболее простым решением, однако, если вам требуется более сложный функционал, такие инструменты как ntexec могут оказаться полезными.
Рекомендации
- Безопасность: Убедитесь, что при использовании UDP пакетов вы учитываете безопасность ваших данных, поскольку оставлять открытыми порты без надлежащей защиты может привести к серьезным проблемам.
- Тестирование: Прежде чем развертывать передовые методы в продакшене, проведите тестирование на локальных системах.
Следуя этим рекомендациям, вы сможете успешно решить проблему запуска GUI приложений через OpenSSH на Windows 10, оптимизировав свой рабочий процесс и повысив общую эффективность.