如何检测程序是否不是从终端运行

如何检测程序是否不是从终端运行

如果我正在运行反向 TCP shell 并尝试运行 su,我会收到以下消息:

su: must be run from a terminal

我想在我自己的程序中模拟这种行为,并且想知道如何检测程序是否正在从终端运行?

答案1

在 shell 脚本中:

if [ -t 0 ]; then
  echo stdin is a terminal
fi

perl脚本中:

print "stdin is a terminal\n" if -t;

在C中:

if (isatty(0)) puts("stdin is a terminal");

它们都执行相同的操作,执行特定于 tty 的操作ioctl并返回 true,除非ioctl失败并出现 ENOTTY 错误。在我的系统上,ioctl是 TCGETS,我相信它相当常见,因为它是显而易见的。

$ : | strace -e ioctl su
ioctl(0, TCGETS, 0x7ffff32dfc50) = -1 ENOTTY (Inappropriate ioctl for device)
su: must be run from a terminal

相关内容