2013-09-20 2 views
3

Т.Л., др - не может захватить выход из команд, которые используют RPC к удаленному серверу, используя любой язык программирования, я стараюсь, даже если эти команды вывода обратно в командную строку при вводе вручнуюC++ Нет сигнала на выходе из POPEN

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

EDIT: Я упростить мой код более чек, подтверждающий факт концепт типа фрагмент. Это на самом деле всеохватывающий исходный файл .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.

EDIT: Даже system(cmd.c_str()); не дает мне выхода!

EDIT: Любопытно, что cmd="netsh dump"; фактически выводит хорошо, но до сих пор cmd="netsh dhcp server... нет. Что-то странное в том, как CMD трассирует netsh текст или ... что-то? Вне моей зоны комфорта здесь.

EDIT: Это, очевидно, проблема вне C++, потому что, когда я нахожусь в Python 2.7 оболочки (это для Windows 7 64-бит, кстати), я стараюсь это:

>>> 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 
>>> 
+0

Вот что нужно проверить. Нужна ли вам привилегии root? И выполняете ли вы свою программу с соответствующими привилегиями? Пользователь? Права доступа? Как насчет замены netsh на/path/netsh? Правильно ли настроены ваши среды PATH и LIBPATH для cmd? – Bitdiot

+0

Нет, я могу нормально запускать netsh с приглашением неадминистративного CMD и в любом случае запускать программу на C++ в расширенном приглашении cmd. Если переменные пути не были настроены правильно, я бы увидел, что вывод ошибки в STDOUT или STDERR ... плюс также другая команда netsh (netsh dump) действительно выводила нормально. Просто «netsh dhcp ...» не работает. – armani

+0

does 'string cmd =" ​​netsh dhcp server 192.168.200.15 scope "+ scopes [x] +" show clients 1> out.txt "' производить вывод в соответствующем файле? – t7bdh3hdhb

ответ

0

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

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

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

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

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

Без изменений в выходе. Я также не получаю сообщение «Сбой при открытии», поэтому он выглядит как переменная fpipe получает что-то. Возможно, это просто пробелы, выданные для форматирования, но не данные netsh, которые извлекаются с сервера DHCP через RPC для отображения в окне команд. – armani

1

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

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

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

Попробуйте следующее: FILE * p = popen ("g ++ main.cpp -o main 2> & 1", "r");

+0

Нет, это ничего не меняло. Впрочем, догадайтесь. – armani

0

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

+0

Я могу запустить команду netsh в обычной учетной записи CMD обычной учетной записи пользователя без полномочий администратора. Кроме того, я обычно компилирую и запускаю программу на C++ с расширенной командной строкой. Вот и все. – armani

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 192.168.200.15 Объем 192.168.16.0 показать клиентам 1 Следующая команда не найдена: DHCP-сервер 192.168.200.15 сферу 192,168. 16.0 показаны клиенты 1.

Netsh DHCP-сервер 192.168.200.15 Объем 192.168.144.0 показать клиентам 1 следующая команда не была найдена: DHCP-сервер 192.168.200.15 сфера 192.168.144.0 показать клиенты 1.

Netsh DHCP сервер 192.168.200.15 сфера 192.168.155.0 показать клиентам 1 Следующая команда не найдена: сервер DHCP 192.168.200.15 область применения 192.168.155.0 показать клиенты 1.

Netsh сервера DHCP 192.168.200.15 объем 192.168. 200.0 показать клиентов 1 Следующая команда не была найдена: сервер dhcp 192.168.200.15 scope 192.168.200.0 show clients 1.

+0

Команда, безусловно, прекрасна; Как уже упоминалось, когда я копирую/вставляю команду в отдельное окно командной строки, она выполняет штраф и заполняет мой экран информацией о клиенте DHCP. Вероятно, у вас нет DHCP-сервера в сети с IP 192.168.200.15, поэтому, вероятно, вы получаете эту ошибку. – armani

+0

Согласен! Но можете ли вы взглянуть на программу, она может выполнить команду и распечатать вывод. – user917279

+0

Я просто попробовал его здесь и получил тот же результат (т. Е. Не выводил, кроме как видеть, какая команда находится через «cout << cmd << endl» – armani