Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux:编写一个C程序';控件';贝壳_C_Linux_Shell_Controls - Fatal编程技术网

Linux:编写一个C程序';控件';贝壳

Linux:编写一个C程序';控件';贝壳,c,linux,shell,controls,C,Linux,Shell,Controls,假设我们在终端上运行一个shell,比如说,/dev/pts/1。shell已在运行,无法重新启动 现在我们想编写一个C程序来“控制”shell,也就是说,它本身将向用户提供一个类似shell的接口,读取用户的输入,将其传递到/dev/pts/1上的真实shell,让它执行它,读取shell的输出并将其打印回用户 我知道如何完成这项任务的一半:我知道如何收集用户的输入,并将这些输入注入到“真正的shell”中: #include <fcntl.h> #include <sys/

假设我们在终端上运行一个shell,比如说,/dev/pts/1。shell已在运行,无法重新启动

现在我们想编写一个C程序来“控制”shell,也就是说,它本身将向用户提供一个类似shell的接口,读取用户的输入,将其传递到/dev/pts/1上的真实shell,让它执行它,读取shell的输出并将其打印回用户

我知道如何完成这项任务的一半:我知道如何收集用户的输入,并将这些输入注入到“真正的shell”中:

#include <fcntl.h>
#include <sys/ioctl.h>
#include <stdio.h>

#define SIZE 100

int main(int argc, char** argv)
{
if( argc>1 )
  {
  int tty = open( argv[1], O_WRONLY|O_NONBLOCK);

  if( tty!=-1 )
    {
    char *buf,buffer[SIZE+1];

    while(1)
      {
      printf("> ");
      fgets( buffer, SIZE, stdin );
      if( buffer[0]=='q' && buffer[1]=='u' && buffer[2]=='i' && buffer[3]=='t' ) break;
      for(buf=buffer; *buf!='\0'; buf++ ) ioctl(tty, TIOCSTI, buf);
      }

    close(tty);
    }
  else printf("Failed to open terminal %s\n", argv[1]);
  }

return 0;
}
#包括
#包括
#包括
#定义大小100
int main(int argc,字符**argv)
{
如果(argc>1)
{
int tty=打开(argv[1],O_WRONLY | O_NONBLOCK);
如果(tty!=-1)
{
char*buf,缓冲区[SIZE+1];
而(1)
{
printf(“>”);
fgets(缓冲区、大小、标准输入);
如果(缓冲区[0]=='q'和缓冲区[1]='u'和缓冲区[2]='i'和缓冲区[3]='t')中断;
对于(buf=buffer;*buf!='\0';buf++)ioctl(tty,TIOCSTI,buf);
}
关闭(tty);
}
else printf(“未能打开终端%s\n”,argv[1]);
}
返回0;
}
上面的代码将把您的输入传递给在终端中运行的shell(在第一个参数中给出它的名称),并让shell执行它。但是,我现在不知道如何读取shell的输出


有什么建议吗?

请看。也许这会帮助您……

有一些程序允许您更改进程的控制终端:有两个这样的程序

但是,我确实相信它们会切断另一个终端,因此根据您的需要,这可能完全适合,也可能不适合。

您可以使用它。Linux shell允许重定向


我用管道控制tty。

你试过从tty上阅读吗?这是家庭作业还是rootkit?@Kimvais的当前格式,你必须执行这个程序才能在shell上通过这个shell传递命令-你需要做的不仅仅是简单地控制一个shell来编写rootkit。你为什么要重新实现Expect?@glenn:“Expect”很简单,因为它可以生成它将要控制的shell,因此可以使用pty_copy将自己放在shell和它的控制终端之间——这是我无法做到的,因为shell已经在运行。(阅读史蒂文斯的《Unix环境中的高级编程》第19.5节,了解expect的工作原理)