gpt4 book ai didi

Bash:欺骗程序认为 stdout 是一个交互式终端

转载 作者:行者123 更新时间:2023-11-29 08:54:05 33 4
gpt4 key购买 nike

我想通过管道运行程序的输出,但当它检测到 stdout 不是交互式 shell 时,它的行为显然有所不同。

我怎样才能像在正常情况下一样通过管道写入数据?

最佳答案

我假设程序将调用 glibc 函数 isatty() 来检查 stdout 是否是终端。这对于在终端或 ANSI 终端的其他功能(如光标定位或线条删除/重绘)上使用彩色输出的程序来说很常见。

您可以使用 LD_PRELOAD 环境变量来欺骗程序。 LD_PRELOAD 由 ELF 链接器处理,并告诉动态库应该在所有其他之前加载。使用此功能可以覆盖库函数,在您的例子中是 glibc 函数 isatty()。可以关注这个article例如。

我已经为你准备了一个例子:

首先创建文件libisatty.c:

/**
* Overrides the glibc function. Will always return true.
*
* Note: Although this should be ok for most applications it can
* lead to unwanted side effects. It depends on the question
* why the programm calls isatty()
*/
int isatty(int param) {
return 1;
}

并将其编译为共享库:

gcc -shared -o libisatty.so  libisatty.c

它应该构建良好。

现在是测试库的时候了。 :) 我使用命令 ls --color=auto 进行测试。 ls 调用 isatty() 来决定是否应该为其输出着色。如果输出被重定向到文件或管道,它不会被着色。您可以使用以下命令轻松测试它:

ls --color=auto        # should give you colorized output
ls --color=auto | cat # will give you monochrome output

现在我们将使用 LD_PRELOAD 环境变量再次尝试第二个命令:

LD_PRELOAD=./libisatty.so ls --color=auto | cat

您应该会看到彩色输出。

顺便说一句,很酷的用户名:uʍop ǝpısdn !!:D

关于Bash:欺骗程序认为 stdout 是一个交互式终端,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14690010/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com