टर्मिनल पर कमांड चलाने के लिए C प्रोग्राम का उपयोग कैसे करें?


11

मैं सी भाषा में एक कार्यक्रम बनाना चाहता हूं जो मुझे टर्मिनल में एक कमांड चलाने की अनुमति देगा।

मैंने शेल स्क्रिप्ट में एक कार्यक्रम बनाया है जो मुझे अपने ब्राउज़र में खोली गई किसी भी वेबसाइट का आईपी देगा। इस शेल स्क्रिप्ट को टर्मिनल में इस कमांड को दर्ज करके निष्पादित किया जाता है:

sudo tcpdump -n dst port 80 -i eth

मेरे प्रोफेसर ने मुझे सी भाषा में एक कार्यक्रम बनाने के लिए कहा जो टर्मिनल को खोल देगा और इस कमांड में प्रवेश करेगा और फिर मेरी शेल स्क्रिप्ट काम करेगी।

कृपया मुझे बताएं कि इस तरह का कार्यक्रम कैसे बनाया जाए।

जवाबों:


8

आप कमांड चलाने के लिए stdlib.h में उपलब्ध सिस्टम () फ़ंक्शन का उपयोग कर सकते हैं ।

विवरण

सिस्टम () स्ट्रिंग में निर्दिष्ट कमांड को / बिन / श-सी स्ट्रिंग द्वारा निष्पादित करता है, और कमांड पूरा होने के बाद रिटर्न करता है। आदेश के निष्पादन के दौरान, SIGCHLD अवरुद्ध हो जाएगा, और SIGINT और SIGQUIT को नजरअंदाज कर दिया जाएगा।

आप इसके बारे में अधिक यहाँ पर पढ़ सकते हैं http://linux.about.com/library/cmd/blcmdl3_system.htm


यह निश्चित रूप से एक तरीका है, लेकिन आप शायद एसी प्रोग्राम से कमांड चलाना नहीं चाहते हैं, इसके बजाय, अधिकांश लिनक्स प्रोग्रामों में एक काम है जो सीधे प्रोग्राम के कोड को सीधे कर सकता है। उदाहरण के लिए ssh libssh का उपयोग कर सकता है । आमतौर पर कोड से सिस्टम कमांड चलाने के लिए एक बहुत ही सीमित कारण है। यदि आपका यह बहुत कुछ आपके निश्चित रूप से कुछ गलत कर रहा है।
coteyr

मैंने सी में इस तरह से एक कार्यक्रम बनाया
तहसीन मलिक

4

नमस्ते, मैं आपके लिए एक उदाहरण कोड लिखूंगा, इसे आपको समझाऊंगा और वास्तव में आशा करता हूं कि यह आपकी मदद करता है। फ़ंक्शन का प्रोटोटाइप कुछ इस तरह है:

int सिस्टम (const char * cmd);

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAX_CMN_LEN 100

int main(int argc, char *argv[])
{
    char cmd[MAX_CMN_LEN] = "", **p;

    if (argc < 2) /*no command specified*/
    {
        fprintf(stderr, "Usage: ./program_name terminal_command ...");
        exit(EXIT_FAILURE);
    }
    else
    {
        strcat(cmd, argv[1]);
        for (p = &argv[2]; *p; p++)
        {
            strcat(cmd, " ");
            strcat(cmd, *p);
        }
        system(cmd);
    }

    return 0;
}

1)। एक टर्मिनल खोलें और प्रोग्राम को संकलित करें

2)। इसे चलाएं (उदाहरण के लिए उबंटू में) ।/program_name comman_name -anything- कुछ भी

उदाहरण :/a.out लोकेल-ए

यह उदाहरण मेरे संकलक द्वारा समर्थित सभी स्थानों को प्रिंट करता है जो कि जीसीसी है।

और जानकारी:

p एक पॉइंटर टू पॉइंटर टू चार (जैसे- argv is) p = & argv [2] है,-पॉइंटिंग स्ट्रिंग i-cmthing कैट-ऑलथिंग्स टू माय सेम्ड स्ट्रिंग i लूप को तब छोड़ देता है जब * p पॉइंट इस पर नजर डालता है: -> मैं इस प्रतीक का उपयोग अंकों को कहने के लिए करूँगा (न ही इसे सही तीर चयन ऑपरेटर के साथ भ्रमित करें)।

argv [0] -> program_name

argv [1] -> command_name (इस उदाहरण में कमांड का नाम लोकेल होगा, लेकिन इसके बजाय आप जो चेक करना चाहते हैं उसे दर्ज करें)

argv [2] -> -इसमें (इस उदाहरण में -a, जो सभी स्थानों पर है)

argv [3] -> NULL (इस उदाहरण में, यह लूप को छोड़ता है)

ठीक है, मुझे लगता है।


सुनिश्चित करें कि आप इसे एक सेट्युइड निष्पादन योग्य के रूप में उपयोग नहीं करते हैं, क्योंकि इसमें एक स्पष्ट बफर-ओवरफ़्लो शोषण है।
मार्टिन

0

मैं मानने जा रहा हूं कि यह केवल मनमानी कमांड निष्पादन के बजाय सुडो को बदलने के लिए एक सेट्यूइड-रूट बाइनरी का उपयोग करने के बारे में है, इसलिए मैं समाधान के अन्य हिस्सों को शामिल करने जा रहा हूं।

सुरक्षा मामले के रूप में, हम सिस्टम () से बचते हैं क्योंकि इसे अपहृत किया जा सकता है।

इसे संकलित करने के बाद, परिणामी बाइनरी को सेटुइड-रूट के रूप में स्थापित करें।

# अलग करें <unistd.h>
# किंकर्तव्यविमूढ़ <stdio.h>
#include <sysexits.h>

int main (int argc, char ** argv) {
    if (argc> 2) {fputs ("बहुत सारे args \ n", stderr); वापसी EX_USAGE; }
    if (argc> 1 && argv [1] [0] == - ') {fputs ("कोई विकल्प नहीं \ n", stderr); वापसी EX_USAGE; }
    if (geteuid ()! = 0) {fputs ("setuid-root \ n", stderr के रूप में सही ढंग से स्थापित नहीं); वापसी EX_UNAVAILABLE; }
    if (सेतुइड (0) 1) p [6] = argv [1];

    / * यदि सब ठीक हो जाता है, तो निष्फल रिटर्न नहीं आएगा
     * (क्योंकि यह कार्यक्रम tcpdump द्वारा प्रतिस्थापित किया गया होगा) * /
    execv (पी 0, पी);
    / * यदि हम यहाँ तक पहुँचते हैं तो निष्फल विफल होना चाहिए * /

    perror (p0);
    वापसी EX_OSFILE;
}

यदि आपने इसे सहेज लिया है foo.c, और चाहते हैं कि इसे इंस्टॉल किया जाए /usr/local/sbin/foo, तो चलाएं:

foo && install -o root -m 4511 foo / usr / स्थानीय / sbin / फू
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.