2011-01-20 10 views
13

मानता है कि हमारे पास टर्मिनल पर चलने वाला खोल है, मान लें,/dev/pts/1। खोल पहले ही चल रहा है और हम इसे पुनरारंभ नहीं कर सकते हैं।लिनक्स: एक सी प्रोग्राम लिखें जो एक शेल

अब हम एक सी प्रोग्राम लिखना चाहते हैं जो खोल को 'नियंत्रित' करेगा, यानी उपयोगकर्ता को एक शेल-जैसे इंटरफ़ेस प्रदान करेगा, उपयोगकर्ता के इनपुट को पढ़ेगा, इसे वास्तविक शैल पर/dev/pts पर पास कर देगा/1, इसे निष्पादित करें, खोल के आउटपुट को पढ़ें और इसे वापस उपयोगकर्ता को प्रिंट करें।

मैं जानता हूँ कि इस कार्य के आधे कैसे करना है: मुझे पता है कि उपयोगकर्ता के इनपुट इकट्ठा होते हैं और 'असली खोल' को यह इनपुट सुई:

#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; 
} 

ऊपर अपने इनपुट में चल शेल के लिए पर पारित करेंगे टर्मिनल (अपना नाम पहले तर्क में दें) और खोल को निष्पादित करें। हालांकि, मुझे नहीं पता कि अब शैल के आउटपुट को कैसे पढ़ा जाए।

कोई सुझाव?

+2

क्या आपने टीटीआई से पढ़ने की कोशिश की? –

+19

क्या यह होमवर्क या रूटकिट है? – Kimvais

+1

@ किमवाइस अपने वर्तमान प्रारूप में, आपको इस शेल-ऑन-शैल के माध्यम से आदेशों को पारित करने के लिए इस प्रोग्राम को निष्पादित करना होगा - आपको रूटकिट लिखने के लिए केवल एक खोल को नियंत्रित करने से बहुत कुछ करना होगा। –

उत्तर

1

कृपया libpipeline पर एक नज़र डालें। शायद यह आपकी मदद करेगा ...

1

ऐसे प्रोग्राम हैं जो आपको प्रक्रिया के लिए नियंत्रण टर्मिनल बदलने की अनुमति देते हैं: reptyr और injcode ऐसे दो प्रोग्राम हैं।

मुझे विश्वास है कि वे अन्य टर्मिनल को अलग करते हैं, हालांकि, आपकी आवश्यकताओं के आधार पर यह ठीक से फिट हो सकता है या नहीं।

4

आप इसके लिए pipes का उपयोग कर सकते हैं। लिनक्स शैल पुनर्निर्देशन की अनुमति देते हैं।

मैंने टीटीएस को नियंत्रित करने के लिए पाइप का उपयोग किया।

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^