Как программно смоделировать взаимодействие с консолью? - PullRequest
0 голосов
/ 27 марта 2012

Я хочу знать, как программно выполнять команды (например, «dir C: \» или «shutdown -r» и т. Д.) В командной строке Windows (CMD) и получать полученный результат, не отображая черное окно CMDконечно.

Я подозреваю, -> эта ссылка <- </a> содержит список необходимых API, но я не уверен, какие из них выбрать, поэтому нужна ваша помощь.

В основном это то, для чего мне это нужно: я хочу написать простое клиент-серверное приложение (WinSock), в котором пользователь может сидеть на стороне клиента и выполнять команды (и читать ответы) в командной строке сервера.Да, точно так же, как работает Telnet, но без Telnet, только Win32 API.

Предположим, пользователь хочет выполнить команду "dir" на сервере.Он вводит «dir» в клиентское приложение, которое отправляет запрос серверному приложению, где команда будет выполнена (как если бы она была физически введена в командной строке сервера), и текст вывода будет отправлен обратно клиентскому приложению.

Ответы [ 2 ]

3 голосов
/ 27 марта 2012

В основном вы пытаетесь переопределить одно из многих возможных применений netcat .Запустив систему Windows в командной строке:

nc -l -L -e cmd -p 5555

, а затем запустив ее из другой системы

nc 192.168.1.xxx 5555

, где 192.168.1.xxx является IP-адресом машины Windows, которую вы можете сделатьименно то, о чем вы говорите: все, что вы наберете, будет «набрано» на машине Windows, и вы получите вывод от удаленно выполняемых команд.Вы также можете запустить netcat в скрытом окне.

Обратите внимание, что из-за этой функции некоторые антивирусы блокируют программу netcat ... она, очевидно, использовалась вредоносным программным обеспечением для преобразования ПК жертв в подчиненных ботов.

Обратите также внимание, что маршрутизация ввода / вывода непосредственно на cmd (оболочка XP) чрезвычайно опасна, поскольку отсутствует аутентификация любого типа: любой может подключиться к порту 5555 и выполнить команды намашина, то, что вы действительно не хотите допустить, если не находитесь в очень контролируемой среде.

0 голосов
/ 27 марта 2012

Хотя этот ответ не подходит для портативного программного обеспечения, он работает именно так, как вам нужно, если вы уверены, что все в порядке:

int system(const char *command);

Эта функция выполняет command в оболочке (CMDв windows), если доступно.

Под словом «если все хорошо» я имею в виду, что у вас есть оболочка в вашей ОС, и она доступна для вас.Как правило, это должно быть верно для окон.

Если вы вызываете его с помощью NULL, он будет отличен от нуля, если доступна оболочка.Если вы даете фактическую команду, она либо возвращает -1, указывая на ошибку (например, не удалось запустить процесс), либо возвращает статус команды, которая должна зависеть от ОС.Возможно, что вас больше всего беспокоит, так это «если команда завершилась неудачно», и вы должны быть хороши, проверив возвращаемое значение против 0 (0 - это хорошо).

Обратите внимание, что для получения выходных данных команды, ивам нужно где-то сохранить вывод.Например, выполните команду dir следующим образом:

error = system("dir > temp.txt 2>&1");

и затем получите ее вывод из temp.txt.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...