我想运行通过管道程序的输出,但它显然具有不同的行为,当它检测到stdout
不是一个交互的shell。
我怎么可以欺骗成通过管道,就像它在常规情况下,写什么呢?
我想运行通过管道程序的输出,但它显然具有不同的行为,当它检测到stdout
不是一个交互的shell。
我怎么可以欺骗成通过管道,就像它在常规情况下,写什么呢?
我认为程序将调用的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
使用script
为我工作:
script outputfile.txt yourcommand
# any output ends up in outputfile.txt
您可以使用它来管我猜:
script out.txt yourcommand ; cat out.txt | nextcommand
你可能想试试这个:
./script.sh < `tty` > output
如果程序做这样的事情isatty(0)
这可能是不够的。