Existe uma maneira de descobrir se a saída de um script está sendo passada para eval?

2

Estou tentando descobrir se a saída de um programa / script está sendo passada para o eval, especialmente em scripts bash.

Por exemplo, posso distinguir:

$ ./program.sh

de

$ eval "$(./program.sh)"

dentro do programa.sh? Este último imprimiria as variáveis de ambiente a serem avaliadas, enquanto o primeiro não.

Isso me pouparia de desenvolver um ./program.sh print-env para passar para eval.

Por outro lado, posso ver que, possivelmente, isso possibilita a criação de software mal-intencionado que é executado de maneira diferente quando a saída é passada para eval . Pensamentos?

    
por Ahmet Alp Balkan 12.10.2017 / 20:31

1 resposta

2

Em:

eval "$(./program.sh)"

O shell executaria ./program.sh com seu stdout redirecionado para um pipe, e no outro extremo do pipe iria ler essa saída na memória. E então, uma vez que ./program/sh tenha desaparecido (fazendo com que eof seja visto naquele canal e o subsequente wait() feito pela maioria do shell no processo retorne), esse conteúdo salvo, menos o caractere de nova linha à direita, seria passado para eval .

Portanto, para ./program.sh detectar essa situação, seria necessário:

  1. detecta que sua stdout é um pipe. Isso é fácil. No Linux, isso poderia estar com [ -p /dev/stdout ] .
  2. que é um processo de shell que está lendo na outra extremidade desse pipe. Isso se torna mais complicado. No Linux com um lsof recente, você poderia procurar na saída de lsof +E -Fca -ap "$$" -d 1 para um processo cujo nome termina com sh que tem o canal aberto para leitura em um fd acima de 10.
  3. Em seguida, você precisaria determinar que esse processo de shell está interpretando atualmente uma linha de comando eval something . Para isso, você provavelmente precisará anexar um depurador a esse shell e entender as estruturas de dados internas desse shell específico para ver qual comando está realmente em execução.

Em suma, você não pode. Mas talvez você possa se contentar em dar uma saída diferente quando a saída vai para um tty e quando não, o que deve ser apenas uma questão de:

if [ -t 1 ]; then
  echo output for tty
else
  echo output for something else
fi
    
por 12.10.2017 / 21:03

Tags