Suppongo che il programma chiamerà la funzione glibc isatty()
per verificare se stdout è un terminale o meno. Questo è comune per i programmi che utilizzano l'output colorato sui terminali o altre funzionalità di un terminale ANSI come il posizionamento del cursore o la cancellazione/ridisegno della linea.
È possibile ingannare il programma utilizzando la variabile di ambiente LD_PRELOAD. LD_PRELOAD è gestito dal linker ELF e indica che una libreria dinamica deve essere caricata prima di tutti gli altri. Usando questa funzione è possibile sovrascrivere le funzioni della libreria, nel tuo caso la funzione glibc isatty()
. È possibile seguire questo article per esempio.
ho preparato un esempio per voi:
Innanzitutto creare il file libisatty.c:
/**
* Overrides the glibc function. Will always return true.
*
* Note: Although this should be ok for most applications it can
* lead to unwanted side effects. It depends on the question
* why the programm calls isatty()
*/
int isatty(int param) {
return 1;
}
e compilare come un lib comune:
gcc -shared -o libisatty.so libisatty.c
E ' dovrebbe costruire bene.
Ora è il momento di testare la libreria. :) Ho usato il comando ls --color=auto
per i test. ls
chiama isatty()
per decidere se colorarlo o meno. Se l'output viene reindirizzato a un file o a una pipe, non verrà colorato. È possibile verificare questo facilmente utilizzando i seguenti comandi:
ls --color=auto # should give you colorized output
ls --color=auto | cat # will give you monochrome output
Ora cercheremo il secondo comando ancora una volta utilizzando l'ambiente LD_PRELOAD var:
LD_PRELOAD=./libisatty.so ls --color=auto | cat
Dovreste visualizzare un output colorato.
btw fresco usename: uʍop ǝpısdn !!: D
ho sentito ' expect' è un buon programma per farlo – BeniBela
Controlla anche il programma 'script' per quello scopo: http://stackoverflow.com/a/1402389/516188 –