3

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 シェル (ちなみに、これは 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

4 に答える 4

1

たぶん、出力はSTDOUTではなくSTDERRになりますか?

システムコマンドの最後でこれを試してください -> "2>&1".

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

これを試してください: FILE *p = popen("g++ main.cpp -o main 2>&1", "r");

于 2013-09-24T20:00:16.390 に答える
0

コマンドについてよろしいですか?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 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 サーバー 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 を表示します。

于 2013-09-30T11:22:50.583 に答える
0

_popen を次のものに置き換えてみてください。

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

読み取りモードを完全に指定する必要があるかもしれません。

また、エラー チェックを使用して _popen が機能しているかどうかを確認します。

if(fpipe == NULL)
    cout<<"Failed to open"<<endl;
于 2013-09-23T20:35:18.510 に答える
0

特権の問題だろうか。コマンドが正常に機能するために管理者権限が必要な場合netsh dhcp ...、アプリケーションが実行時に管理者権限を継承せず、コマンドを正常に完了できないことが問題である可能性があります。もちろん、その場合はSTDERRに何かを出力する必要があるようですが、わかりません...

于 2013-09-27T01:04:36.063 に答える