2016-04-28 20 views
1

私はCでこれをプログラムする方法があることを知っています。何らかの方法でパイプを作っています(私は方法があることを知っています、それだけど)。プログラムAからプログラムBの入力とその逆への出力をリダイレクト

意図した用途は、サーバの出力(netcatを使って取得する)を自分のプログラムに接続することです。このプログラムは出力を処理し、netcatに自身のものを戻します。私はC++(ソケットは謎の存在)に直接接続する手がかりがなく、バニラシステムではコンパイルする必要があるため、インストールを避けたいと思います。

したがって、プログラムの出力を別のプログラムの入力にリダイレクトするためにbashを使用し、第2の出力をbashの最初の入力にリダイレクトする方法はありますか?

+0

netcatのどの実装ですか?いくつかは、あなたがCで行うとしたことを行うことができます。 –

+0

ubuntu 'netcat-openbsd'に付属のものです。それは、代替があると言います。あなたが言うことができるなら、私はとても幸せだろう:) – mjgalindo

答えて

1

netcatの実装では、必要なものがすでに用意されています。あなたは、

ncat -c ``/path/to/client`` service.example.com 1234 

をあなたのnetcatをより最小限である場合:あなたは、あなたが行うことができ、どちらのポート1234

service.example.comに接続し、あなたのnetcatは、nmapのからNCATのようなものであるにしたい、あなたのクライアントが/path/to/clientと呼ばれていると仮定

mkdir pipes 
cd pipes 
mkfifo reverse_pipe 
/path/to/client < reverse_pipe | nc service.example.com 1234 > reverse_pipe 

mkfifo名前付きパイプをファイルシステムに作成する必要があります。ファイルのように見えますが、そうではありません(ls -lを見てみると、そのファイルのモードはpで始まり、通常のファイルは-ではありません)。これはfoo | barのようなものですが、ファイル名を持ち、プロセスによって開かれません。

これを入出力としてプロセスに渡すと、2つのコマンドを手動で(つまり、|などのシェルマジックなしで)接続できます。パイプに書き込まれたデータはファイルシステムには格納されませんが、パイプから読み取るプロセスには使用できます。書き込まれたデータは一度しか読み取られません。これは、シェルからのパイプとまったく同じように動作しますが、ファイルシステムに名前が付いている点が異なります。

+0

デフォルトのnetcatには '-c'オプションがありませんでした。しかし伝統的なことはします。そしてmkfifoメソッドは私が本当に理解していない。私はそのコマンドを知らなかったが、それはファイルを作成するようだ? – mjgalindo

+0

@MJGalram「mkfifo」についていくつかの行を追加しました。 –

+0

私は名前付きパイプとティーの組み合わせを使用して終了しました(画面上の出力を見るために) – mjgalindo

0

Cスタイルのサーバーとクライアントを使用している場合は、次のソケットベースのソリューションを使用して、サーバーからクライアントにデータを転送できます。

解決策は、ホストシステム上で必要なコマンドを実行するためにpopen関数を使用し、ソケットプログラミング用のsendおよびrecvプリミティブを使用してデータをクライアントに転送します。次のように

コードは次のとおりです。

SERVER:

#include "stdio.h" 
#include "stdlib.h" 
#include "sys/socket.h" 
#include "sys/types.h" 
#include "netinet/in.h" 
#include "error.h" 
#include "string.h" 
#include "unistd.h" 
#include "arpa/inet.h" 

#define ERROR -1 
#define MAX_CLIENTS 2 
#define MAX_DATA 1024 


main(int argc, char **argv) 
{ 
    struct sockaddr_in server; 
    struct sockaddr_in client; 
    int sock; 
    int new,i; 
    int sockaddr_len = sizeof(struct sockaddr_in); 
    int data_len; 
    char data[MAX_DATA]; 
    char temp[MAX_DATA]; 


    if((sock = socket(AF_INET, SOCK_STREAM, 0)) == ERROR) 
    { 
     perror("server socket: "); 
     exit(-1); 
    } 

    server.sin_family = AF_INET; 
    server.sin_port = htons(atoi(argv[1])); 
    server.sin_addr.s_addr = INADDR_ANY; 
    bzero(&server.sin_zero, 8); 

    if((bind(sock, (struct sockaddr *)&server, sockaddr_len)) == ERROR) 
    { 
     perror("bind : "); 
     exit(-1); 
    } 

    if((listen(sock, MAX_CLIENTS)) == ERROR) 
    { 
     perror("listen"); 
     exit(-1); 
    } 
    printf("\nThe TCPServer Waiting for client on port %d\n",ntohs(server.sin_port)); 
     fflush(stdout); 

    FILE *fp; 
    char path[1035]; 

    /* Open the command for reading. */ 
    fp = popen("/bin/ls /etc/", "r"); 

    if((new = accept(sock, (struct sockaddr *)&client, &sockaddr_len)) == ERROR) 
    { 
     perror("accept"); 
     exit(-1); 
    } 

    printf("New Client connected from port no %d and IP %s\n", ntohs(client.sin_port), inet_ntoa(client.sin_addr)); 

    data_len = 1; 

    int path_len; 
    while (fgets(path, sizeof(path)-1, fp) != NULL) { 
     path_len = strlen(path); 
     send(new, path, path_len, 0);  
    } 


    printf("Client disconnected\n"); 

    close(new); 

    close(sock); 


} 

CLIENT:

#include "stdlib.h" 
#include "stdio.h" 
#include "string.h" 
#include "unistd.h" 
#include "sys/socket.h" 
#include "sys/types.h" 
#include "netinet/in.h" 
#include "strings.h" 
#include "arpa/inet.h" 


#define BUFFER 1024 


main(int argc, char **argv) 
{ 
    struct sockaddr_in serv; 
    int sock; 
    char in[BUFFER]; 
    char out[BUFFER]; 
    int len; 


    if((sock = socket(AF_INET, SOCK_STREAM, 0)) == -1) 
    { 
     perror("socket"); 
     exit(-1); 
    } 

    serv.sin_family = AF_INET; 
    serv.sin_port = htons(atoi(argv[2])); 
    serv.sin_addr.s_addr = inet_addr(argv[1]); 
    bzero(&serv.sin_zero, 8); 

    printf("\nThe TCPclient %d\n",ntohs(serv.sin_port)); 
     fflush(stdout); 


    if((connect(sock, (struct sockaddr *)&serv, sizeof(struct sockaddr_in))) == -1) 
    { 
     perror("connect"); 
     exit(-1); 
    } 

    len = 1; 
    while(len != 0) { 
     len = recv(sock, out, BUFFER, 0); 
     out[len] = '\0'; 
     printf("Output: %s\n", out); 
    } 

    close(sock); 


} 

サーバーのコードは、コマンドライン引数としてポート番号を受け取り、クライアントがIPアドレスを取得します(localhostでは127.0.0.1)、ポート番号はコマンドライン引数として使用します。

他の言語でサーバーを実行している場合でも、そのサーバーのソケットプリミティブを使用してクライアントファイルにデータを送信することができます。

注:コードはC言語で記述されており、C++でコンパイルするとエラーが発生することがあります。コンパイルエラーを確認してください。

関連する問題