【问题标题】:Linux: write a C program that 'controls' a shellLinux:编写一个“控制”外壳的 C 程序
【发布时间】:2011-06-12 10:47:48
【问题描述】:

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

现在我们要编写一个“控制”外壳的 C 程序,即它本身会为用户提供一个类似外壳的界面,读取用户的输入,将其传递给 /dev/pts/ 上的真实外壳1,让它执行,读取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;
}

以上内容会将您的输入传递给在终端中运行的 shell(在第一个参数中给出其名称)并让 shell 执行它。但是,我现在不知道如何读取 shell 的输出。

有什么建议吗?

【问题讨论】:

  • 您尝试从 tty 读取吗?
  • 这是作业还是rootkit?
  • @Kimvais 在当前的格式中,你必须执行这个程序来通过这个 shell-on-shell 传递命令——你要做的不仅仅是控制一个 shell编写一个rootkit。
  • 为什么要重新实现 Expect?
  • @ glenn: 'expect' 很容易,因为它可以生成它要控制的 shell,因此可以使用 pty_copy 将自己置于 shell 和它的控制终端之间——我不能这样做外壳已经在运行。 (请阅读 Stevens,“Unix 环境中的高级编程”第 19.5 节了解 expect 的工作原理)

标签: c linux shell controls


【解决方案1】:

您可以为此使用pipes。 Linux shell 允许重定向。

我使用管道来控制 tty。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      请查看libpipeline。也许这会对你有所帮助......

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-06-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-09-13
        相关资源
        最近更新 更多