【发布时间】: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 > out.txt"是否在相应文件中产生输出? -
@t7bdh3hdhb out.txt 文件被创建,但它是空的。大小为零字节。