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