プログラムが端末で実行されていないことを確認する方法

プログラムが端末で実行されていないことを確認する方法

リバース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

関連情報