Linux 程序能够从终端下的 STDOUT 读取

问题描述 投票:0回答:2

看起来Linux下可以从文件描述符1读取。 我在下面附上了示例代码。 我可以使用键盘与其交互并提供有效的密码。

问题是,如果没有用户参与,我无法执行它。例如:

echo "123" | ./stdout_as_stdin
./stdout_as_stdin < <(echo "123")

当我换线时:

read(1, buff, buff_size-2); // reading from STDOUT

read(0, buff, buff_size-2); // reading from STDIN

输入重定向工作正常。

如何在描述的场景中无需用户参与而从其他 bash/python 脚本执行程序交互?

#include <stdio.h>
#include <unistd.h>
#include <string.h>
int main() {
    const int buff_size = 1024;
    char buff[buff_size];
    char p_1[] = "123";
    char p_2[] = "abc";
    printf("Enter secret password (%s):\n", p_1);
    memset(buff, 0, buff_size);
    read(1, buff, buff_size-2); // reading from STDOUT
    if ((strlen(buff) == strlen(p_1) + 1) && (memcmp(p_1, buff, strlen(p_1)) == 0)) {
        printf("Secret token: %s\n", p_2);
        return 0;
    } else {
        printf("Failed\n");
        return 1;
    }
}

我正在寻找黑客/解决方案,它允许我自动执行从 STDOUT 而不是 STDIN 读取数据的程序。

c linux fifo
2个回答
0
投票

你为什么要尝试从 STDOUT 读取?

为了实现你想要的,你只需要从 STDIN 读取,因为管道中进程的 STDOUT 就是你程序的 STDIN。同样的情况发生在:

your_program <<< "the input of your program"

the input of your program
将在 STDIN 上读取。


0
投票

看起来Linux下可以从文件描述符1读取。

您似乎做出了毫无根据的概括。显然,您所观察到的情况在某些情况下是可能的。然而,在其他情况下这绝对是不可能的,例如当标准输出连接到仅用于写入而打开的文件时,或者连接到甚至不支持读取的文件时,例如管道的写入端。

此外,尽管可能存在特殊情况(甚至是常见情况),其中您可以从

stdout
读取与从
stdin
读取的相同数据,但在 general 情况下,您不能期望
stdout 
产生与
stdin
相同的数据。一般来说,也不能安全地假设读取
stdout
会产生您的程序或任何其他程序写入同一文件的数据。它也不会产生任何数据。

如果没有用户参与,我无法执行它。例如:

echo "123" | ./stdout_as_stdin
./stdout_as_stdin < <(echo "123")

这一点也不奇怪。一般来说,

stdout
不等于
stdin
。其中一个或另一个已被重定向的情况特别有可能证明这一点。

当我换线时:

read(1, buff, buff_size-2); // reading from STDOUT

read(0, buff, buff_size-2); // reading from STDIN

输入重定向工作正常。

重定向在两种情况下都运行良好。您需要掌握的是,重定向表明您认为

stdout
可以安全地被视为
stdin
的别名的假设并不成立。

如何与其他 bash/python 脚本执行程序交互 没有用户参与所描述的场景?

希望读取标准输入上提供的数据的程序应该从其标准输入读取数据,而不是从其他任何地方读取。细节取决于编程语言等,但一般规则是通用的。对于想要支持来自管道或从文件重定向的输入的程序尤其如此,只要程序实际从其输入中读取,这些程序就可以在 Linux 上正常工作。

我正在寻找黑客/解决方案,它允许我自动执行从 STDOUT 而不是 STDIN 读取数据的程序。

这是一个考虑不周的想法,因为像您想要自动化的程序一开始就是考虑不周的。特别是对于一个也想将输出写入其

stdout

的程序(否则你可能只是将标准输入复制到标准输出上)。

要实现这样的功能,您需要将程序的标准输出连接到一个文件(广义上),该文件既提供所需的输入,又接受传递给它的输出。套接字或伪终端的客户端可以提供服务。然后,您需要从包装程序驱动它,该程序提供所需的输入并对输出执行某些操作。但我不确定你通过操纵这样的东西来证明什么。

© www.soinside.com 2019 - 2024. All rights reserved.