1

私は現在 ssh プログラムに取り組んでおり、ネットワーク経由で端末を完全に制御できるようにしたいと考えています。私の質問は、コマンドをサーバーに送信してターミナルで実行する場合、ターミナルが出力する出力を取得するにはどうすればよいですか? コマンドを使用するように言っている多くの投稿を見てきましpopen()たが、私が試したことから、ディレクトリを変更したり、これを使用して他のコマンドを実行したりすることはできませんls.. のようなファイルに送信する以外に、端末から出力を取得する他の方法はありますかcommand > filetoholdcommand。前もって感謝します!

4

2 に答える 2

3

これをコメントとして入れますが、私は新しいので十分な担当者がいません。cd はシェル コマンドに組み込まれているため、system() を使用します。しかし、cd はプロセスに影響を与えません (そのためには chdir() を使用する必要があります)。したがって、本当にやりたいことは、シェルを fork/exec 経由でサブプロセスとして開始し、パイプを stdin と stdout に接続してから、ユーザーセッションまたは接続中にコマンドをパイプします。

次のコードは、一般的な考え方を示しています。基本的で、欠陥があります - 1 つには、usleep() ではなく select() を使用してください。

int argc2;
printf( "Server started - %d\n", getpid() );
char buf[1024] = {0};
int pid;
int pipe_fd_1[2];
int pipe_fd_2[2];
pipe( pipe_fd_1 );
pipe( pipe_fd_2 );

switch ( pid = fork() ) 
{
case -1:
    exit(1);
case 0: /* child */
    close(pipe_fd_1[1]);
    close(pipe_fd_2[0]);
    dup2( pipe_fd_1[0], STDIN_FILENO );
    dup2( pipe_fd_2[1], STDOUT_FILENO );
    execlp("/bin/bash", "bash", NULL);
default: /* parent */
    close(pipe_fd_1[0]);
    close(pipe_fd_2[1]);
    fcntl(pipe_fd_2[0], F_SETFL, fcntl(pipe_fd_2[0], F_GETFL, NULL ) | O_NONBLOCK );
    while(true)
    {
      int r = 0;
      printf( "Enter cmd:\n" );
      r = read( STDIN_FILENO, &buf, 1024 );
      if( r > 1 )
      {
        buf[r] = '\0';
        write(pipe_fd_1[1], &buf, r);
      }
      usleep(100000);
      while( ( r = read( pipe_fd_2[0], &buf, 1024 ) ) > 0 )
      {
        buf[r-1] = '\0';
        printf("%s", buf );
      }
      printf("\n");
    }
}
于 2013-02-10T23:22:01.003 に答える
1

popen」機能が必要です。コマンドを実行ls /etcしてコンソールに出力する例を次に示します。

#include <stdio.h>
#include <stdlib.h>


int main( int argc, char *argv[] )
{

  ファイル *fp;
  int ステータス;
  文字パス[1035];

  /* コマンドを読み取り用に開きます。*/
  fp = popen("/bin/ls /etc/", "r");
  if (fp == NULL) {
    printf("コマンドの実行に失敗しました\n" );
    出口;
  }

  /* 一度に 1 行ずつ出力を読み取り、出力します。*/
  while (fgets(パス, sizeof(パス), fp) != NULL) {
    printf("%s", パス);
  }

  /* 近い */
  pclose(fp);

  0 を返します。
}


于 2013-02-10T20:04:09.113 に答える