将描述符标记为 -t 测试的终端

将描述符标记为 -t 测试的终端

可以使用 -t test 测试描述符是否连接到终端。

if [ ! -t 0 ]; then
    echo "Stdin is not from terminal"
fi

有一个描述符 X,指向一个文件或一个进程(使用 >(cmd) 重定向),是否可以使其看起来像终端?为了通过测试 -t ?

答案1

而不是>(cmd),假设它是cmd您希望成为 tty 而不是管道的标准输入,您可以尝试使用:

>(socat -u - exec:'cmd',pty)

socat将使用伪 tty 对并将cmd的 stdin 连接到从属部分([ -t 0 ]然后返回 true)。

伪终端将置于原始模式,因此线路规则不应干扰数据,因此在这方面它或多或少相当于管道。

然而,伪终端不能像管道那样仅在一端关闭。所以,socat不能说cmd没有更多的输入。相反,socat在 的 stdin 到达文件末尾后,socat将等待一段时间并销毁伪 tty,这通常意味着cmd收到 SIGHUP。

如果您的命令需要更长的时间来处理数据,或者在开始执行任何操作之前等待标准输入上的文件结尾,则该命令将无法正常工作。

答案2

test命令运行isatty(fd)以检查描述符是否与 TTY 相关。

isatty(3)是一个 C 库函数,用于检查文件描述符是否允许ioctl(2)向该描述符发送终端调用。

LD_PRELOAD=因此,除非您使用覆盖isatty()shell 中的函数,否则您无法伪造结果。

相关内容