【问题标题】:C++ No output from popenC ++没有来自popen的输出
【发布时间】:2013-09-20 15:53:45
【问题描述】:

tl;dr - 无法使用我尝试的任何编程语言将使用 RPC 的命令的输出捕获到远程服务器,即使这些命令在手动输入时会输出回命令提示符

我有一个函数,它使用 fpipe 发出 netsh 命令来显示来自我们的 DHCP 服务器的统计信息。我在程序的其他地方使用了同样的 fpipe 缓冲区读取技术,它工作正常,但在这里我根本没有得到任何输出:

编辑:我正在将我的代码简化为更具有概念验证的类型 sn-p。它实际上是一个包罗万象的 .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
>>>

【问题讨论】:

  • 这里有一些东西要检查。netsh 需要 root 权限吗?您是否以适当的权限运行您的程序?用户?权限?用 /path/netsh 替换 netsh 怎么样?您的 PATH 和 LIBPATH 环境是否为 cmd 正确设置?
  • 不,我可以在非管理 cmd 提示符下正常运行 netsh,并且无论如何在提升的 cmd 提示符下运行 C++ 程序。如果路径变量设置不正确,我会在 STDOUT 或 STDERR 中看到错误输出......加上其他 netsh 命令(netsh dump)也正常输出。只是“netsh dhcp ...”不起作用。
  • string cmd="netsh dhcp server 192.168.200.15 scope "+scopes[x]+" show clients 1 &gt; out.txt" 是否在相应文件中产生输出?
  • @t7bdh3hdhb out.txt 文件被创建,但它是空的。大小为零字节。

标签: c++ popen dhcp netsh


【解决方案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");

【讨论】:

  • 不,这并没有改变任何东西。不过猜的不错。
【解决方案2】:

尝试将您的 _popen 替换为:

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

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

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

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

【讨论】:

  • 输出没有变化。我也没有收到“无法打开”消息,所以看起来 fpipe 变量得到了一些东西。可能只是格式化输出的空白,而不是通过 RPC 从 DHCP 服务器检索到的 netsh 数据显示在命令窗口中。
【解决方案3】:

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

【讨论】:

  • 我可以在普通的非管理员用户帐户的 CMD 提示符下运行 netsh 命令就好了。此外,无论如何,我通常使用提升的命令提示符编译和运行 C++ 程序。所以不是这样。
【解决方案4】:

您确定该命令吗? 我假设您使用的是 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 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。

【讨论】:

  • 命令绝对没问题;如前所述,当我将命令复制/粘贴到单独的命令提示符窗口中时,它可以正常执行并用 DHCP 客户端信息填充我的屏幕。您的网络上可能没有 IP 为 192.168.200.15 的 DHCP 服务器,所以这可能就是您收到该错误的原因。
  • 同意!但是你能看一下程序吗,它可以执行命令并打印输出。
  • 我只是在这里试了一下,得到了相同的输出(也就是说,除了通过 "cout 查看它在哪个命令上之外没有输出
猜你喜欢
  • 2021-04-01
  • 1970-01-01
  • 2011-08-12
  • 1970-01-01
  • 1970-01-01
  • 2012-05-26
  • 2013-11-27
  • 2013-04-20
  • 1970-01-01
相关资源
最近更新 更多