击:招程序到标准输出的思维是一个交互式终端(Bash: trick program into thi

2019-07-19 05:23发布

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

我怎么可以欺骗成通过管道,就像它在常规情况下,写什么呢?

Answer 1:

我认为程序将调用的glibc函数isatty()检查标准输出是否是终端或没有。 这是常见的用于使用上的ANSI终端等光标定位或线擦除/重画的终端或其它特征彩色输出的程序。

你就可以欺骗使用LD_PRELOAD环境变量的程序。 LD_PRELOAD由ELF连接处理,并告知一个动态库都应该别人面前装。 使用此功能就可以覆盖库函数,你的情况glibc的函数isatty() 。 您可以按照本文的例子。

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

首先创建文件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环境VAR:

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

你应该看到彩色输出。

BTW酷用户名:uʍopǝpısdn!!:d



Answer 2:

使用script为我工作:

script outputfile.txt yourcommand
# any output ends up in outputfile.txt

您可以使用它来管我猜:

script out.txt yourcommand ; cat out.txt | nextcommand


Answer 3:

你可能想试试这个:

./script.sh < `tty` > output

如果程序做这样的事情isatty(0)这可能是不够的。



文章来源: Bash: trick program into thinking stdout is an interactive terminal
标签: bash shell pipe