如何在Linux中这样做,以便在读取文件时,当前应用程序从另一个应用程序接收数据



假设我有一个文件"hello.txt",其中包含文本"hello,world!"我有一个应用程序"textreader",它读取文件hello.txt并将其放入stdout。接下来,我对文件"hello.txt"进行了加密。可以通过一个特殊的库对其进行解密,该库可以逐字节读取文件。

如何使用应用程序"textreader"将加密文件作为普通文件读取,使用我的库(或应用程序)?根据这个问题的条件,我不能写一些临时文件。

可以使用命名管道(mkfifo),但前提条件是寻求支持。文件必须随机读取。

如果我没有"文本阅读器"的源代码,有人知道我该怎么做吗?

编写一个替换标准Linux I/O例程的共享库,并用LD_PRELOAD加载它。

如果应用程序动态链接到C库,这将起作用——如果"textreader"直接进行系统调用,那么拦截将不起作用。

另请参阅:

  • http://www.linuxjournal.com/article/7795
  • http://lca2009.linux.org.au/slides/172.pdf

通常这是使用文件系统过滤器驱动程序来完成的,该驱动程序将动态执行解密。为了支持随机搜索,你必须在独立的块(64-256Kb大)中加密数据,并以解密的形式将这些块缓存在内存中。这不是一项琐碎的任务,但可以完成。我不知道如何在Linux上实现过滤器驱动程序(我们为Windows提供了类似的产品)。

简单地使用stdin怎么样?

如果textreader应用程序将hello.txt转换为stdout,只需将textreader的输出通过管道传输到您自己的应用程序/脚本即可。例如:

$ ./textreader | ./myapp

根据您决定在应用程序中使用的语言,您可以像处理大多数流一样处理stdin。

以下SO答案应该会为您提供更多关于如何用不同语言从stdin读取的信息:

  • Python:如何在Python中读取stdin
  • C++:如何从C中的cin读取EOF++
  • PHP:使用php://stdinI/O流

维基百科还提供了一些关于stdin的有用信息。

编辑:正如您最初询问的那样,大多数流都是可查找的。我用C++写了一个小例子,展示了如何查找stdin

#include <iostream>
int main(void) {
    int i = 0;
    std::string buffer;
    while (not std::cin.eof()) {
        std::getline(std::cin, buffer);
        if (buffer.find("while") != std::string::npos)
            if (i < 10)
                std::cin.seekg(0, std::ios::beg);
            else
                std::cin.seekg(0, std::ios::end);
        std::cout << "Line " << i++ << ": " << buffer << std::endl;
    }
return 0;
}   

您可以使用g++ test.cpp -o test编译代码,然后使用./test < test.cpp运行它。代码将两次输出文件的开头,直到while循环的开头。除了一次从stdin读取一行之外,不进行任何缓冲。

在内存中加载加密文件并从内存缓冲区解密如何?一些脚本语言,如perl、python等,可以读取整个文件并将其分配给变量

相关内容

最新更新