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