C ++没有popen的输出

时间:2013-09-20 15:53:46

标签: c++ popen dhcp netsh

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 shell中(顺便说一下,这是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
>>>

4 个答案:

答案 0 :(得分:1)

输出可能是STDERR而不是STDOUT?

在系统命令结束时尝试此操作 - &gt; “2&gt;&amp; 1”。

例如:     FILE * p = popen(“g ++ main.cpp -o main”,“r”);

试试这个:     FILE * p = popen(“g ++ main.cpp -o main 2&gt;&amp; 1”,“r”);

答案 1 :(得分:0)

尝试将:_popen替换为:

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

也许您仍需要完全指定读取模式。

并使用错误检查来检查_popen是否有效:

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

答案 2 :(得分:0)

这可能是特权问题吗?如果netsh dhcp ...命令需要管理员权限才能正常工作,可能问题是应用程序在运行时不会继承管理员权限,因此无法成功完成命令。当然,在这种情况下似乎应该向STDERR输出一些内容,但我不知道......

答案 3 :(得分:0)

你确定这个命令吗? 我假设你使用Windows,因为有提到“命令提示” 当我做netsh /?我根本没看到dhcp sub命令。我只看到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 show clients 1 找不到以下命令:dhcp server 192.168.200.15 scope 192.168.16.0 show clients 1。

netsh dhcp服务器192.168.200.15范围192.168.144.0显示客户端1 找不到以下命令:dhcp server 192.168.200.15 scope 192.168.144.0 show clients 1。

netsh dhcp服务器192.168.200.15范围192.168.155.0显示客户端1 找不到以下命令:dhcp server 192.168.200.15 scope 192.168.155.0 show clients 1。

netsh dhcp服务器192.168.200.15范围192.168.200.0显示客户端1 找不到以下命令:dhcp server 192.168.200.15 scope 192.168.200.0 show clients 1。