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

时间:2012-03-01 15:31:41

标签: linux cryptography

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

我可以使用应用程序“textreader”使用我的库(或我的应用程序)从加密文件中读取普通文件吗?我不能根据问题的条款写一些临时文件。

可以使用命名管道(mkfifo),但先决条件是支持搜索。文件必须随机阅读。

如果我没有“textreader”的源代码,有没有人有任何想法可以做到这一点?

4 个答案:

答案 0 :(得分:1)

编写一个替换标准Linux I / O例程的共享库,并load it with LD_PRELOAD

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

另见:

答案 1 :(得分:1)

如何简单地使用stdin?

如果textreader应用程序将hello.txt转换为stdout,只需将textreader的输出传递给您自己的应用程序/脚本。例如:

$ ./textreader | ./myapp

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

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

维基百科也provides some helpful information regarding 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读取一行之外,不会进行缓冲。

答案 2 :(得分:1)

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

答案 3 :(得分:0)

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