টার্মিনালে কমান্ড চালানোর জন্য সি প্রোগ্রাম ব্যবহার করবেন কীভাবে?


11

আমি সি ভাষায় একটি প্রোগ্রাম তৈরি করতে চাই যা আমাকে টার্মিনালে একটি কমান্ড চালানোর অনুমতি দেয়।

আমি শেল স্ক্রিপ্টে একটি প্রোগ্রাম তৈরি করেছি যা আমার ব্রাউজারে খোলা যে কোনও ওয়েবসাইটের আইপি দেবে। টার্মিনালে এই কমান্ডটি প্রবেশ করে এই শেল স্ক্রিপ্টটি কার্যকর করা হয়:

sudo tcpdump -n dst port 80 -i eth

আমার অধ্যাপক আমাকে সি ভাষায় একটি প্রোগ্রাম তৈরি করতে বলেছেন যা টার্মিনালটি খুলবে এবং এই কমান্ডটি প্রবেশ করবে এবং তারপরে আমার শেল স্ক্রিপ্টটি কাজ করবে।

দয়া করে আমাকে বলুন কীভাবে এই জাতীয় প্রোগ্রাম তৈরি করবেন।

উত্তর:


8

আপনি কমান্ড চালানোর জন্য stdlib.h এ উপলব্ধ সিস্টেম () ফাংশনটি ব্যবহার করতে পারেন ।

বর্ণনা

সিস্টেম () স্ট্রিংয়ে নির্দিষ্ট একটি কমান্ড কার্যকর করে / bin / sh -c স্ট্রিং কল করে এবং কমান্ডটি শেষ হওয়ার পরে ফিরে আসে। কমান্ডটি কার্যকর করার সময়, SIGCHLD ব্লক করা হবে এবং সাইন ইন এবং সাইনকিউটি উপেক্ষা করা হবে।

আপনি এখানে এটি সম্পর্কে আরও পড়তে পারেন http://linux.about.com/library/Cmd/blcmdl3_system.htm


এটি অবশ্যই একটি উপায়, তবে আপনি সম্ভবত এসি প্রোগ্রাম থেকে কমান্ডগুলি পরিচালনা করতে চান না, পরিবর্তে, বেশিরভাগ লিনাক্স প্রোগ্রামগুলির একটি লিব থাকে যা কেবল প্রোগ্রামগুলির কোড সরাসরি করতে পারে। উদাহরণস্বরূপ ssh libssh ব্যবহার করতে পারে । কোড থেকে সিস্টেম কমান্ড চালানোর জন্য একটি খুব সীমিত কারণ রয়েছে। যদি আপনি এটি বেশ কিছু করে চলেছেন তবে আপনার অবশ্যই কিছু ভুল হচ্ছে।
কোটায়ার

আমি সি তে
এইভাবে

4

হ্যালো আমি আপনার জন্য একটি উদাহরণ কোড লিখব, এটি আপনাকে ব্যাখ্যা করব এবং সত্যই আশা করি এটি আপনাকে সহায়তা করবে। ফাংশনটির প্রোটোটাইপ হ'ল কিছু:

ইন্ট সিস্টেম (কনস্ট চর * সেন্টিমিটার);

#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)। এটি চালান (উদাহরণস্বরূপ উবুন্টু)। / প্রোগ্রাম_নাম কম্যান_নাম - যে কোনও কিছু - কিছু

উদাহরণ: ./a.out লোকাল -a

এই উদাহরণটি আমার কম্পাইলার দ্বারা সমর্থিত সমস্ত লোকেল প্রিন্ট করে যা জিসিসি।

অধিক তথ্য:

পিটি চরকে নির্দেশ করার জন্য একটি পাইনিটার (যেমন আরআরভিটি হ'ল) ​​পি = এবং আরজিভি [২], আমার সিএমডি স্ট্রিংয়ের জন্য বিড়ালের সমস্ত বিড়ালকে নির্দেশ করে আমি লুপটি প্রস্থান করি যখন * পি এই দিকে তাকান: আমি এই চিহ্নটি পয়েন্টগুলি বলতে ব্যবহার করব (ডান তীর নির্বাচন অপারেটরের সাথে এটি বিভ্রান্ত করবেন না)।

আরজিভি [0] -> প্রোগ্রাম_নাম

argv [1] -> কমান্ড_নাম (এই উদাহরণে কমান্ডের নাম স্থানীয় হবে, তবে পরিবর্তে আপনি যে আদেশটি পরীক্ষা করতে চান তা লিখুন)

আরজিভি [২] -> -আপনি কিছুই না (এই উদাহরণে -a, যা সমস্ত স্থানীয় অবস্থান)

argv [3] -> নুল (এই উদাহরণে, এটি লুপটি ছেড়ে দেয়)

ঠিক আছে, আমি মনে করি।


নিশ্চিত করুন যে আপনি এটি সেটুইড এক্সিকিউটেবল হিসাবে ব্যবহার করবেন না, কারণ এটির একটি স্পষ্ট বাফার-ওভারফ্লো শোষণ রয়েছে।
মার্টিন

0

আমি ধরে নিচ্ছি যে এটি একটি নির্ধারিত-কমান্ড প্রয়োগের পরিবর্তে সুডো প্রতিস্থাপনের জন্য একটি সেটুইড-রুট বাইনারি ব্যবহার করার বিষয়ে, তাই আমি সমাধানের অন্যান্য অংশগুলিও অন্তর্ভুক্ত করব।

সুরক্ষা বিষয় হিসাবে, আমরা সিস্টেম এড়িয়ে চলি () কারণ এটি হাইজ্যাক করা যেতে পারে।

এটি সংকলনের পরে, ফলাফল বাইনারি সেটুইড-রুট হিসাবে ইনস্টল করুন।

# অন্তর্ভুক্ত <unistd.h>
# অন্তর্ভুক্ত <stdio.h>
# অন্তর্ভুক্ত <sysexits.h>

int প্রধান (int argc, চর ** আরজিভি) {
    if (argc> 2) {fputs ("অনেক বেশি আর্গ; n", স্টডার); EX_USAGE প্রত্যাবর্তন করুন; }
    যদি (আরজিসি> 1 && আরগভি [1] [0] == '-') p ফপুটস ("কোনও বিকল্প অনুমোদিত নয় \ n", স্ট্যাডার); EX_USAGE প্রত্যাবর্তন করুন; }
    if (geteuid ()! = 0) p fputs ("setuid-root হিসাবে সঠিকভাবে ইনস্টল করা হয়নি st n", স্ট্যাডার); EX_UNAVAILABLE ফেরত দিন; }
    যদি (সেটুইড (0) 1) পি [6] = আরজিভি [1];

    / * সব ঠিকঠাক থাকলে এক্সিকিউভ ফিরে আসবে না
     * (কারণ এই প্রোগ্রামটি টিসিপিডাম্প দ্বারা প্রতিস্থাপন করা হবে) * /
    এক্সিকিউ (পি 0, পি);
    / * যদি আমরা এখানে পৌঁছে যাই তবে এক্সিকিউভ অবশ্যই ব্যর্থ হয়েছে * /

    perror (p0);
    EX_OSFILE ফেরত দিন;
}

আপনি যদি এটি হিসাবে সংরক্ষণ করে থাকেন foo.cএবং এটি ইনস্টল করতে চান তবে /usr/local/sbin/fooচালান:

foo তৈরি করুন & ইনস্টল করুন-ম রুট-মি 4511 foo / usr / স্থানীয় / sbin / foo
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.