リバース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
私のシステムではioctl
TCGETSがありますが、これは明らかなので、かなり一般的だと思います。
$ : | strace -e ioctl su
ioctl(0, TCGETS, 0x7ffff32dfc50) = -1 ENOTTY (Inappropriate ioctl for device)
su: must be run from a terminal