Como detectar se um programa não é executado a partir de um terminal

5

Se eu estiver executando um shell TCP reverso e tentar executar o su, recebo a seguinte mensagem:

su: must be run from a terminal

Gostaria de emular esse comportamento em meu próprio programa e estou me perguntando como posso detectar se um programa está sendo executado a partir de um terminal?

    
por amccormack 21.03.2013 / 18:36

1 resposta

7

Em um script de shell:

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

Em um script perl :

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

Em C:

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

Todos eles fazem o mesmo, fazem um tty específico ioctl e retornam true a menos que o ioctl falhe com um erro ENOTTY. No meu sistema, o ioctl é TCGETS e acredito que seja bastante comum, pois é óbvio.

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

Tags