我目前正在开发一个ssh程序,我希望能够通过网络完全控制终端。我的问题是,如果我向服务器发送命令以在终端中运行,我如何获得终端打印的输出?我看过许多帖子说要使用popen()
命令但是从我尝试过的内容中我无法更改目录并使用此命令执行其他命令,只有ls
这样的简单事项。除了将其发送到command > filetoholdcommand
之类的文件之外,还有其他方法可以从终端获取输出。提前谢谢!
答案 0 :(得分: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");
}
}