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
>>>
Может быть, выход идет в STDERR, а не в STDOUT?
Попробуйте это в конце вашей системной команды -> «2>&1» .
Например:
FILE * p = popen («g ++ main.cpp -o main», «r»);
Попробуй это:
FILE * p = popen («g ++ main.cpp -o main 2>&1 «,» r «);
Попробуйте заменить _popen на:
FILE *fpipe = _popen(cmd.c_str(),"rt");
Возможно, вам все равно придется полностью указать режим чтения.
А также используйте проверку ошибок, чтобы проверить, сработал ли _popen:
if(fpipe == NULL)
cout<<"Failed to open"<<endl;
Может ли это быть проблемой привилегий? Если netsh dhcp ...
Команда требует привилегий администратора для правильной работы, возможно, проблема в том, что приложение не наследует привилегии администратора при запуске и, следовательно, не может успешно выполнить команду. Конечно, похоже, что в этом случае он должен что-то выводить в STDERR, но я не знаю …
Вы уверены в команде?
Я предполагаю, что вы используете 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.