C ++ Нет вывода из попен

tl; dr — Невозможно записать выходные данные команд, использующих RPC, на удаленный сервер с использованием любого языка программирования, который я пробую, хотя эти команды выводятся обратно в командную строку при вводе вручную

У меня есть функция, которая использует fpipe для выдачи команды netsh для отображения статистики с нашего DHCP-сервера. Я делаю эту же технику чтения буфера fpipe в другом месте в моей программе, и она отлично работает, но здесь я не получаю никакого вывода:

РЕДАКТИРОВАТЬ: Я упрощаю свой код до более проверенного фрагмента кода. На самом деле это всеобъемлющий исходный файл .cpp, который все еще повторяет проблему.

#include <iostream>
#include <string>
#include <stdio.h>  // for _popen() and _pclose()
using namespace std;

int main()
{
char buff[512];
buff[0]=0;
string cmd="netsh dhcp server 192.168.200.15 scope 192.168.200.0 show clients 1";
FILE *fpipe = _popen(cmd.c_str(),"r");
if(fpipe==NULL) cout<<"Failed to open"<<endl; else cout<<"Opened pipe successfully";
while(fgets(buff,sizeof(buff),fpipe)!=NULL) cout<<buff<<endl;
_pclose(fpipe);
}

Единственный вывод, который я получаю:

Opened pipe successfully

Но если я скопирую / вставлю эту команду в другое окно командной строки, она будет работать нормально и сразу выпадет много строк.

Так, куда это идет? Почему в мой буфер ничего не попадает?

Кроме того, изменение строки «cmd» с netsh на команду «dir» будет успешно выводить вывод dir.

РЕДАКТИРОВАТЬ: Четное system(cmd.c_str()); не дает мне никакого выхода!

РЕДАКТИРОВАТЬЛюбопытно, cmd="netsh dump"; на самом деле выводит нормально, но все же cmd="netsh dhcp server... не. Что-то странное с тем, как CMD направляет netsh текст или … что-то? За пределами моей зоны комфорта здесь.

РЕДАКТИРОВАТЬЭто очевидно проблема вне C ++, потому что, когда я нахожусь в оболочке Python 2.7 (это, кстати, 64-разрядная версия Windows 7), я пытаюсь это:

>>> import subprocess
>>> subprocess.call('dir', shell=True)
Volume in drive C has no label.
Volume Serial Number is 2E2B-B34F

Directory of C:\MyDir

09/30/2013 01:24 PM  <DIR>       .
09/30/2013 01:24 PM  <DIR>       ..
09/20/2013 10:11 AM          45  test.txt
1 File(s)       45 bytes
2 Dir(s)   162,260,246,528 bytes free
0
>>> subprocess.call('netsh dhcp server 192.168.200.15 scope 192.168.200.0 show clients 1', shell=True)
0
>>>

3

Решение

Может быть, выход идет в STDERR, а не в STDOUT?

Попробуйте это в конце вашей системной команды -> «2>&1» .

Например:
FILE * p = popen («g ++ main.cpp -o main», «r»);

Попробуй это:
FILE * p = popen («g ++ main.cpp -o main 2>&1 «,» r «);

1

Другие решения

Попробуйте заменить _popen на:

FILE *fpipe = _popen(cmd.c_str(),"rt");

Возможно, вам все равно придется полностью указать режим чтения.

А также используйте проверку ошибок, чтобы проверить, сработал ли _popen:

if(fpipe == NULL)
cout<<"Failed to open"<<endl;
0

Может ли это быть проблемой привилегий? Если netsh dhcp ... Команда требует привилегий администратора для правильной работы, возможно, проблема в том, что приложение не наследует привилегии администратора при запуске и, следовательно, не может успешно выполнить команду. Конечно, похоже, что в этом случае он должен что-то выводить в STDERR, но я не знаю …

0

Вы уверены в команде?
Я предполагаю, что вы используете Windows, так как когда я делаю netsh /? Я вообще не вижу подкоманды dhcp. Я вижу только dhcpclient. Даже с этой неправильной командой (я полагаю) я получаю вывод, что подкоманда недоступна. Вот код, я использую Cygwin. следовательно функции _p * заменяются функциями p *.

#include <iostream>
#include <vector>
#include <string>
using std::cout;
using std::endl;
using std::string;
using std::vector;

#include <stdio.h>

int main(int argc, char* argv[])
{
cout<<"Entered DHCPLookup() function"<<endl;
vector<string> scopes;
scopes.push_back("192.168.16.0");
scopes.push_back("192.168.144.0");
// some scopes omitted here
scopes.push_back("192.168.155.0");
scopes.push_back("192.168.200.0");
char buff[512];
for(int x=0;x<scopes.size();x++)
{
buff[0]=0;
string cmd="netsh dhcp server 192.168.200.15 scope "+scopes[x]+" show clients 1";
cout<<cmd<<endl;
FILE *fpipe = popen(cmd.c_str(),"r");
while(fgets(buff,sizeof(buff),fpipe)!=NULL) cout<<buff<<endl;
pclose(fpipe);
}
}

Вот вывод

Введена функция DHCPLookup ()
netsh dhcp server 192.168.200.15 scope 192.168.16.0 показать клиентов 1
Не найдена следующая команда: dhcp server 192.168.200.15 scope 192.168.16.0 показать клиентов 1.

netsh dhcp server 192.168.200.15 scope 192.168.144.0 показать клиентов 1
Не найдена следующая команда: dhcp server 192.168.200.15 scope 192.168.144.0 показать клиентов 1.

netsh dhcp server 192.168.200.15 область действия 192.168.155.0 показать клиентов 1
Не найдена следующая команда: dhcp server 192.168.200.15 scope 192.168.155.0 показать клиентов 1.

netsh dhcp server 192.168.200.15 область действия 192.168.200.0 показать клиентов 1
Не найдена следующая команда: dhcp server 192.168.200.15 scope 192.168.200.0 показать клиентов 1.

0
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector