2011-01-20 10 views
13

Supponiamo di avere una shell in esecuzione sul terminale, diciamo,/dev/pts/1. La shell è già in esecuzione e non possiamo riavviarla.Linux: scrivere un programma C che controlli una shell

Ora vogliamo scrivere un programma C che "controllerà" la shell, cioè che fornirà all'utente un'interfaccia simile a una shell, leggerà l'input dell'utente, passerà alla shell reale su/dev/pts/1, è necessario eseguirlo, leggere l'output della shell e stamparlo nuovamente all'utente.

so come fare la metà di questo compito: io so come raccogliere l'input dell'utente e iniettare questo ingresso al 'shell reale':

#include <fcntl.h> 
#include <sys/ioctl.h> 
#include <stdio.h> 

#define SIZE 100 

int main(int argc, char** argv) 
{ 
if(argc>1) 
    { 
    int tty = open(argv[1], O_WRONLY|O_NONBLOCK); 

    if(tty!=-1) 
    { 
    char *buf,buffer[SIZE+1]; 

    while(1) 
     { 
     printf("> "); 
     fgets(buffer, SIZE, stdin); 
     if(buffer[0]=='q' && buffer[1]=='u' && buffer[2]=='i' && buffer[3]=='t') break; 
     for(buf=buffer; *buf!='\0'; buf++) ioctl(tty, TIOCSTI, buf); 
     } 

    close(tty); 
    } 
    else printf("Failed to open terminal %s\n", argv[1]); 
    } 

return 0; 
} 

È possibile che questo passerà sul vostro ingresso a sborsare in esecuzione in terminale (date il suo nome nel primo argomento) e fate in modo che lo shell lo esegua. Tuttavia, non so come leggere l'output della shell ora.

Qualche consiglio?

+2

Hai provato a leggere dal tty? –

+19

Sono questi compiti o rootkit? – Kimvais

+1

@Kimvais Nel suo formato corrente, dovresti eseguire questo programma per passare i comandi attraverso questa shell-on-shell - dovresti fare molto di più che controllare semplicemente una shell per scrivere un rootkit. –

risposta

1

per favore dare un'occhiata a libpipeline. forse questo ti aiuterà ...

1

Ci sono programmi che ti permettono di cambiare il terminale di controllo per un processo: reptyr e injcode sono due di questi programmi.

Credo che interrompano l'altro terminale, tuttavia, a seconda delle esigenze, questo potrebbe o non potrebbe corrispondere esattamente.

4

È possibile utilizzare pipes per quello. Le shell Linux consentono il reindirizzamento.

Ho usato i tubi per controllare i tty.

Problemi correlati