默认情况下,某些程序会根据它们写入的流类型格式化其输出。例如,ls
和 ls > file
的输出看起来不同。我想知道程序是如何实现这一点的。此外,是否有一种方法可以欺骗这样的程序,使其认为输出流是一个终端,而实际上它是一个文件(特别是当它们没有任何影响输出格式的选项时)?
默认情况下,某些程序会根据它们写入的流类型格式化其输出。例如,ls
和 ls > file
的输出看起来不同。我想知道程序是如何实现这一点的。此外,是否有一种方法可以欺骗这样的程序,使其认为输出流是一个终端,而实际上它是一个文件(特别是当它们没有任何影响输出格式的选项时)?
通过isatty
:
if (!isatty(fileno(stdout))
{
// redirected to a file or piped to a process
}
一个欺骗的方法是,不要使用重定向,而是启动脚本
。现在所有进入“tty”的内容(包括您键入的标准输入和发送到输出的内容)都被发送到一个名为typescript的文件中。
这些程序使用isatty(fileno(stdout))
来检查它们是否正在写入TTY(终端)或其他内容(例如管道)。
关于伪造TTY,请参阅Trick an application into thinking its stdin is interactive, not a pipe