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
>>>
也许输出将发送到 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 ,因为提到了"命令提示符"当我做一个网/?我根本没有看到 dhcp 子命令。我只看到 dhcpclient .即使使用这个错误的命令(我想),我也得到一个输出,即sub命令不可用。这是代码,我使用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 作用域 192.168.200.0 显示客户端 1。