如果我正在运行反向 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