确定stdout是否在ssh下终端

时间:2014-07-09 14:57:18

标签: perl ssh terminal stdout

要测试输出是否为终端,我们可以-t STDOUT

if (-t STDOUT) {
  # print with terminal control chars
} else {
  # just plain print
}

但是当脚本在ssh会话中执行而不是从终端运行时(在我的情况下是Jenkins),-t测试仍然返回true并且我的输出被控制字符污染了:

ssh user@server "/my/script.pl"

为什么-t检测到终端?

2 个答案:

答案 0 :(得分:1)

我不知道为什么 ssh正在为你分配一个终端 - 即使ssh的输出发送到终端,我默认不这样做 - 但是传递{{1 ssh将禁用远程端的伪tty创建。

-T

来自$ ssh -t localhost "perl -E'say -t STDOUT ?1:0'" 1 Connection to localhost closed. $ ssh -T localhost "perl -E'say -t STDOUT ?1:0'" 0 的手册页:

  

ssh禁用伪tty分配。

     

-T强制伪tty分配。这可以用来执行任意的          远程计算机上基于屏幕的程序,非常有用,          例如实现菜单服务时。多个-t选项强制tty          分配,即使ssh没有本地tty。

答案 1 :(得分:0)

如果你强迫ssh分配一个pty -

,也许会更好

来自ssh手册:

  

-t强制伪tty分配。这可用于执行任意基于屏幕的程序   在远程机器上,这可能非常有用,例如实现菜单服务时。   多个-t选项强制tty分配,即使ssh没有本地tty。

答案越长:-t(Perl或Bourne shell函数)可靠地检测流是否是“打字机”,但ssh通常只会分配一个伪电传(pty在交互式shell中流,而不是在其他程序启动时。

另请参阅RequestTTY中的.ssh/config选项。