1

我目前正在开发一个 ssh 程序,我希望能够通过网络完全控制终端。我的问题是,如果我向服务器发送命令以在终端中运行,我如何获得终端打印的输出?我看过很多帖子说要使用该popen()命令,但从我尝试过的内容来看,我无法更改目录并使用它执行其他命令,只能使用简单的东西,例如ls. 除了将其发送到类似command > filetoholdcommand. 提前致谢!

4

2 回答 2

3

我会把它作为评论,但我没有足够的代表,因为我是新人。cd 是一个内置的 shell 命令,所以你想使用 system()。但是 cd 对你的进程没有影响(你必须使用 chdir(),为此),所以你真正想要做的是通过 fork/exec 将 shell 作为子进程启动,将管道连接到它的 stdin 和 stdout,然后在用户会话或连接期间通过管道传输命令。

以下代码给出了总体思路。基本的和有缺陷的 - 使用 select() 而不是 usleep() 。

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;
  整数状态;
  字符路径[1035];

  /* 打开命令进行读取。*/
  fp = popen("/bin/ls /etc/", "r");
  如果(fp == NULL){
    printf("运行命令失败\n");
    出口;
  }

  /* 一次读取一行输出 - 输出它。*/
  而(fgets(路径,sizeof(路径),fp)!= NULL){
    printf("%s", 路径);
  }

  /* 关 */
  关闭(fp);

  返回0;
}


于 2013-02-10T20:04:09.113 回答