Выполнить команду / скрипт в Windows 10 удаленно с компьютера Linux

4628
ThisGuy

Моя цель - запустить простой скрипт AutoHotKey на компьютере с Windows 10 с хоста Ubuntu в той же частной сети. После поиска в Google я нашел winexe, который звучал так, как будто он мог делать то, что я хочу, но после многих испытаний мне не удалось подключить его к Windows 10 («Не удалось открыть соединение - NT_STATUS_CONNECTION_RESET», дальнейшее поиск в Google не помогло). В качестве второго решения я установил SSH-сервер на Windows-машине (Bitvise SSH Server). Теперь я могу войти из Ubuntu через ssh в Windows или просто запустить команды на компьютере с Windows:

$ ssh user@windowsmachine command 

Это работает для обычных команд, таких как DIR, MKDIR, ... но не работает для скриптов AutoHotKey. Например, с

$ ssh user@windowsmachine 'C:\path\to\script.ahk' 

на компьютере с Windows ничего не происходит (запускается локально, этот тестовый скрипт просто показывает окно приветствия). Следующие попытки также не работают:

$ ssh user@windowsmachine '"C:\Program Files\AutoHotkey\AutoHotkey.exe" C:\path\to\script.ahk' $ ssh user@windowsmachine 'cmd.exe /c C:\path\to\script.ahk' 

ОБНОВЛЕНИЕ: уловка почти работает. Например, он запускает calc.exe:

$ ssh user@windowsmachine calc.exe 

Но если я запускаю notepad.exe или любое другое приложение, я вижу их в диспетчере задач, работающем как фоновые процессы, без графического интерфейса. (Я не знаю, wjat настолько специфичен для calc. Exe, что он работает нормально). Мне также удалось исправить проблему с winexe, но ситуация абсолютно такая же, как с ssh - кроме calc.exe, все приложения с графическим интерфейсом запускаются как фоновые процессы. Эта проблема обсуждается здесь . Итак, суть в том, что для запуска приложений с графическим интерфейсом в Windows 10 с хоста Linux требуются огромные усилия. Поэтому я просто написал свое собственное маленькое клиент-серверное приложение в Qt 5, которое прослушивает определенный порт и запускает соответствующие приложения / сценарии, когда пользовательская команда получена от другого хоста.

0
Не знаете точно, что делают ваши скрипты, но может ли быть так, что первый тестовый скрипт не работал, потому что это было графическое приложение? Соединения Linux-Linux SSH должны сначала выполнить команду "export display =: 0", чтобы правильно запустить приложение графического интерфейса на удаленном экране. Blaine 6 лет назад 0
Да, ahk-скрипт работает с графикой (всплывающее окно с сообщением). Но «экспорт DISPLAY =: 0» не помог. ThisGuy 6 лет назад 0
Чтобы было ясно: я хочу, чтобы окно сообщения всплыло в машине Windows, а не в Linux;) ThisGuy 6 лет назад 0
Хорошо, трюк работает, но очень избирательно. Нет проблем с запуском calc.exe ThisGuy 6 лет назад 0
интересно ... да, команда экспорта в основном означает "запустить эту оболочку под дисплеем удаленной машины". Не могу понять, почему это не будет работать со сценарием, хотя ... Blaine 6 лет назад 0
Вы пытались поместить эти точные команды в окно запуска Windows, чтобы убедиться, что они действительно работают на локальном компьютере? (правильный синтаксис и еще много чего) Blaine 6 лет назад 0
Конечно, например, notepad.exe и calc.exe обычно запускаются из окна запуска Windows (Win + R), но только calc.exe удается нормально запустить через ssh, в то время как notepad.exe запускается только как фоновое приложение через ssh ( GUI не видно). ThisGuy 6 лет назад 0
странно. Ну, по крайней мере, это дает вам гораздо более узкую проблему для повторного поиска Blaine 6 лет назад 0
Мне удалось исправить проблему с winexe, но ситуация абсолютно такая же, как и с ssh - за исключением calc.exe, все приложения с графическим интерфейсом запускаются как фоновые процессы. Вот аналогичная проблема: https://serverfault.com/questions/501539/use-winexe-to-start-a-windows-process. Итак, суть в том, что вряд ли возможно запустить приложение с графическим интерфейсом через winexe ... ThisGuy 6 лет назад 0

1 ответ на вопрос

1
hanjo

Windows использует сеансы для отображения приложений с графическим интерфейсом для пользователей. Ваш ssh-сервер, вероятно, является службой Windows, запущенной пользователем SYSTEM в сеансе 0, который не имеет графического отображения. Таким образом, вы не увидите GUI приложений, которые вы запускаете.

Вы можете проверить это с помощью Sysinternals Process Explorer . После его запуска (от имени администратора) щелкните правой кнопкой мыши панель столбцов, нажмите «выбрать столбцы» и добавьте «Сеанс», «Доступ к пользовательскому интерфейсу», «Имя пользователя» и «Уровень целостности». Эта информация покажет вам для каждого процесса, в каком контексте это приложение выполняется («Сеанс»), показывает ли оно окно («Доступ к пользовательскому интерфейсу»), под какой учетной записью выполняется («Имя пользователя») и с какими разрешениями ( «Уровень целостности», высокий означает как администратор ).

Теперь, если вы хотите выполнить приложение с SSH - сервера в сеансе пользователя, вы можете сделать это с другой утилитой Sysinternals, которая называется PsExec : psexec -i <session number> -accepteula <application to execute>. Если вы хотите, чтобы процесс запускался с вашим обычным пользователем, вы также можете использовать этот параметр, -uи при желании вы можете лишить права доступа -l. Проверьте справку работает psexec -?.

Чтобы узнать номер вашей сессии, вы также можете запустить команду qwinsta. Таким образом, вам не нужно приложение GUI Process Explorer.

Например, чтобы запустить калькулятор, выполните следующее: В сеансе ssh запустите qwinsta, что должно дать вам что-то похожее на это:

C:\>qwinsta SESSIONNAME USERNAME ID STATE TYPE DEVICE services 0 Disc console john.doe 1 Active 

Итак, ваша сессия, которую вы хотели бы использовать, 1в этом примере (она может отличаться для вас). Затем выполните psexec -i 1 -accepteula calc.exe. Теперь калькулятор должен появиться на вашем рабочем столе. ( -accepteulaАбсолютно необходимо при первом запуске приложения. Без этого приложение покажет вам лицензионное соглашение в окне графического интерфейса пользователя, которое, разумеется, не будет отображаться по указанным выше причинам. При последующих вызовах Вы можете игнорировать этот параметр, так как после принятия окно GUI больше не будет отображаться)

Если вы добавите к своей autohotkey.exeкоманде префикс, psexecкак описано выше, я ожидаю, что скрипт будет работать, но я не могу проверить это сам, так как я не знаю это приложение.

Похожие вопросы