프로그램이 터미널에서 실행되고 있지 않은지 확인하는 방법

프로그램이 터미널에서 실행되고 있지 않은지 확인하는 방법

역방향 TCP 셸을 실행하고 su를 실행하려고 하면 다음 메시지가 표시됩니다.

su: must be run from a terminal

내 프로그램에서 이 동작을 시뮬레이션하고 싶고 프로그램이 터미널에서 실행되고 있는지 감지하는 방법을 알고 싶습니다.

답변1

쉘 스크립트에서:

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 관련 작업을 수행하며 ENOTTY 오류로 실패 ioctl하지 않는 한 true를 반환합니다 . ioctl내 시스템에서는 ioctlTCGETS가 있는데, 이는 명백하기 때문에 상당히 일반적이라고 생각합니다.

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

관련 정보